2012-01-17 7 views
-1

Мне интересно, может ли кто-нибудь здесь помочь мне с каким-то псевдокодом или по крайней мере указать мне в правильном направлении, как рисовать сегмент круга без сглаживания.Рисование сегмента круга

ответ

1

Формула для точек на окружности являются:

x = xcenter + radius * sin(theta) 
y = ycenter + radius * cos(theta) 

, где xcenter и ycenter являются центром окружности, radius радиус и theta угол.

Вы просто должны перебирать theta от вашего стартового угла вашего конечного угла в достаточно небольших шагов, и извлекать значения x и y для черчения, и иметь в виду, что большинство тригонометрические функции принимают свои аргументы как радианах (0 через 2 * PI), а не градусов (от 0 до 360) - отрегулируйте начальный и конечный углы и ваш theta шаг, чтобы принять это во внимание.

Псевдо-код будет что-то вроде следующего:

def plotCirle (xc, yc, rad, start, end): 
    theta = start 
    while theta <= end: 
     x = xc + rad * sin (theta) 
     y = yc + rad * cos (theta) 
     plot (x, y) 
     theta = theta + 0.01 

хотя вы, вероятно, хотите, чтобы нормализовать углы в диапазоне от 0 до 2 * PI, а затем поменять местами начальный и конечный углы, если бывший больше, чем последний.

Если вы хотите более эффективный код, вы можете посмотреть midpoint circle algorithm. Математика тяжелее, и это немного усложняется тем требованием, что вам нужен только сегмент (это означает, что вам нужно знать угол, что обычно не требуется для этого алгоритма с полным кругом), но это может быть хорошей отправной точкой, если упрощенный алгоритм выше не достаточно быстрый.

+0

Спасибо, что получилось. Но существует ли целочисленная математическая версия только этого алгоритма? – Mattivc

+0

Вы можете работать с целыми числами, если хотите, но стандартные триггеры будут ожидать значения с плавающей запятой. Я создал целочисленные функции триггера, прежде чем использовать масштабированные значения (0-360 станет 0-3600) и таблицы поиска для значений, но это было в мои старые времена во встроенном пространстве, когда эти функции были намного более дорогостоящими с течением времени. Существуют также более эффективные алгоритмы рисования круга (посмотрите на бресенхам или средний круг), но для этого требуется больше математики, чем я могу с комфортом вписаться в ответ. – paxdiablo

+0

'plot (int (x), int (y))' –

0

Для рисования круглого круга с целым числом см. Статью midpoint circle algorithm wikipedia. Он представляет, с кодом, своего рода круг-вариант линейного алгоритма Брешенема. См. codecircle для сравнения (с кодами) алгоритма окружности окружности, алгоритма круга Брешенема и оптимизированного третьего метода.

0
Result.X := Round(fCenter.X + cos(Angle/180*pi)* Radius); 
Result.Y := Round(fCenter.Y + sin(Angle/180*pi)* Radius); 
+0

Пожалуйста, объясните, как это отвечает на вопрос. –

Смежные вопросы