Эмблема 0_0

Предыдущая тема Следующая тема Перейти вниз

Эмблема 0_0

Сообщение  Gena в Сб Янв 31, 2009 12:38 pm

Я вот недавно сам придумал/нарисовал/и написал на фри бейсике следующую рекурсию
Код:
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
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Эмблема 0_0

Сообщение  tux в Сб Янв 31, 2009 6:27 pm

Код:

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)
ну а далее все теми же тригонометрическими функциями находим нужные нам точки, найти которые, зная радиус не составит особого труда
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 28
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения