ГлавнаяПрограммы
logo ГлавнаяПрограммированиеBasic

Программирование

BASIC

Warthog-sdl

Warthog — это алгоритм, который я впервые увидел опубликованным в журнале «Investigación y ciencia» (Scientific American) в 1990 году. Алгоритм очень прост. Рассмотрим натуральное число F и последовательность значений, определяемых функцией N^3/F при N=1,2,3,....,F. Алгоритм заключается в соединении F отрезков равной длины так, чтобы конечная точка каждого отрезка была начальной точкой следующего, а ориентация отрезка определялась дробной частью N^3/F (значения от 0 до 1), где 0 соответствует направлению 0°, а 1 — направлению 360°. В результате получаются удивительные геометрические фигуры с осями симметрии, которые иногда смутно напоминают насекомых, цветы, привидения, драгоценности и другое. Для каждого значения F получаются разные фигуры, сложность которых возрастает с увеличением числа отрезков, причём некоторые паттерны повторяются. Возникает вопрос: как может такая простая функция давать столь художественные результаты? И мы приходим к выводу, что природа использует математику для достижения своей красоты и разнообразия.

warthog
Рисунок 1. Warthog F=1999
warthog
Рисунок 2. Warthog F=2531
warthog
Рисунок 3. Warthog F=2533
warthog
Рисунок 4. Warthog F=165765
warthog
Рисунок 5. Warthog F=165765, далеко

   Скачать код: warthog.sdlbas


// Warthog figures
// Adapted from 1990 article in "American Scientific"
// Tested first time in 90' using my ZX Spectrum 48K
// Pere Casellas
// version 20180520 using sdlBasic
// GNU GPL 3.0

setDisplay( 1000, 650, 16, 2 )
setcaption("Warthog")

// Initial variables
//for f =1 to 250
//printS(f)

// Change the parameter f to obtain incredible figures
f=1998

fprintS( "Segments number is:")
printS(f)

k=13  // segment units
x=450     //  initial x
y=125     // initial y
pi = 3.14159265

// Figure made of f segments
for n =1 to f

// Define colors
if n<=f/3 then
ink(rgb(255,0,0))
end if
if n>f/3 then
ink(rgb(0,255,0))
end if
if n>(2*f/3) then
ink(rgb(0,0,255))
end if

// Warthog function
zz=(n^3)/f
z=2*pi*(zz-int(zz))  // angle as fractional part of zz
x1=k*cos(z)
y1=k*sin(z)
xx=x+x1
yy=y+y1

// Draw segment
line(x,y,xx,yy)

// Define initial point
x=xx
y=yy

next

wait(100)
waitKey

cls

//next