FreeBasic
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

Эмблема 0_0

Участников: 2

Перейти вниз

Эмблема 0_0 Empty Эмблема 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
Возраст : 31
Откуда : Москва

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

Эмблема 0_0 Empty 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
а теперь откуда ето взялось...
Лезем под кровать, откабываем запылившийся учебник по геометрии, включаем моск и читаем.
Что такое многоугольник, описанный вокруг окружности - это множество точек, равное количеству углов, лежащих на некоторой окружности, большей по диаметру чем исходная, и соединены эти точки прямыми.
Значит нам надо найти радиус етой самой окружности.
Вот примерно то что нам нужно (пардон за корявость рисовал с тачпада побыстрому):
Эмблема 0_0 Pic
так вот...
На рисунке изображено половинка одного ребра (от точки касания до вершины многоугольника).
AB нам извесно, нужно найти AC.
Но одного катета для нахождения мало, но ведь мы знаем еще и угол. А зная угол и одну из сторон треугольника можно найти другую через тригонометрические функции. В нашем случае удобней всего воспользоваться косинусом.
cos(alpha)=AB/AC
следовательно
AC=AB/cos(alpha)
AC и будет радиус второй окружности.
alpha же у нас равна 2*PI деленое на удвоеное количество углов (удвоенное, потомучто мы прали только половинку ребра). Несложными математическими операциями упрощаем функцию до вида
pRadius2=pRadius1/cos(PI/pKlvUglov)
ну а далее все теми же тригонометрическими функциями находим нужные нам точки, найти которые, зная радиус не составит особого труда
tux
tux

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

http://tux.nsk.ru/

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

Вернуться к началу


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