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

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

Войти
Регистрация
Восстановить пароль
 
Nfyaka
1 / 1 / 1
Регистрация: 04.05.2010
Сообщений: 28
#1

Вращение пирамиды - C++

02.06.2010, 20:14. Просмотров 1012. Ответов 0
Метки нет (Все метки)

Задача: реализовать вращение правильной пирамиды вокруг оси, которая проходит через одно из ее боковых ребер. Количество боковых граней равно трем. Среда программирования - турбо си++.

Добавлено через 28 минут
я написала код, но при запуске она выбивает. Пожалуйста, посмотрите этот километровый код, может найдете ошибки... или, может, киньте свой
черд, лучше киньте свой!..

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
#include <graphics.h>
#include <string.h>
//-------функция инициализации графики---------------
 
int InitGraph()
{
   int GraphMode,DriverMode=DETECT,ErrorCode;
   initgraph(&DriverMode,&GraphMode,"../BGI");
   ErrorCode=graphresult();
   if (ErrorCode!=grOk)
     {
      printf("Error %d -> %s",ErrorCode,grapherrormsg(ErrorCode));
      getch();
      exit(1);
     }
   return 0;
}
//----------Класс для работы с двумерным массивом-------------
class Matrix
{
public:
double**mas;       //на двумерный массив
int lines;              //к-ство строк
int columns;         //колонок
Matrix();              //делает mas=NULL;
Matrix(int l,int c);  //вызывает Init(int l,int c)
~Matrix();            //очищает память
void Init(int l,int c);// выделяет память на дв. массив
void Zero();           //заполняет массив нулями
Matrix operator *(Matrix ob); //чтобы можно было умножать матрицу на матрицу через объекты
void operator =(Matrix ob);   //чтобы записать результат
};
//-----------------------
Matrix::Matrix()
{   mas=NULL;
}
Matrix::Matrix(int l,int c)
{
    Init(l,c);
}
Matrix::~Matrix()
{  if(mas!=NULL)
    free(mas);
   mas=NULL;
}
void Matrix::Init(int l,int c)
{   lines=l;
    columns=c;
    mas=new double*[l];
    for(int i=0;i<l;i++)
    mas[i]=new double[c];
}
void Matrix::Zero()
{
    for(int i=0;i<lines;i++)
    for(int j=0;j<columns;j++)
    mas[i][j]=0;
}
Matrix Matrix::operator *(Matrix ob)
{
    Matrix res(lines,ob.columns);
    res.Zero();
    for(int i=0;i<lines;i++)
        for(int j=0;j<ob.columns;j++)
            for(int k=0;k<columns;k++)
                res.mas[i][j]+=mas[i][k]*ob.mas[k][j];
    return res;
}
void Matrix::operator =(Matrix ob)
{
    columns=ob.columns;
    lines=ob.lines;
    delete[]mas;
    mas=ob.mas;
}
//--------Работа с пирамидой---------------
class Pyramid
{   public:
    Matrix koord;      //Матрица с координатами вершин пирамиды
    Pyramid();         //задает начальные координаты пирамиды
    void Draw();      //Рисует пирамиду за координатами сохраненными в koord
    void Move(double fi);//Изменяет координаты с помощью афинных преобразований
};
//-----------------------
Pyramid::Pyramid()
{
koord.Init(4,4);
koord.mas[0][0]=400;
koord.mas[0][1]=159;
koord.mas[0][2]=49;
koord.mas[1][0]=300;
koord.mas[1][1]=300;
koord.mas[1][2]=0;
koord.mas[2][0]=400;
koord.mas[2][1]=300;
koord.mas[2][2]=99;
koord.mas[3][0]=500;
koord.mas[3][1]=300;
koord.mas[3][2]=0;
for(int i=0;i<4;i++)
koord.mas[i][3]=1;
setcolor(15);
Draw();
}
void Pyramid::Draw()
{
line(koord.mas[0][0],koord.mas[0][1],koord.mas[1][0],koord.mas[1][1]);
line(koord.mas[0][0],koord.mas[0][1],koord.mas[2][0],koord.mas[2][1]);
line(koord.mas[0][0],koord.mas[0][1],koord.mas[3][0],koord.mas[3][1]);
line(koord.mas[1][0],koord.mas[1][1],koord.mas[2][0],koord.mas[2][1]);
line(koord.mas[2][0],koord.mas[2][1],koord.mas[3][0],koord.mas[3][1]);
line(koord.mas[3][0],koord.mas[3][1],koord.mas[1][0],koord.mas[1][1]);
}
void Pyramid::Move(double fi)
{       int i,j;
    int l=1,m=1,n=1;
    double d=sqrt(pow(m,2)+pow(n,2));
    int a[3]={300,300,0};
    Matrix temp(4,4);
    Matrix res(4,4);
    temp.Zero();
    res.Zero();
//перемещение в начало координат
    for(i=0;i<4;i++)
    res.mas[i][i]=1;
    for(i=0;i<3;i++)
    res.mas[3][i]=-a[i];
//поворот относительно х проекции ребра
    temp.mas[0][0]=1;
    temp.mas[3][3]=1;
    temp.mas[1][1]=n/d;
    temp.mas[2][1]=-m/d;
    temp.mas[1][2]=n/d;
    temp.mas[2][2]=m/d;
    res=res*temp;
    temp.Zero();
//поворот относительно у
    temp.mas[0][0]=d/sqrt(d*d+l*l);
    temp.mas[1][1]=1;
    temp.mas[0][2]=l/sqrt(d*d+l*l);
    temp.mas[2][0]=-l/sqrt(d*d+l*l);
    temp.mas[2][2]=d/sqrt(d*d+l*l);
    temp.mas[3][3]=1;
    res=res*temp;
    temp.Zero();
//поворот точки на нужный угол
    temp.mas[0][0]=cos(fi);
    temp.mas[0][1]=sin(fi);
    temp.mas[1][0]=-sin(fi);
    temp.mas[1][1]=cos(fi);
    temp.mas[2][2]=1;
    temp.mas[3][3]=1;
    res=res*temp;
    temp.Zero();
//обратный поворот относительно у
    temp.mas[0][0]=d/sqrt(d*d+l*l);
    temp.mas[1][1]=1;
    temp.mas[0][2]=-l/sqrt(d*d+l*l);
    temp.mas[2][0]=l/sqrt(d*d+l*l);
    temp.mas[2][2]=d/sqrt(d*d+l*l);
    temp.mas[3][3]=1;
    res=res*temp;
    temp.Zero();
//поворот относительно х
    temp.mas[0][0]=1;
    temp.mas[3][3]=1;
    temp.mas[1][1]=n/d;//cos(fi);
    temp.mas[2][1]=m/d;//-sin(fi);
    temp.mas[1][2]=-n/d;//sin(fi);
    temp.mas[2][2]=m/d;//cos(fi);
    res=res*temp;
    temp.Zero();
//перемещение
    for(i=0;i<4;i++)
    temp.mas[i][i]=1;
    for(i=0;i<3;i++)
    temp.mas[3][i]=a[i];
    res=koord*res*temp;
    koord=koord*res;
}
//-----------------------
int main()
{   InitGraph();
    int sw;
    double f=0,step=0.1;
    Pyramid ob;
    do
    {   sw=getch();
        if(sw==27) break;
        cleardevice();
        f+=step;
        cout<<f;
        ob.Move(f);
        ob.Draw();
    }
    while(sw!=27);
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2010, 20:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вращение пирамиды (C++):

Вращение усеченной пирамиды - C++
Добрый день, заранее скажу причину по которой пишу - болел, долго. А надо сдать вращение усечённой пирамиды. Код есть, просто надо заменить...

Пирамиды - C++
#include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; template &lt;class T&gt; void prepare_vector(vector&lt;T&gt; *v) { ...

треугольные пирамиды - C++
помогите пожалуйста написать программу. вот задание: На вход подается некоторое количество треугольных пирамид (координаты вершин)....

Построение пирамиды из символов x - C++
Доброго времени суток! Есть задание и чето у меня ничего не получается, выручайте! :-| При помощи цикла for изобразите на экране...

движение пирамиды по кругу - C++
Пожалуста помогите сделать программу которая заставляла пирамиду двигалась по кругу. Зарание Всем спасибо:)

Вывод пирамиды чисел в консоли - C++
Подскажите как реализовать вывод вот такой пирамиды чисел: ___1___ __121__ _12321_ 1234321 ....

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2010, 20:14
Привет! Вот еще темы с ответами:

Бинарное дерево, поиск пирамиды - C++
Помогите написать программу: Дано бинарное дерево. Определить какие поддеревья являются пирамидами. Принцип задания понимаю, но как...

Реализация двоичной кучи(пирамиды)!!! - C++
Горит расчетная работа на тему &quot;Пирамиды&quot;(другое название &quot;двоичная куча&quot;). Нужно реализовать эту структуру данных, добавление и удаление...

Написать программу для расчета пирамиды - C++
Помогите с заданием! Написать программу для расчета пирамиды когда имеется координаты для прямоугольника

Вычислить площадь треугольной пирамиды. Функции - C++
Вычислить площадь треугольной пирамиды с помощью функции. С клавиатуры вводить &quot;а&quot; и &quot;b&quot;. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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