Пунктирная окружность
Приветствую, форумчане!
Появилась необходимость рисовать пунктирную окружность. При этом она должна состоять не из точек, а из линий длиной 4 пикселя и промежуток между ними 2 пикселя. Поиск ничего не дал. Четыре часа ломал голову, вспоминал формулы окружности. Либо я туплю, либо что-то не учитываю, но если просто рисовать точками (а потом разделить их на отрезки) по функции y = +-Sqr (r^2-x^2), то при y, приближающемся к нулю, точки почему-то не все прорисовываются. В итоге пришлось разбить окружность на 4 части и рисовать по-отдельности. Второй момент: длина окружности ведь 2*Пи*r, если разделить на 4 части и еще на 2 (отрицательные и положительные значения), то цикл должен выглядеть так: For x = -Пи*r/4 To Пи*r/4. То есть получаем Пи/4 = 0,7854*r. Но при таком значении части окружности почему-то накладываются друг на друга. Подобрал экспериментально число 0.7067. Откуда оно взялось непонятно. В математике такого нет. В общем, вот то, на что меня хватило: Проблемы следующие: 1) вроде делаю шаг 4 пикселя (целочисленное деление), а получаются линии по 8 пикселей. Промежуток 5 пикселей (хотя при 8 должен быть 4, если в 2 раза меньше). 2) при радиусе 100 вроде окружность выглядит нормально, а вот при радиусе 200 и более стыки между четырьмя её частями сливаются. Может кто подскажет решение попроще и поэлегантнее? Ну или может кто заметит косяк, а то я совсем запутался, уже на бумаге всё разрисовал, а в коде не получается :rolleyes: PHP код:
|
Ответ: Пунктирная окружность
y=r*sin(q)
x=r*cos(q) При известном r оцениваешь значение шага для q. Генерируешь набор точек. Соединяешь линиями. всё Блитца под рукой нет |
Ответ: Пунктирная окружность
Спасибо! Проверил, работает.
Всё проще, оказывается. Обидно, что 4 часа провозился с разбиением окружности на части. Хреново, когда не помнишь геометрию. Я даже не подумал про синусы косинусы, потому что их графики мне представляются в виде волны, а не окружности. PHP код:
|
Ответ: Пунктирная окружность
Кстати , если кому надо , то ...
Функция Пунктирная линия с регулируемым шагом - - - - - - - - - - - - - - - - - - - - - - - - - шаг задаёт переменная offsete Код под спойлером : |
Ответ: Пунктирная окружность
Цитата:
По коду: For q = 1 To 360 Step 4 upd: правомочное уравнение r^2=x^2+y^2 (упомянутое тобой) удобно использовать для определения принадлежности заданной точки указанной кривой (окружности). Само по себе оно корректно, просто, для данной задачи неудобно. Надо будет перебрать значения от 0 до r => получить два y => отражением получить из каждого ещё по точке -т.о. получить 4 точки. Проблема в том, что двигаться по х надо неравномерно (т.к. производная от sin, по которой изменяется прирост y - cos, а не прямая) если тебе нужно выдерживать постоянную длину штриха. |
Ответ: Пунктирная окружность
Функция окружность пунктиром с регулируемым шагом .
DarkInside , если у тебя не получилось , то посмотри этот Код под спойлером : |
Ответ: Пунктирная окружность
polopok, да я уже вроде как написал самопальную функцию. Но спасибо, посмотрю.
|
Ответ: Пунктирная окружность
Вот смотри, код доступен, рендер есть (ничего не нужно запускать, 1 клик по ссылке), кто хочет сейчас может код обновить и выложить ссылку на его ввариант. Удобно же!
Пунктирная окружность с регулируемым градусом дуги: http://jsfiddle.net/bq6vvqch/ И еще версия с гарантированной последовательностью отступ > дуга, и чтобы не было где-то одного мелкого/большого отступа. Также анимировано: http://jsfiddle.net/o8xkde88/1/ Можно еще сделать чтобы дуга могла удлиняться/укорачиваться, но гарантированно иметь одной длины отступы и другой единой длины дуги. Таким образом переход между разным числом дуг будет более плавный. PHP код:
|
Ответ: Пунктирная окружность
ага ,нормально ...
Да ,вот что, в приведённой мною функции ,переменную offset проверить ,что она меньше длины круга (2 * Pi * Radius ). |
Ответ: Пунктирная окружность
Всем спасибо за примеры. За ссылку на сервис отдельное спасибо, удобная вещь.
|
Часовой пояс GMT +4, время: 00:41. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot