IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Графика в СИ, Подскажите что означает строка в программе
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Необходимо нарисовать параллельную аксонометрическую проекцию равностороннего тетраэдра с единичными ребрами. Центр тетраэдра должен вращаться по окружности радиусом 2 с центром в начале координат, лежащей в плоскости OXZ. Требуется отобразить оси координат и некоторый объект. Центр окна должен совпадать с началом координат. Объект должен полностью уместиться в окне. Направление проектирования (вглубь экрана) (-0.5, -0.4, -0.3), направление вверх на экране и ось OY в пространстве должны лежать в одной плоскости. Для трансформаций следует использовать матрицы. Параметры осей координат следует рассчитывать с помощью тех же трансформаций.

Объясните плиз зачем при нахождении трех координат Y, мы делим сторону на 3, и для одной координаты умножаем найденную координату на 2. Эти места выделены в программе.

#include <graphics.h>
#include <dos.h>
#include <math.h>
#include <alloc.h>
void main()
{int gdriver=0,gmode,xc,yc,a=50,i,j;
float x[4],y[4],z[4],x1[4],y1[4],z1[4],alpha,beta,o;
float xt=0,zt=0,theta=0.05;
unsigned char ch;
initgraph(&gdriver,&gmode,"");
xc=getmaxx()/2;
yc=getmaxy()/2;
alpha=M_PI/6; beta=M_PI/3;


y[1]=y[2]=y[3]=-a/3.; */Вот здесь почему делим на 3*/
y[0]=-2*y[1]; */Зачем умножаем на 2*/
o=2*a*sin(M_PI_4); /* оркужность с центром в т. (o,0,o) */
do
{cleardevice();
/* рисуем оси */
setcolor(LIGHTBLUE);
i=yc*cos(M_PI/6);
j=yc*1.5;
line(xc,yc,xc,0);
line(xc,yc,xc+i,j);
line(xc,yc,xc-i,j);
setcolor(LIGHTRED);
outtextxy(xc-10,2,"y");
outtextxy(xc+i-5,j-14,"x");
outtextxy(xc-i,j-14,"z");
setcolor(LIGHTGREEN);

/* определяем вершины через координаты центра тетраэдра */
x[0]=xt;
x[1]=xt;
x[2]=xt-a/2.;
x[3]=xt+a/2.;
z[0]=zt;
z[1]=zt+a/sqrt(3);
z[2]=zt-a/(2*sqrt(3));
z[3]=z[2];
/* пересчитываем координаты в экранные */
for(i=0;i<4;i++)
{x1[i]=x[i]*cos(alpha)-z[i]*sin(alpha)+xc;
y1[i]=x[i]*sin(alpha)*cos(beta)+z[i]*cos(alpha)*cos(beta)-y[i]*sin(beta)+yc;
z1[i]=x[i]*sin(alpha)*sin(beta)+z[i]*cos(alpha)*sin(beta)+y[i]*cos(beta); }

/* рисуем тетраэдр */
for(i=1;i<4;i++)
{if((j=i+1)==4) j=1;
line(x1[i],y1[i],x1[j],y1[j]);
line(x1[i],y1[i],x1[0],y1[0]);
}
x1[0]=xt*cos(alpha)-zt*sin(alpha)+xc;
y1[0]=xt*sin(alpha)*cos(beta)+zt*cos(alpha)*cos(beta)+yc;
putpixel(x1[0],y1[0],15);

/* вычисляем новые координаты тетраэдра */
xt-=o;
zt-=o;
x1[0]=xt*cos(theta)+zt*sin(theta);
z1[0]=-xt*sin(theta)+zt*cos(theta);
xt=x1[0]+o;
zt=z1[0]+o;
delay(10);
ch=inportb(0x60);
}
while(ch!=1);
closegraph();
}



Сообщение отредактировано: Neon6868 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата(Neon6868 @ 15.12.2008 13:23) *
Объясните плиз зачем при нахождении трех координат Y, мы делим сторону на 3, и для одной координаты умножаем найденную координату на 2. Эти места выделены в программе.
Возможно, автор задавал начальные координаты, отталкиваясь от длины медианы, которую положил равной 50, но при этом он сделал ошибку. Он (похоже) считал, что медианы в тетраэдре делятся в отношении 2:1, а это неверно. Они делятся как 3:1. Поэтому центр у него реально не должен был попасть в начало координат. Если я, конечно, правильно догадался.. smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Помогите плиз исправить программу, чтобы тетраэдр вращался по окружности радиусом 2 с центром в начале координат, а не как сейчас с центром окружности в другой точке.

Вот программа:
#include <graphics.h>
#include <dos.h>
#include <math.h>
#include <alloc.h>
void main()
{int gdriver=0,gmode,xc,yc,a=50,i,j;
float x[4],y[4],z[4],x1[4],y1[4],z1[4],alpha,beta,o,d;
float xt=0,zt=0,theta=0.05;
unsigned char ch;
initgraph(&gdriver,&gmode,"");
xc=getmaxx()/2;
yc=getmaxy()/2;
alpha=M_PI/6; beta=M_PI/3;

y[1]=y[2]=y[3]=-a/3.;
y[0]=-2*y[1];
o=2*a*sin(M_PI/4);
do
{cleardevice();
setcolor(BLUE);
i=yc*cos(M_PI/6);
j=yc*1.5;
line(xc,yc,xc,0);
line(xc,yc,xc+i,j);
line(xc,yc,xc-i,j);
setcolor(RED);
outtextxy(xc-10,2,"y");
outtextxy(xc+i-5,j-14,"x");
outtextxy(xc-i,j-14,"z");
setcolor(GREEN);

x[0]=xt;
x[1]=xt;
x[2]=xt-a/2.;
x[3]=xt+a/2.;
z[0]=zt;
z[1]=zt+a*(-0.4);
z[2]=zt-a*(-0.3);
z[3]=z[2];
for(i=0;i<4;i++)
{x1[i]=x[i]*cos(alpha)-z[i]*sin(alpha)+xc;
y1[i]=x[i]*sin(alpha)*cos(beta)+z[i]*cos(alpha)*cos(beta)-y[i]*sin(beta)+yc;
z1[i]=x[i]*sin(alpha)*sin(beta)+z[i]*cos(alpha)*sin(beta)+y[i]*cos(beta); }

for(i=1;i<4;i++)
{
if((j=i+1)==4) j=1;
line(x1[i],y1[i],x1[j],y1[j]);
line(x1[i],y1[i],x1[0],y1[0]);
}

x1[0]=xt*cos(alpha)-zt*sin(alpha)+xc;
y1[0]=xt*sin(alpha)*cos(beta)+zt*cos(alpha)*cos(beta)+yc;
putpixel(x1[0],y1[0],15);

xt-=o;
zt-=o;

x1[0]=xt*cos(theta)+zt*sin(theta);
z1[0]=-xt*sin(theta)+zt*cos(theta);
xt=x1[0]+o;
zt=z1[0]+o;
delay(10);
ch=inportb(0x60);
}
while(ch!=1);
closegraph();
}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Я ошибся, вращается вроде правильно, но неправильно сделано направление проектирования. Необходимо каким-то образом вычислить значения переменных alpha и beta. Подскажите как это сделать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 14.05.2024 20:08
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name