Сплайны

Тема в разделе "WASM.A&O", создана пользователем Max, 31 мар 2005.

  1. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    Есть такая задачка:

    Имеется набор 3D точек (x,y,z) и их триангуляция.

    Эту триангуляцию рассекают набором горизонтальных плоскостей (z=const), в результате получаем набор изолиний и изоконтуров для каждого z=(z1,...,zn).

    (представьте, что строится карта скажем температур для нашей необъятной родины)



    теперь хочется _красиво_ отобразить все это дело на 2D карте.

    можно конечно просто отрисовать все полученный изолинии/изоконтуры через Polyline, но получается угловато.



    посему хочется прикрутить сюда какие нибудь кривые (типа Безье или еще кого).

    и вот тут меня мучает вопрос - как сделать так, чтобы при аппроксимации изолиний кривыми и их отрисовке они не наползали друг на друга?

    кто знает, подскажите в какую сторону вообще копать, т.к. с кривыми никогда не работал :dntknw:
     
  2. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Max





    Поясни пожалуйста что значит "не наползали друг на друга". В смысле получившаяся кривая не должна пересекать саму себя?
     
  3. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    Stiver

    В смысле получившаяся кривая не должна пересекать саму себя?



    нее, не то.

    если говорить о карте высот, то есть две соседних изолинии, скажем 100 и 200 метров (каждая из них представлена набором точек).



    при отрисовке изолинии сплайном, этот сплайн будет проходить между двумя соседними точками не по прямой (иначе получится отрезок), а с некоторым изгибом (на то они и сплайны).

    величина этого "изгиба" задается коэффициентами сплайна.

    так вот, может получиться такой "изгиб", что он налезет на проходящую рядом (соседнюю) изолинию.
     
  4. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Max





    Общего решения скорее всего не существует. Можно делать "вручную": взять tension splines и при пересечении увеличивать натяжение пока не станет красиво. Можно локально увеличить количество точек. На самом деле не думаю, что вероятность пересечения такая уж большая: у проходящих рядом сплайнов будут похожие характеристики(коэффициенты), а значит и изгибаться они будут одинаково.
     
  5. bsl_zcs

    bsl_zcs New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2003
    Сообщения:
    17
    Адрес:
    Karaganda, Kazakhstan
    Max



    Может тебе попытаться избавиться от угловатости этапом раньше? Углы появляются в точках разреза рёбер, режешь ты по глубине, а глубина по треугольнику интерполируется линейно, так что эту угловатость можно считать артефактом линейной интерполяции. Очевидно, если сгладить исходный меш, то и углов должно стать меньше.



    Допускает ли твоя задача приведение к плоскому растру? В таком случае, можно было бы получить два преимущества: во-первых, вместо сложных алгоритмов построения сплайна по базовому каркасу в 3д (если они вообще такие есть, пригодные для твоего случая) использовать значительно более простые алгоритмы построения карты высот, и, во-вторых, можно было бы выбирать детализацию исходя из физического размера изображения, а, при желании, довести масштаб до попиксельного и вообще отказаться от выделения контуров в виде координат точек - сразу использовать полученный растр для отрисовки.