41 FreeBASIC. Рисуем круг, окружность, кольцо (метод Монте Карло)

Конечто же в Бейсике есть функция для рисования окружности и её вариантов - это circle, но как нарисовать круг без этой функции?

Воспользуемся методом Монте-Карло. Закрутилось у вас в голове уже слово "казино", нет? Очень часто Монте-Карло ассоциируется с казино, а казино с рулеткой, а рулетка с чем? - со случайными числами. Наверное этот метод что-то делает со случайными числами... Не будем углублятся в статистику с теорией вероятности, но при помощи этого метода, названного методом Монте-Карло можно вычислять площадь фигур - я же хочу нарисовать круг(окружность)

Принцип здесь прост - будем ставить на экран случайные точки, много-много случайных точек, и если точка попадает в некоторую область(круг) - мы её рисуем, если нет - не рисуем. Всё просто.

Уравнение окружности с центром в начале координат O(0,0)

x2+y2 = R2

или если центр окружности в произвольной точке xc,yc

(x-xc)2+(y-yc)2 = R2

А для круга, вместо окружности, нужно равенство заменить неравенством

(x-xc)2+(y-yc)2 < R2

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

программированиеfreebasicкомпьютерыsgfbsgpgобучениеобразование
732
497.872 GOLOS
0
В избранное
Сергей
Кибернетик... а кто это? deals.weku.io/@sergiy, serey.io/@sergiy, whaleshares.io/@sergiy, sola.ai/nsergiy
732
0
Комментарии (8)
Сортировать по:
Сначала старые
Зарегистрируйтесь, чтобы проголосовать за пост или написать комментарий
Авторы получают вознаграждение, когда пользователи голосуют за их посты. Голосующие читатели также получают вознаграждение за свои голоса.