Мне интересно, может ли кто-нибудь здесь помочь мне с каким-то псевдокодом или по крайней мере указать мне в правильном направлении, как рисовать сегмент круга без сглаживания.Рисование сегмента круга
ответ
Формула для точек на окружности являются:
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. Математика тяжелее, и это немного усложняется тем требованием, что вам нужен только сегмент (это означает, что вам нужно знать угол, что обычно не требуется для этого алгоритма с полным кругом), но это может быть хорошей отправной точкой, если упрощенный алгоритм выше не достаточно быстрый.
Для рисования круглого круга с целым числом см. Статью midpoint circle algorithm wikipedia. Он представляет, с кодом, своего рода круг-вариант линейного алгоритма Брешенема. См. codecircle для сравнения (с кодами) алгоритма окружности окружности, алгоритма круга Брешенема и оптимизированного третьего метода.
Result.X := Round(fCenter.X + cos(Angle/180*pi)* Radius);
Result.Y := Round(fCenter.Y + sin(Angle/180*pi)* Radius);
Пожалуйста, объясните, как это отвечает на вопрос. –
- 1. Рисование пользовательского сегмента круга динамически
- 2. Рисование сегмента круга в Java?
- 3. Рисование заполненного круга
- 4. Вычисление столкновений сегмента и круга
- 5. Рисование частичного круга
- 6. Рисование круга на изображении
- 7. Рисование круга с cocos2d?
- 8. Рисование и заполнение круга
- 9. Рисование круга в android
- 10. Рисование круга с OpenGL
- 11. рисование круга в flex
- 12. Mapkit рисование круга
- 13. рисование круга с bitmapData
- 14. Рисование круга в Jframe
- 15. JavaScript - рисование круга
- 16. Рисование круга в iOS
- 17. Рисование круга внутри другого холста круга
- 18. Рисование половины круга в CSS
- 19. Рисование круга с использованием wxpython
- 20. Рисование квадратного макета внутри круга
- 21. Рисование круга в программе черепахи
- 22. Рисование круга с треугольниками WebGL
- 23. Рисование круга без заполнения IOS
- 24. Рисование круга и высокого разрешения
- 25. Рисование дуги круга с GL_TRIANGLE_STRIP
- 26. Google Maps Api Рисование круга
- 27. Рисование круга в Tkinter (Python)
- 28. Android: Рисование круга на экране
- 29. Рисование круга с веером треугольника
- 30. Рисование круга с использованием Andengine
Спасибо, что получилось. Но существует ли целочисленная математическая версия только этого алгоритма? – Mattivc
Вы можете работать с целыми числами, если хотите, но стандартные триггеры будут ожидать значения с плавающей запятой. Я создал целочисленные функции триггера, прежде чем использовать масштабированные значения (0-360 станет 0-3600) и таблицы поиска для значений, но это было в мои старые времена во встроенном пространстве, когда эти функции были намного более дорогостоящими с течением времени. Существуют также более эффективные алгоритмы рисования круга (посмотрите на бресенхам или средний круг), но для этого требуется больше математики, чем я могу с комфортом вписаться в ответ. – paxdiablo
'plot (int (x), int (y))' –