Помогите с рисованием дуги.
- Войдите на сайт для отправки комментариев
Чт, 07/01/2016 - 13:49
Помогите найти реализованные алгоритмы на C рисования дуги по входным параметрам - координаты центра, радиус, угол отклонения, угол дуги. Я уже вымотался... все что у меня выходит - это точки:
int DegToRad(int Deg) { return Deg * 180 * PI; } void AngleArc(int CenterX, int CenterY, int Radius, float StartAngle, float SweepAngle, uint16_t color) { float X; float Y; for (float Pos = 0; Pos <= SweepAngle; Pos += 0.1) { float F = SweepAngle * Pos / SweepAngle - SweepAngle / 2 + 180 + StartAngle; X = sin(DegToRad(F)); Y = cos(DegToRad(F)); tft.drawPixel((int) (CenterX + X * Radius), (int) (CenterY + Y * Radius), color); } }
И то дорисовывает 4 маленьких дуги. Да и по точкам не ахти. Ни где не могу достать исходников AngleArc. В делфе он меня устраивает, но выдернуть исходники ни как не выходит. А ноутбук на которм должны лежать исходники 31 декабря пал смертью храбрых... даже корпус поведен (
заранее спасибо.
Если что рисую на tft экране с уже довольно сильно модифицированной ADAFRUIT_GFX. Хотя возможен переезд на другую либу с поддержкой ili9341 подключенной напрямую без i2c и прочих.
А точки говорите выходят?! Так проводите прямые от предыдущей точки к текущей.
Думал уже. Но в условиях скажем avr когда приходится пользоваться только целыми выходит что скажем если на окружность (пример) с радиусом в 25 пикселей 360 вычислей норма, то окружность с радиусом в 100 писелей выгляджит очень не гуманно. Да еще и в условиях округления некоторые точки выстреливают дальше визульного радиуса окружности где-то на 3-4 пикселя и это я делал для окружности с радиусом в 50 пикселей.
Вістреливают-плохо. Посмотрите в ADAFRUIT_GFX как строится окружность, по идее это это - https://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма . Там в общем рисуется четверть круга, остальное симметрично зеркалируется. Если добавить перед прорисовкой точки проверку принадлежности точки дуге - получим что надо.
Применен алгоритм Брезенхэма для построения окружностей. Может строить как дугу, так естественно и окружность полностью.
Координатная сетка:
сверху - вниз - Y от 0 на увеличение
слева - направо - X от 0 на увеличение
Т.е. левый верхний угол (0, 0)
Тут 4 вызова:
тут 1 вызов:
Как видим - процедура может рисовать не тоько от 0 и на 360, но и от любого угла на любой угол (естественно каждый угол ограничен 360).
Т.е. в данном примере отрисовка начинается с 90 градусов на 300 градусов. Т.е. дорисовывает до 360 270 градусов и с 0 градусов дорисовывает оставшиеся 30.
Если входной начальный градус больше 360, он приравнивается 0.
Если угол поворота больше 360, он приравнивается 360.
Углы на всякий случай присваиваются модулю. Вроде бы защиту от дураков сделали всю возможную )
Собственно сам код:
Спасибо Logik за то что ткнул все таки носом. Если у кого-то есть предложения по оптимизации, буду рад услышать.
есть кто? вопрос с толщиной линий, как в этой либе их сделать толще?
есть кто? вопрос с толщиной линий, как в этой либе их сделать толще?
Рисуется тут пиксельно. Могу предложить заменить tft.drawPixel(_x + x, _y - y, color); на рисованием прямой нужной длины (длина прямо = ширине) с центром в центре круга.
мне нужно 2 прямоугольника:( что-то типо эквалайзера. с помощью какого класса реализовать?
Есть библиотека на C - ugui. Можно её использовать в качестве примера.
мне нужно 2 прямоугольника:( что-то типо эквалайзера. с помощью какого класса реализовать?
Что Вам нужно? Вам нужна окружность или прямоугольник? Если окружность определенного радиуса, то чем-то да помогу, если прямоугольник... ту вы ошиблись темой и не срите тут по пусту, а создайте свою тему. Спасибо.
спасибо поковыряю.