Приветствую, форумчане!
Появилась необходимость рисовать пунктирную окружность. При этом она должна состоять не из точек, а из линий длиной 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, 2
Dim kr_x (1)
Dim kr_y (1)
While Not KeyHit(1)
Color 255, 255, 255
If KeyHit (57) Then dotted_circle (400, 300, 100)
Wend
Function dotted_circle (dx, dy, r)
For x = -0.7067*r To 0.7067*r
y = Sqr (r^2 - x^2)
If x Mod 4 = 0 Then
rf = rf + 1
EndIf
Next
Dim kr_x (rf)
Dim kr_y (rf)
For x = -0.7067*r To 0.7067*r
y = Sqr (r^2 - x^2)
If x Mod 4 = 0 Then
kr_x (i) = x
kr_y (i) = y
i = i + 1
EndIf
Next
For i = 0 To rf Step 4
Line kr_x (i) + dx, kr_y (i) + dy, kr_x (i+2) + dx, kr_y (i+2) + dy
Line kr_x (i) + dx, -kr_y (i) + dy, kr_x (i+2) + dx, -kr_y (i+2) + dy
Line kr_y (i) + dx, kr_x (i) + dy, kr_y (i+2) + dx, kr_x (i+2) + dy
Line -kr_y (i) + dx, kr_x (i) + dy, -kr_y (i+2) + dx, kr_x (i+2) + dy
Next
rf = 0: i = 0
End Function