рендеринг сглаженной спирали - PullRequest
1 голос
/ 09 апреля 2010

Я посмотрел на этот пример, используя php и GD для кусочной визуализации спирали с маленькими дугами. То, что я хотел бы сделать, это сделать аппроксимацию спирали, которая является математически точной, насколько это возможно.

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

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

В этом случае качество рендеринга важнее, чем время рендеринга. Однако оценка интеграла для каждого пикселя кажется мне довольно неэффективной.

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

Ответы [ 2 ]

1 голос
/ 09 апреля 2010

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

Нет, это довольно необычная функция; только в последнее время рисунок со спиралями стал популярным.

Код, который использует для этого Inkscape: Spiro . В основном это Python, и он может использовать Каир для рендеринга безье, в которое аппроксимируются спирали.

Однако оценка интеграла в каждом пикселе кажется мне довольно неэффективной.

Да, действительно.

1 голос
/ 09 апреля 2010

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

[EDIT]: первое приближение к этому (сделано с Tcl / Tk, но код должен быть легко конвертируемым) дает мне следующее:

# Make the list of spiral coordinates
set coords {}          
set theta 0; set r 10
set centerX 200; set centerY 150
# Go out 50 pixels per revolution
set pitch [expr {100.0 / 720.0}]
for {set i 0} {$i<720} {incr i} {
    lappend coords [expr { $centerX + $r*sin($theta) }] \
                   [expr { $centerY + $r*cos($theta) }]
    set r     [expr { $r + $pitch }]
    # Increment angle by one degree
    set theta [expr { $theta + 3.1415927/180 }]
}

# Display as a spline
pack [canvas .c -width 400 -height 300]
.c create line $coords -tag spiral -smooth 1

Я не приложил никаких усилий, чтобы эффективно использовать контрольные точки.

...