Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
sergiy
6 лет назад

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

25
497.872 GOLOS
На Golos с October 2016
Комментарии (8)
Сортировать по:
Сначала старые