компьютерный форум
Вернуться   Компьютерный форум > Программирование и вебстроительство > Программирование

Ответ
 
LinkBack Опции темы Опции просмотра
Старый 16.02.2007, 02:53   #1
Пользователи
 
Регистрация: 16.02.2007
Сообщений: 3
По умолчанию

Дерево Пифагора – такая вещь, когда все начинается с квадрата, который на одной из сторон имеет равнобедренный прямоугольный треугольник. Катеты этих треугольников равны и являются сторонами новых квадратов. И так фигурка разрастается.

Cos(a) sin(a) 0 -первая матрица
T= -sin(a) cos(a) 0
-x0*(cos(a)-1)+ -x0*sin(a)- 1
y0*sin(a) -y0*(cos(a)-1)



x1 y1 1 x11 y11 1
x2 y2 1 * T = x22 y22 1 - перемножение двух матриц.
x3 y3 1 x33 y33 1
x4 y4 1 x44 y44 1

Тоесть, как я понял, идет перемножение двух матриц.
a[0][0]=cos(w);
a[0][1]=sin(w);
a[0][2]=0;
a[1][0]=-sin(w);
a[1][1]=cos(w);
a[1][2]=0;
a[2][0]=-x0*cos(w-1)+y0*sin(w);
a[2][1]=-x0*sin(w)-y0*(cos(w)-1);
a[2][2]=1;

b[0][0]=x1;
b[0][1]=y1;
b[0][2]=1;
b[1][0]=x2;
b[1][1]=y2;
b[1][2]=1;
b[2][0]=x3;
b[2][1]=y3;
b[2][2]=1;
b[3][0]=x4;
b[3][1]=y4;
b[3][2]=1;

c[0][0]=x11;
c[0][1]=y11;
c[0][2]=1;
c[1][0]=x22;
c[1][1]=y22;
c[1][2]=1;
c[2][0]=x33;
c[2][1]=y33;
c[2][2]=1;
c[3][0]=x44;
c[3][1]=y44;
c[3][2]=1;
Далее по идее идет формула: c[i][j]=c[i][j]+a[i][j]+b[p][j]
Только как ее со всем связать? Как высчитать эту матрицу? Как ее вбить в программу? Я не знаю.
По идее в дереве Пифагора идет рекурсия. Значит надо задать цикл. if(!N) return;
N вбить в функцию построения. Как все это скомпоновать ума не хватает.




Subzik вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
16.02.2007, 02:53
Техник
реклама
По умолчанию

Старый 16.02.2007, 12:31   #2
Пользователи
 
Регистрация: 07.12.2004
Сообщений: 783
По умолчанию

что-то я не особо понял постановку задачи....
Можешь объяснить поподробней (желательно - с картинками)
Andy вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 16.02.2007, 20:28   #3
Пользователи
 
Регистрация: 16.02.2007
Сообщений: 3
По умолчанию

Фракталы Информация и программы
Дерево Пифагора
Пифагор, доказывая свою знаменитую теорему, построил фигуру, где на сторонах прямоугольного треугольника расположены квадраты. В наш век эта фигура Пифагора выросла в целое дерево. Впервые дерево Пифагора построил А.Е. Босман (1891-1961) во время Второй Мировой войны, используя обычную чертежную линейку.
Как строится дерево Пифагора понятно из рисунка.


Приведу программу для построения, написанную на языке Pascal. Только она не запускается. Я ее скачал на сайте.
Program Pif;
Uses CRT, Graph;
Procedure Draw(x, y, l, a: Real);
Procedure Rect(x1, y1, l: Integer; a1: Real);
Begin
MoveTo(x1, y1);
LineTo(x1+Round(l*cos(a1)), y1-Round(l*sin(a1)));
LineTo(x1+Round(l*sqrt(2)*cos(a1+pi/4)),
y1-Round(l*sqrt(2)*sin(a1+pi/4)));
LineTo(x1+Round(l*cos(a1+pi/2)), y1-Round(l*sin(a1+pi/2)));
LineTo(x1, y1);
End;
Begin
If l>4 Then Begin
Rect(Round(x), Round(y), Round(l), a);
Draw(x-l*sin(a), y-l*cos(a), l/sqrt(2), a+pi/4);
Draw(x-l*sin(a)+l/sqrt(2)*cos(a+pi/4),
y-l*cos(a)-l/sqrt(2)*sin(a+pi/4), l/sqrt(2), a-pi/4);
End;
End;

Var
gd, gm: Integer;
Begin
gd:=detect;
InitGraph(gd, gm, 'c:pgi');
Draw(280, 460, 100, 0);
ReadKey;
CloseGraph;
End.



Как гласит учитель рекурсия будет происходить под углом. Для этого он посоветовал матрицу вращения. Вот формулы:



Вот что я смог на сегодняшний день соорудить на Borland C++

#include
#include
#include
#include
#include
//void pifagor(int, int, int, int, int, int, int, int, int);
void main(void)
{
const int M=4, N=3, K=3;
int a[M][N], b[N][K], c[M][K];
clrscr(); // randomize();
int i,j,p;
int w=3.14/4, x0=340, y0=440, x1=300, y1=480, x2=300, y2=440,x3=340, y3=440, x4=340, y4=480;

int gd=DETECT, gm;
initgraph(&gd, &gm, "C:\BC31BGI");

// pifagor(300, 480, 300, 440, 340, 440, 340, 480,10);

a[0][0]=x1;
a[0][1]=y1;
a[0][2]=1;
a[1][0]=x2;
a[1][1]=y2;
a[1][2]=1;
a[2][0]=x3;
a[2][1]=y3;
a[2][2]=1;
a[3][0]=x4;
a[3][1]=y4;
a[3][2]=1;

b[0][0]=cos(w);
b[0][1]=sin(w);
b[0][2]=0;
b[1][0]=-sin(w);
b[1][1]=cos(w);
b[1][2]=0;
b[2][0]=-x0*(cos(w)-1)+y0*sin(w);
b[2][1]=-x0*sin(w)-y0*(cos(w)-1);
b[2][2]=1;



for(i=0; i
Subzik вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 16.02.2007, 21:28   #4
Пользователи
 
Регистрация: 07.12.2004
Сообщений: 783
По умолчанию

А где рисунок с деревом?
И с формулами тоже где?
Andy вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 17.02.2007, 18:59   #5
Пользователи
 
Регистрация: 16.02.2007
Сообщений: 3
По умолчанию

http://fractalworld.chaos.ru/article/dpif.html


x1 y1 1 x11 y11 1
x2 y2 1 * T = x22 y22 1 - перемножение двух матриц.
x3 y3 1 x33 y33 1
x4 y4 1 x44 y44 1


Cos(a) sin(a) 0
T= -sin(a) cos(a) 0
-x0*(cos(a)-1)+ -x0*sin(a)- 1 - матрица T
y0*sin(a) -y0*(cos(a)-1)

Перемножение матриц - это наши новые координаты.

чтобы повернуть четырехугольник, надо просто умножить вроде бы начальные координаты на матрицу вращения и отобразить результат.
Уменьшение четырехугольника производится по формулам:
Xi=1/sqrt(2)*(Xi-X0)+X0; Yi=1/sqrt(2)*(Yi-Y0)+Y0, i=1, 4.



Начало вроде правильное. Функция rotate для поворота квадрата. Помоги пожалуйста доделать. Или предложи другой вариант решения.

#include
#include
#include
#include
#include
void rotate(int[4][3], float, float, float);

void main(void)
{
int gd=DETECT, gm;
int alfa1=3.14/4;
initgraph(&gd, &gm, "C:\BC31\BGI");
getch();
}

void rotate (float a[4][3], float alfa1, float x0, float y0)
{
const int M=4, N=3, K=3;
int c[M][N], b[N][K];
int i,j,p;

b[0][0]=cos(alfa1); b[0][1]=sin(alfa1); b[0][2]=0;
b[1][0]=-sin(alfa1); b[1][1]=cos(alfa1); b[1][2]=0;
b[2][0]=-x0*(cos(alfa1)-1)+y0*sin(alfa1);
b[2][1]=-x0*sin(alfa1)-y0*(cos(alfa1)-1);
b[2][2]=1;

for(i=0; i
Subzik вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Ответ


Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Вкл.



Текущее время: 10:39. Часовой пояс GMT.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot
Content Relevant URLs by vBSEO 3.5.0 RC2