41 FreeBASIC. Рисуем круг, окружность, кольцо (метод Монте Карло)
Конечто же в Бейсике есть функция для рисования окружности и её вариантов - это circle, но как нарисовать круг без этой функции?
Воспользуемся методом Монте-Карло. Закрутилось у вас в голове уже слово "казино", нет? Очень часто Монте-Карло ассоциируется с казино, а казино с рулеткой, а рулетка с чем? - со случайными числами. Наверное этот метод что-то делает со случайными числами... Не будем углублятся в статистику с теорией вероятности, но при помощи этого метода, названного методом Монте-Карло можно вычислять площадь фигур - я же хочу нарисовать круг(окружность)
Принцип здесь прост - будем ставить на экран случайные точки, много-много случайных точек, и если точка попадает в некоторую область(круг) - мы её рисуем, если нет - не рисуем. Всё просто.
Уравнение окружности с центром в начале координат O(0,0)
или если центр окружности в произвольной точке xc,yc
А для круга, вместо окружности, нужно равенство заменить неравенством
screenres 800, 600
dim as integer x,y
dim i as longint
for i=1 to 1000000
x=int(800*rnd)+1
y=int(600*rnd)+1
if (x-400)^2+(y-300)^2<70^2 then pset(x,y),14
next i
locate 1,1: print "Ok"
sleep
А теперь чтоб нарисовать окружность нужно...
заменить неравенство равенством if (x-400)^2 + (y-300)^2 = 70^2 then pset(x,y),14
Но окружности не вышло((( и даже большее количество итераций цыкла не решает проблему.
А всему причина - коварный знак равенства слишком уж он требовательный, слишком строгий. Неужели его нельзя как-то смягчить?
Обычно в программах проверки на равенство стараются не делать, а заменить на "почти равно", на "отличается не более чем на..."
screenres 800, 600
dim as integer x,y
dim i as longint
for i=1 to 1000000
x=int(800*rnd)+1
y=int(600*rnd)+1
if abs((x-400)^2+(y-300)^2 - 70^2)<100 then pset(x,y),14:
next i
locate 1,1: print "Ok"
sleep
Теперь фигура похожа на окружность. А если ещё больше увеличить жто число - получится кольцо.
abs((x-400)^2 + (y-300)^2 - 70^2) < 1000