Показать сообщение отдельно
Старый 04.10.2015, 02:58   #1
DarkInside
Разработчик
 
Аватар для DarkInside
 
Регистрация: 08.08.2011
Сообщений: 505
Написано 191 полезных сообщений
(для 369 пользователей)
Пунктирная окружность

Приветствую, форумчане!

Появилась необходимость рисовать пунктирную окружность. При этом она должна состоять не из точек, а из линий длиной 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 и более стыки между четырьмя её частями сливаются.
Может кто подскажет решение попроще и поэлегантнее?
Ну или может кто заметит косяк, а то я совсем запутался, уже на бумаге всё разрисовал, а в коде не получается

Graphics 800,600,32

Dim kr_x 
(1)
Dim kr_y (1)

While 
Not KeyHit(1
    
    
Color 255255255
    
    
If KeyHit (57Then dotted_circle (400300100)
    
Wend  

Function dotted_circle (dxdyr)
    
For 
= -0.7067*r To 0.7067*r
    y 
Sqr (r^x^2)
    If 
x Mod 4 0 Then 
        rf 
rf 1
    
EndIf
Next

Dim kr_x 
(rf)
Dim kr_y (rf)

For 
= -0.7067*r To 0.7067*r
    y 
Sqr (r^x^2)
    If 
x Mod 4 0 Then 
        kr_x 
(i) = x
        kr_y 
(i) = y
        i 
1
    
EndIf
Next

For 0 To rf Step 4
    Line kr_x 
(i) + dxkr_y (i) + dykr_x (i+2) + dxkr_y (i+2) + dy
    Line kr_x 
(i) + dx, -kr_y (i) + dykr_x (i+2) + dx, -kr_y (i+2) + dy
    Line kr_y 
(i) + dxkr_x (i) + dykr_y (i+2) + dxkr_x (i+2) + dy
    Line 
-kr_y (i) + dxkr_x (i) + dy, -kr_y (i+2) + dxkr_x (i+2) + dy
Next

rf 
00

End 
Function 
(Offline)
 
Ответить с цитированием