Помощь - Поиск - Пользователи - Календарь
Полная версия: Графика в СИ
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
Neon6868
Необходимо нарисовать параллельную аксонометрическую проекцию равностороннего тетраэдра с единичными ребрами. Центр тетраэдра должен вращаться по окружности радиусом 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 @ 15.12.2008 13:23) *
Объясните плиз зачем при нахождении трех координат Y, мы делим сторону на 3, и для одной координаты умножаем найденную координату на 2. Эти места выделены в программе.
Возможно, автор задавал начальные координаты, отталкиваясь от длины медианы, которую положил равной 50, но при этом он сделал ошибку. Он (похоже) считал, что медианы в тетраэдре делятся в отношении 2:1, а это неверно. Они делятся как 3:1. Поэтому центр у него реально не должен был попасть в начало координат. Если я, конечно, правильно догадался.. smile.gif
Neon6868
Помогите плиз исправить программу, чтобы тетраэдр вращался по окружности радиусом 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();
  }
Neon6868
Я ошибся, вращается вроде правильно, но неправильно сделано направление проектирования. Необходимо каким-то образом вычислить значения переменных alpha и beta. Подскажите как это сделать?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.