2010-04-09 3 views
1

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

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

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

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

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

ответ

1

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

[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 

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

+0

@kostmo: попробуйте этот обновленный ответ. Вам, вероятно, придется адаптироваться, поскольку я не уверен, на каком языке вы хотите внедрить, но расчеты точки остаются неизменными. Математика - это математика ... –

1

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

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

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

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

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

+0

Я загрузил код на Spiro, который, кажется, находится на C. Однако подход безье звучит как правильный путь, и я могу сделать это из PyCairo. – kostmo