Растеризация B-сплайнами поверхности

Тема в разделе "WASM.A&O", создана пользователем Aloner, 27 окт 2008.

  1. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Подскажите как можно наиболее быстро растеризовать поверхность, заданную B-сплайнами, чтобы не нарушалась ее целостность (не было пропусков пикселей внутри поверхности). Ели делать это лобовым методом, то есть просчётом по формуле с маленьким шагом, то получается слишком медленно и нерационально (так как некоторые точки прорисовываются многократно)?
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Стандартный подход разбивать поверхности на треугольники приемлемо малого размера и считать только их вершины, а заливку треугольников интерполировать по цвету вершин. Если это делать через ДХ или ОГЛ то отрисовку треугольников аппаратный ускоритель видеокарты подхватит.
     
  3. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Спасибо!
    Я тоже об этом подумывал, но хотелось бы без триангуляции обойтись.
     
  4. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Может кто нить знает как тогда подобрать оптимальные шаги по параметрам (u,v) (u,v принадлежат [0,1]), что бы не было разрывов?
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Aloner
    Длина от начальной точки до конечной умноженная на 2.
     
  6. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Спасибо!
    А можешь обьяснить из каких соображений это вытекает?
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Aloner
    Ты хочешь быстро или точно?
    Вытикает это из того, что прямая должна разбиваться ровна на длину L в пикселях.
    Если взять пол окружности то pi*L/2=1.57*L . Ясно что может быть и больше. Просто в одной статье применялось 2. Я лично брал бы по больше 3 или даже 4, чтобы покрыть как можно больше случаев. Но за частую это излишне и хватает 2.

    Если хочешь делать точно, то делай по правилам через рекурсивное разбиение.
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Pavia
    С В-сплайнами не игрался, только с кривой Безье (частный случай В-сплайна). И у неё расстояние между получаемыми точками зависит и от шага параметра и от кривизны участка кривой. Т.е. в сегменте окружности фиксированный шаг параметра даст равномерное расположение точек на кривой, а в общем случае при фиксированном шаге будет "где густо, где пусто".

    Aloner
    Я тогда остановился на варианте с интерполяцией через ломаную, получилось вполне прилично, так что по прежнему советую триангуляцию. Хотя мимоходом видел упоминания алгоритмов сгущения узлов на В-сплайнах, якобы позволяющих сопоставить узлы пикселам, но в чём они заключаются и позволяют ли в общем случае добиться равномерности сгущаемых узлов не нашёл.

    add:
    Ещё можно попробовать шагать достаточно мелким шагом, чтобы кривизна менялась незначительно, считать полученное расстояние между точками и если оно меньше пиксела, увеличивать шаг, а если больше то уменьшать шаг во столько раз, сколько пикселов в нём поместилось, с поправкой на кривизу, или мельчить этот шаг методом деления пополам до размеров пикселя.
     
  9. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Ух, сколько написали пока меня не было :))
    Спасибо всем!
    Подумал тут на досуге, решил что все таки триангуляцию буду применять и перейду к NURBS,то есть добавлю веса для узлов B-сплайна.
    Кстати, может кто в курсе как найти пересечение прямой и NURBS?
     
  10. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Для растеризации может подойти алгоритм плавающего горизонта.
     
  11. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    ИМХО точек пересечения прямой и NURBS может быть несколько сотентысяч :).
    если считать каждую точку NURBS вручную, то можно проверять пересечение каждого NURBS-отрезка прямой.

    P.S. поправил.