Эмблема 0_0
Участников: 2
Эмблема 0_0
Я вот недавно сам придумал/нарисовал/и написал на фри бейсике следующую рекурсию
- Код:
Dim As Integer xres=1024,yres=768,n,per,qn,kolvo,use
Type Fra
x As Integer
y As Integer
Razmer As Double
Napr As Integer
End Type
n=4
ScreenRes xres,yres,32
Dim chasti(1 To 9999) As Fra
Circle (xres/2,yres/2),80
chasti(1).razmer=40
chasti(1).napr=4
chasti(1).x = -120
chasti(2).razmer=40
chasti(2).napr=6
chasti(2).x = 120
chasti(3).razmer=40
chasti(3).napr=8
chasti(3).y = -120
chasti(4).razmer=40
chasti(4).napr=2
chasti(4).y = 120
'view (0,0)-(512,384)
Dim As Double shag
shag=80
a:
shag=shag/2
kolvo=kolvo+1
qn=n
use = n
For per= 1 To n
If chasti(per).razmer=shag Then
If chasti(per).napr=4 Or chasti(per).napr=6 Or chasti(per).napr=8 Then '8
use=use+1
chasti(use).napr=8
chasti(use).razmer=chasti(per).razmer/2
chasti(use).y=chasti(per).y-chasti(per).razmer-chasti(use).razmer
chasti(use).x=chasti(per).x
EndIf
If chasti(per).napr=4 Or chasti(per).napr=6 Or chasti(per).napr=2 Then '2
use=use+1
chasti(use).napr=2
chasti(use).razmer=chasti(per).razmer/2
chasti(use).y=chasti(per).y+chasti(per).razmer+chasti(use).razmer
chasti(use).x=chasti(per).x
EndIf
If chasti(per).napr=4 Or chasti(per).napr=2 Or chasti(per).napr=8 Then '4
use=use+1
chasti(use).napr=4
chasti(use).razmer=chasti(per).razmer/2
chasti(use).x=chasti(per).x-chasti(per).razmer-chasti(use).razmer
chasti(use).y=chasti(per).y
EndIf
If chasti(per).napr=6 Or chasti(per).napr=2 Or chasti(per).napr=8 Then '6
use=use+1
chasti(use).napr=6
chasti(use).razmer=chasti(per).razmer/2
chasti(use).x=chasti(per).x+chasti(per).razmer+chasti(use).razmer
chasti(use).y=chasti(per).y
EndIf
qn=qn+3
EndIf
Next
n=qn
If kolvo<4 Then GoTo a
For per= 1 To n
Circle (xres/2+chasti(per).x,yres/2+chasti(per).y),chasti(per).Razmer
Next
Sleep
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 31
Откуда : Москва
Re: Эмблема 0_0
- Код:
const X=320
const Y=240
const PI=3.14159265
dim as integer i, pKlvUglov=8
dim as single pRadius1=100, pRadius2, pAngl, pTmp
screenres X*2, Y*2, 32
circle(X, Y), pRadius1, rgb(64, 64, 64)
pRadius2=pRadius1/cos(PI/pKlvUglov)
circle(X, Y), pRadius2, rgb(64, 64, 64)
pAngl=0
for i=1 to pKlvUglov
pTmp=2*PI/pKlvUglov*i
line(X+pRadius2*cos(pAngl), Y+pRadius2*sin(pAngl))-(X+pRadius2*cos(pTmp), Y+pRadius2*sin(pTmp))
pAngl=pTmp
next i
sleep
Лезем под кровать, откабываем запылившийся учебник по геометрии, включаем моск и читаем.
Что такое многоугольник, описанный вокруг окружности - это множество точек, равное количеству углов, лежащих на некоторой окружности, большей по диаметру чем исходная, и соединены эти точки прямыми.
Значит нам надо найти радиус етой самой окружности.
Вот примерно то что нам нужно (пардон за корявость рисовал с тачпада побыстрому):
так вот...
На рисунке изображено половинка одного ребра (от точки касания до вершины многоугольника).
AB нам извесно, нужно найти AC.
Но одного катета для нахождения мало, но ведь мы знаем еще и угол. А зная угол и одну из сторон треугольника можно найти другую через тригонометрические функции. В нашем случае удобней всего воспользоваться косинусом.
cos(alpha)=AB/AC
следовательно
AC=AB/cos(alpha)
AC и будет радиус второй окружности.
alpha же у нас равна 2*PI деленое на удвоеное количество углов (удвоенное, потомучто мы прали только половинку ребра). Несложными математическими операциями упрощаем функцию до вида
pRadius2=pRadius1/cos(PI/pKlvUglov)
ну а далее все теми же тригонометрическими функциями находим нужные нам точки, найти которые, зная радиус не составит особого труда
Права доступа к этому форуму:
Вы не можете отвечать на сообщения