rotate object

شروع موضوع توسط longhornn ‏28 فوریه 2006 در انجمن خانواده C++ , C

  1. longhornn

    longhornn کاربر تازه وارد

    تاریخ عضویت:
    ‏28 فوریه 2006
    نوشته ها:
    1
    تشکر شده:
    0
    توي ++c براي rotate يك object از كدوم توابع ميشه استفاده كرد.
    هر كي اسم تابع رو ميگه طرز استفاده از اون يا يه مثال هم بگه خيلي لطف كرده.
    ممنون.
     
  2. saalek

    saalek مدیر بازنشسته

    تاریخ عضویت:
    ‏24 می 2005
    نوشته ها:
    654
    تشکر شده:
    53
    محل سکونت:
    در پاي كوهپايه ها
    در كد زير امكاناتي براي چرخش اشكال در محيط گرافيكي وجود دارد. كه خيلي كامل و مجهز است. اميدوارم كمك كنه.
    كد منبع را من كمي تغيير دادم تا با توربوسي اجرا بشه. با پسوند cpp اجرا كردم.
    منبع:
    http://www.sourcecodesworld.com/source/show.asp?ScriptID=1179

    [​IMG]

    .

    کد:
    #include<stdio.h>
    #include<iostream.h>
    #include<dos.h>
    #include<process.h>
    #include<conio.h>
    #include<graphics.h>
    #include<math.h>
    
    //void render(float,float,float, float,float,float,float,float,float,float,float,float);
    void initialize(void);
    void firstpage(void);
    void call_first(void);
    float intensity,alpha,thita,tempy,tempz,tempx;
    char ch='4';
    char ch1='1';
    char ch2='1';
    int pts1[5][3];
    float tx,ty,tz,d=.5;
    void assign(float,float,float,float,float,float,float,float,float);
    void scan_line(float,float,float,float,float,float,float,float,float);
    void drawpyramid(float,float,float,float,float,float);
    void call_assign(void);
    void display(void);
    void tranform(void);
    void draw(void);
    void drawscale(void);
    float pts[5][3]={-100,0,0, 0,0,45, 100,0,0, 0,0,-45, 0,130,0};
    float pts2[5][3]={228,273,0, 305,295,0, 428,273,0, 350,250,0 
    ,328,143,0};
    float pt[5][3]={-100,0,0, 0,0,45,100,0,0,0,0-45,0,130,0};
    
    void main()
    {
     int i;
     float sx,sy,sz=1;
     struct palettetype pal;
     int gd,gm;
     detectgraph(&gd,&gm);
    		initgraph(&gd,&gm,"c:\\tc\\bgi");
     getpalette(&pal);
     firstpage();
     for(i=16;i>0;i--)
                       setrgbpalette(pal.colors[i],0,4*i,0);
    
    
    L1: display();
    
    while(ch1!='4')
    {
     ch='2';
     L2:    call_assign();
     clearviewport();
     gotoxy(1,2);
     cout<<"1. Translation";
     cout<<"2. Rotation";
     cout<<"3. Scaling ";
     cout<<"4. Back   ";
     ch1=getch();
     if(ch1=='4')
     {
                     clearviewport();
                     goto L1;
     }
    
     if(ch1=='1')
     {
     clearviewport();
     while(ch1!='4')
     {
                     gotoxy(2,2);
    		 cout<<"a. X+";  cout<<" b. X-";
    		 cout<<" c. Y+"; cout<<" d. Y- ";
    		 cout<<" e. Z+"; cout<<" f. Z-";
    		 cout<<" g. Back";
                     call_assign();
                     ch1=getch();
                     clearviewport();
                     if(ch1=='g')
                     goto L2;
                     if(ch1=='a')
                      tx=5;
                     if(ch1=='b')
                      tx=-5;
                     if(ch1=='c')
                      ty=5;
                     if(ch1=='d')
                      ty=-5;
                     if(ch1=='e')
                      tz=10;
                     if(ch1=='f')
                      tz=-10;
    
                     for(i=0;i<5;i++)
                      {
                    pts[i][0]+=tx;
                    pts[i][1]+=ty;
                    pts[i][1]+=tz;
                      }
                    }
                    }
                    if(ch1=='3')
                    {
                                     clearviewport();
                                     cout<<"Enter sx:";
                                     cin>>sx;
                                     cout<<"Enter sy:";
                                     cin>>sy;
                                     for(i=0;i<5;i++)
                                     {
                     pts2[i][0]=abs(pts2[i][0]*sx+200*(1-sx));
                     pts2[i][1]=abs(pts2[i][1]*sy+200*(1-sy));
                                     }
                                     drawscale();
                                     getch();
                    }
    
    if(ch1=='2')
    {
                    while(ch2!='4')
                    {
                    clearviewport();
                    gotoxy(1,2);
    		cout<<"1.X-axis rotation";
    		gotoxy(1,3);
    		cout<<"2.Y-axis rotation";
    		gotoxy(1,4);
    		cout<<"3.Z-axis rotation";
    		gotoxy(1,5);
                    cout<<"4.Back";
                    ch2=getch();
                    if(ch2=='4')
                                      break;
                    if(ch2=='1')
                                      {
                      alpha=0;
                      while(alpha<360)
                      {
                                       alpha=alpha+10;
                                       thita=(alpha*3.142)/180;
                                       initialize();
                                       for(i=0;i<5;i++)
                                       {
    
    tempy=(pts1[i][1]*cos(thita)+pts1[i][2]*sin(thita));
    
    pts1[i][2]=(pts1[i][1]*sin(thita)-pts1[i][2]*cos(thita));
                                      pts1[i][1]=tempy;
                                       }
                                      clearviewport();
                                      draw();
                                      delay(100);
                     }
                                     }
    
                                      if(ch2=='2')
                                      {
                      alpha=0;
    		  while(alpha<360)
                      {
                                       alpha=alpha+10;
                                       thita=(alpha*3.142)/180;
                                       initialize();
                                       for(i=0;i<5;i++)
                                       {
    
    tempz=(pts1[i][2]*cos(thita)+pts1[i][0]*sin(thita));
    
    pts1[i][0]=(pts1[i][2]*sin(thita)-pts1[i][0]*cos(thita));
                                      pts1[i][2]=tempz;
                                       }
                                      clearviewport();
                                      draw();
                                      delay(100);
                     }
                                     }
    
                    if(ch2=='3')
                    {
                                     alpha=0;
                                     while(alpha<360)
                                     {
                                                      alpha=alpha+10;
                                                      
    thita=(alpha*3.142)/180;
                                                      initialize();
                                                      for(i=0;i<5;i++)
                                                      {
    
    tempx=(pts1[i][0]*cos(thita)-pts1[i][1]*sin(thita));
    
    pts1[i][1]=(pts1[i][0]*sin(thita)+pts1[i][1]*cos(thita));
                                      pts1[i][0]=tempx;
                                                      }
                                                      clearviewport();
                                                      draw();
                                                      delay(100);
                                                      clearviewport();
                                                      draw();
                      }
                                      }
    
    }
    }
    }
    closegraph();
    restorecrtmode();
    }
    void initialize()
    {
     pts1[0][0]=-100;
     pts1[0][1]=-65;
     pts1[0][2]=0;
     pts1[1][0]=0;
     pts1[1][1]=-65;
     pts1[1][2]=-45;
     pts1[2][0]=100;
     pts1[2][1]=-65;
     pts1[2][2]=0;
     pts1[3][0]=0;
     pts1[3][1]=-65;
     pts1[3][2]=45;
     pts1[4][0]=0;
     pts1[4][1]=65;
     pts1[4][2]=0;
    
    }
    
    void firstpage()
    {
                    clearviewport();
                    setcolor(WHITE);
                    settextstyle(2,HORIZ_DIR,5);
                    outtextxy(250,15,"A Project on");
                    setcolor(GREEN);
                    settextstyle(3,HORIZ_DIR,4);
                    outtextxy(170,25,"PYRAMID MODELING");
                    rectangle(300,120,580,320);
                    rectangle(295,115,585,325);
                    setcolor(6);
                    settextstyle(4,HORIZ_DIR,3);
                    outtextxy(50,100, "OPTIONS");
                    settextstyle(3,HORIZ_DIR,1);
                    setcolor(11);
                    outtextxy(20,150,"1. VISIBLE SURFACE DETECTION");
                    outtextxy(20,190,"2. SURFACE RENDERING");
                    outtextxy(20,230,"3. TRANSFORMATIONS");
                    outtextxy(20,270,"4. WIREFRAME DISPLAY");
                    outtextxy(20,310,"5. EXIT");
                    settextstyle(2,HORIZ_DIR,4);
                    outtextxy(400,370,"Group Memebers");
                    setcolor(YELLOW);
                    outtextxy(410,385,"Made By Niket Shah");
    
                    call_first();
                    //display();
                    setcolor(WHITE);
                    getch();
                    cleardevice();
                    clearviewport();
    
    }
    
    void display(void)
    { while(ch!='3')
     {   clearviewport();
                                     gotoxy(2,2);
    				 cout<<"1. Visible Surface Detection ";
    				 gotoxy(2,3);
    				 cout<<"2. Surface Rendering";
    				 gotoxy(2,4);
    				 cout<<"3. Transformations";
    				 gotoxy(2,5);
    				 cout<<"4. Wireframe Display";
    				 gotoxy(2,6);
    				 cout<<"5. Exit             ";
                                     call_assign();
                                     ch=getch();
                                     if(ch=='5')
                                     exit(0);
                                     clearviewport();
                                     if(ch=='3')
                                     break;
     }
    }
    void call_assign(void)
    {
    assign(pts[0][0],pts[0][1],pts[0][2],pts[1][0],pts[1][1],pts[1][2],pts[4][
    0],pts[4][1],pts[4][2]);
    
    assign(pts[1][0],pts[1][1],pts[1][2],pts[2][0],pts[2][1],pts[2][2],pts[4][
    0],pts[4][1],pts[4][2]);
    
    assign(pts[2][0],pts[2][1],pts[2][2],pts[3][0],pts[3][1],pts[3][2],pts[4][
    0],pts[4][1],pts[4][2]);
    
    assign(pts[0][0],pts[0][1],pts[0][2],pts[4][0],pts[4][1],pts[4][2],pts[3][
    0],pts[3][1],pts[3][2]);
    }
    void call_first(void)
    {
    assign(pt[0][0],pt[0][1],pt[0][2],pt[1][0],pt[1][1],pt[1][2],pt[4][0],pt[4
    ][1],pt[4][2]);
    
    assign(pt[1][0],pt[1][1],pt[1][2],pt[2][0],pt[2][1],pt[2][2],pt[4][0],pt[4
    ][1],pt[4][2]);
    
    assign(pt[2][0],pt[2][1],pt[2][2],pt[3][0],pt[3][1],pt[3][2],pt[4][0],pt[4
    ][1],pt[4][2]);
    
    assign(pt[0][0],pt[0][1],pt[0][2],pt[4][0],pt[4][1],pt[4][2],pt[3][0],pt[3
    ][1],pt[3][2]);
    }
    
    
    
    
    
    
    void drawpyramid(float x1,float y1,float x2,float y2,float x3,float y3)
    {
     line(x1,y1,x2,y2);
     line(x2,y2,x3,y3);
     line(x3,y3,x1,y1);
    }
    
    void assign(float x1,float y1,float z1,float x2,float y2,float z2,float
    x3,float y3,float z3)
    {
     float A,B,C;
     float temp,An,Bn,Cn,X,Y,Z;
     float Xl=-6,Yl=10,Zl=50;
     float templ;
    
    
     A=y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2);
     B=z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2);
     C=x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2);
    
     temp=sqrt(A*A+B*B+C*C);
     templ=sqrt(Xl*Xl+Yl*Yl+Zl*Zl);
    
     X=(float)Xl/templ; Y=(float)Yl/templ; Z=(float)Zl/templ;
     An=(A/temp); Bn=(float)B/temp; Cn=(float)C/temp;
    
     intensity=15*(An*X+Bn*Y+Cn*Z);
    
     if (intensity<0)
     intensity=0;
     if (intensity>15)
     intensity=15;
    
    z1=55-z1;
    x1=x1+300+(d*z1); y1=300-y1-(d*z1);
    z2=55-z2;
    x2=x2+300+(d*z2); y2=300-y2-(d*z2);
    z3=55-z3;
    x3=x3+300+(d*z3); y3=300-y3-(d*z3);
    
     if(ch=='1')
     {  if(intensity==0)  return;
        drawpyramid(x1,y1,x2,y2,x3,y3);
        return;
     }
     if(ch=='3')
     exit(0);
    
     if(ch=='4')
     drawpyramid(x1,y1,x2,y2,x3,y3);
    
     if(ch=='2')
     {
        if(intensity==0)  return;
        if ((y1>y2) && (y1>y3) && (y2>y3))
        scan_line(x1,y1,z1,x2,y2,z2,x3,y3,z3);
    
        if ((y1>y2) && (y1>y3) && (y3>y2))
        scan_line(x1,y1,z1,x3,y3,z3,x2,y2,z2);
    
        if ((y2>y1) && (y2>y3) && (y1>y3))
        scan_line(x2,y2,z2,x1,y1,z1,x3,y3,z3);
    
        if ((y2>y1) && (y2>y3) && (y3>y1))
        scan_line(x2,y2,z2,x3,y3,z3,x1,y1,z1);
    
        if ((y3>y1) && (y3>y2) && (y1>y2))
        scan_line(x3,y3,z3,x1,y1,z1,x2,y2,z2);
    
        if ((y3>y1) && (y3>y2) && (y2>y1))
        scan_line(x3,y3,z3,x2,y2,z2,x1,y1,z1);
     }
    }
    
    void scan_line(float x1,float y1,float z1,float x2,float y2,float 
    z2,float
    x3,float y3,float z3)
    {
     int i;
     float tempx,tempx1,tempy;
     float m1,m2,thita,alpha;
     alpha=0;
    
     tempx=x1; tempx1=x1; tempy=y1;
     m1=(y2-y1)/(x2-x1);
     m2=(y3-y1)/(x3-x1);
    
     while((int)tempy!=(int)y2)
     { alpha=alpha+5;
       thita=(alpha*3.14/180);
       tempx=tempx-1/m1;
       tempx1=tempx1-1/m2;
       if(tempx<tempx1)
       {
       for(i=0;i+tempx<=tempx1;i++)
          {
                      putpixel(tempx+i,tempy,intensity);
          }
       }
       else
       if (tempx1<tempx)
       { for(i=0;i+tempx1<=tempx;i++)
         {
         putpixel(tempx1+i,tempy,intensity);
         }
       }
        tempy--;
     }
    
     m1=(float)(y3-y2)/(x3-x2);
    
     while((int)tempy!=(int)y3)
     {
       tempx=tempx-1/m1;
       tempx1=tempx1-1/m2;
       if(tempx<tempx1)
       {
         for(i=0;i+tempx<=tempx1;i++)
         putpixel(tempx+i,tempy,intensity);
       }
       else
       {
          for(i=0;i+tempx1<=tempx;i++)
          putpixel(tempx1+i,tempy,intensity);
       }
       tempy--;
     }
    }
    
    void draw()
    {   int i;
       for(i=0;i<5;i++)
       {
          pts1[i][2]=50+pts1[i][2]+50;
          pts1[i][0]=pts1[i][0]+300+.5*pts1[i][2];
          pts1[i][1]=200+65-pts1[i][1]-.5*pts1[i][2];
       }
       line(pts1[0][0],pts1[0][1],pts1[1][0],pts1[1][1]);
       line(pts1[1][0],pts1[1][1],pts1[2][0],pts1[2][1]);
       line(pts1[2][0],pts1[2][1],pts1[3][0],pts1[3][1]);
       line(pts1[3][0],pts1[3][1],pts1[0][0],pts1[0][1]);
       line(pts1[0][0],pts1[0][1],pts1[4][0],pts1[4][1]);
       line(pts1[1][0],pts1[1][1],pts1[4][0],pts1[4][1]);
       line(pts1[2][0],pts1[2][1],pts1[4][0],pts1[4][1]);
       line(pts1[3][0],pts1[3][1],pts1[4][0],pts1[4][1]);
    }
    void drawscale()
    {
       line(pts2[0][0],pts2[0][1],pts2[1][0],pts2[1][1]);
       line(pts2[1][0],pts2[1][1],pts2[2][0],pts2[2][1]);
       line(pts2[2][0],pts2[2][1],pts2[3][0],pts2[3][1]);
       line(pts2[3][0],pts2[3][1],pts2[0][0],pts2[0][1]);
       line(pts2[0][0],pts2[0][1],pts2[4][0],pts2[4][1]);
       line(pts2[1][0],pts2[1][1],pts2[4][0],pts2[4][1]);
       line(pts2[2][0],pts2[2][1],pts2[4][0],pts2[4][1]);
       line(pts2[3][0],pts2[3][1],pts2[4][0],pts2[4][1]);
    }
    
     
zarpopخرید بک لینک