Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Subzik
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 4
#1

Получение матрицы для дерева Пифагора - C++

16.02.2007, 05:03. Просмотров 2090. Ответов 7
Метки нет (Все метки)

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

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 вбить в функцию построения. Как все это скомпоновать ума не хватает.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2007, 05:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получение матрицы для дерева Пифагора (C++):

Построение дерева Пифагора - C++
Дерево Пифагора Пифагор, доказывая свою знаменитую теорему, построил фигуру, где на сторонах прямоугольного треугольника расположены...

Программа выводит числа a,b и c не более 25, для которых верно равенство теоремы пифагора т.е a2+b2=c2 - C++
Программа выводит числа a,b и c не более 25, для которых верно равенство теоремы пифагора т.е a2+b2=c2 Помогите пож никак не...

С++ Для трех данных целых чисел проверить, являются ли они тройкой Пифагора - C++
#include <iostream> #include <conio.h> #include <stdio.h> using namespace std; int main () { int x,y,z; ...

Для трех данных целых чисел проверить, являются ли они тройкой Пифагора - C++
Для трех данных целых чисел проверить, являются ли они тройкой Пифагора.

Матрицы[макс. элементы, получение новой матрицы] - C++
6. В данной квадратной целочисленной матрице порядка 17 указать индексы всех элементов с наибольшим значением. 9. Дана действительная...

Получение матрицы - C++
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "* Дана действительная матрица A i,j=1,..,n ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fudz1k
0 / 0 / 0
Регистрация: 01.11.2006
Сообщений: 12
16.02.2007, 12:29 #2
расскажи поподробней, что именно надо сделать с задачей?
0
HackSign
35 / 35 / 14
Регистрация: 23.11.2006
Сообщений: 124
16.02.2007, 15:46 #3
Не обязательно перемножать две матрицы можно сделать намного проще.
ТЗ на мое мыло, желательно до завтрашнего дня. К понедельнику сделаю потихоньку.
0
HackSign
35 / 35 / 14
Регистрация: 23.11.2006
Сообщений: 124
16.02.2007, 15:47 #4
Да. и еще, при чем тут матрицы? это по заданию? или нет?
0
Subzik
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 4
16.02.2007, 23:42  [ТС] #5
Дерево Пифагора
Пифагор, доказывая свою знаменитую теорему, построил фигуру, где на сторонах прямоугольного треугольника расположены квадраты. В наш век эта фигура Пифагора выросла в целое дерево. Впервые дерево Пифагора построил А.Е. Босман (1891-1961) во время Второй Мировой войны, используя обычную чертежную линейку.
Как строится дерево Пифагора понятно из рисунка.


Приведу программу для построения, написанную на языке Pascal. Только она не запускается. Я ее скачал на сайте.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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:\bp\bgi');
  Draw(280, 460, 100, 0);
  ReadKey;
  CloseGraph;
End.
Как гласит учитель рекурсия будет происходить под углом. Для этого он посоветовал матрицу вращения. Вот формулы:

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>
#include<math.h>
//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:\\BC31\BGI");
 
   //  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<=M-1; i++)
   {
     for(j=0; j<=K-1; j++)
     {
       c[i][j]=0;
       {
     for(p=0; p<=N-1; p++);
     {
        c[i][j]=c[i][j]+a[i][j]*b[p][j];
        cout<<c[i][j];
     }
     // cout<<'\t';
       }
     cout<<'\n';
     }
 
   }
 
  getch();
  closegraph();
}
Я думаю дальше надо составить функцию rotate от угла поворота w и от массива с[i][j]
rotate(w, c).
0
Subzik
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 4
16.02.2007, 23:43  [ТС] #6
Мне всеравно как решить главное сделать до 19 числа!!!!
Может есть простые способы решения? Киньте пожалуйста.
0
HackSign
35 / 35 / 14
Регистрация: 23.11.2006
Сообщений: 124
17.02.2007, 11:45 #7
Ок, обмозгую за выходные, надеюсь 18 до вечера справлюсь, так что ждите сударь.
0
Subzik
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 4
17.02.2007, 22:11  [ТС] #8
Перемножение матриц - это вроде наши новые координаты.

чтобы повернуть четырехугольник, надо просто умножить вроде бы начальные координаты на матрицу вращения и отобразить результат.
Уменьшение четырехугольника производится по формулам:
Xi=1/sqrt(2)*(Xi-X0)+X0; Yi=1/sqrt(2)*(Yi-Y0)+Y0, i=1, 4. построения. Как все это скомпоновать ума не хватает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>
#include<math.h>
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<=M-1; i++)
   for(j=0; j<=K-1; j++)
   {
     c[i][j]=0;
     for(p=0; p<=N-1; p++) c[i][j]=c[i][j]+a[i][j]*b[p][j];
   }
 
   for(i=0; i<=M-1; i++)
   for(j=0; j<=K-1; j++)  a[i][j]=c[i][j];
   cout<<c[i][j]<<'\t';
 
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2007, 22:11
Привет! Вот еще темы с ответами:

получение новой матрицы - C++
Даны две действительные квадратные матрицы порядка n. Получить новую матрицу умножением элементов каждого столбца первой матрицы на...

Запись бинарного дерева в файл и восстановление из него этого дерева - C++
Задача такая: есть бинарное дерево. Каждый элемент дерева содержит 3 указателя - 1 указатель на структуру с данными, 2 и 3й указатель на...

Написать шаблон бинарного дерева с функцией распечатки дерева - C++
Не понимаю, что от меня хотят. Дано такое задание: Написать шаблон бинарного дерева с функцией распечатки дерева *(+(d,e),c) в виде...

Деструктор для дерева - C++
Добрый вечер! Помогите, пожалуйста, написать деструктор для дерева. enum color { RED, BLACK }; // Звено дерева typedef struct...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.02.2007, 22:11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru