我有以下c ++程序。我必须在逆时针方向以某个角度围绕某个点旋转三角形。我通过以下代码实现这一目标。 我的逻辑是,首先我输入关于旋转发生的点,旋转角度,然后是三角形的坐标。之后,我应用了矩阵公式
M(final coordinates)=M(translate triangle to original position)*M(Rotate triangle)*M(translate triangle to origin)*M(original coordinates)
其中M指上述公式中的矩阵 通过将这些矩阵按相反的顺序相乘,即< - 有人得到了结果。
但是当我运行此代码时,程序会导致异常终止。
我的代码是:
#include<iostream.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
#define pi 3.14159265
void rotation(float tx,float ty,float redi,float t[][3])
{
clrscr();
int g=DETECT,gm;
initgraph(&g,&gm,"C:\\TC\\BGI");
setbkcolor(8);
int i,j,k;
float x[3][3],c[3][3],r[3][3],mf[3][3],res[3][3];
for(j=0;j<3;j++)
{
for(k=0;k<3;k++)
{
if(j==k)
{
r[j][k]=1;
x[j][k]=1;
}
else
{
r[j][k]=0;
x[j][k]=0;
}
}
}
float co,si;
co=cos(redi);
si=sin(redi);
r[0][0]=co; r[0][1]=-si; r[1][0]=si; r[1][1]=co;
x[0][2]=-tx;
x[1][2]=-ty;
for(int mat=0;mat<3;mat++)
{
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(mat==0) c[i][j]=0;
if(mat==1) mf[i][j]=0;
if(mat==2) res[i][j]=0;
for(k=0;k<3;k++)
{
if(mat==0)
c[i][j]+=r[i][k]*x[k][j];
if(mat==1)
{
x[0][2]=tx;
x[1][2]=ty;
mf[i][j]+=x[i][k]*c[k][j];
}
if(mat==2)
res[i][j]+=mf[i][k]*t[k][j];
}
cout<<res[i][j];
}
}
}
line(res[0][0],res[1][0],res[0][1],res[1][1]);
line(t[0][0],t[1][0],t[0][1],t[1][1]);
line(res[0][2],res[1][2],res[0][1],res[1][1]);
line(t[0][2],t[1][2],t[0][1],t[1][1]);
line(res[0][2],res[1][2],res[0][0],res[1][0]);
line(t[0][2],t[1][2],t[0][0],t[1][0]);
for(i=0;i<3;i++)
{
putpixel(res[0][i],res[1][i],RED);
putpixel(t[0][i],t[1][i],RED);
}
closegraph();
getch();
}
void main()
{
clrscr();
float tx,ty,t[3][3];
float deg,redi;
cout<<"Rotation about point : ";
cin>>tx>>ty;
cout<<"Enter angle of rotation :";
cin>>deg;
for(int i=0;i<3;i++)
{
cout<<"Enter co-ordintes "<<i+1<<" of triangle: ";
for(int j=0;j<3;j++)
{
if(j==2)
t[j][i]=1;
else
cin>>t[j][i];
}
}
redi=(deg*pi)/180.0;
rotation(tx,ty,redi,t);
getch();
}
我正在使用TC ++ IDE。 请帮忙......
答案 0 :(得分:1)
我认为你的这些循环中有一些问题检查出来
for(int mat=0;mat<3;mat++)
{
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(mat==0) c[i][j]=0;
if(mat==1) mf[i][j]=0;
if(mat==2) res[i][j]=0;
for(k=0;k<3;k++)
{
if(mat==0)
c[i][j]+=r[i][k]*x[k][j];
if(mat==1)
{
x[0][2]=tx;
x[1][2]=ty;
mf[i][j]+=x[i][k]*c[k][j];
}
if(mat==2)
res[i][j]+=mf[i][k]*t[k][j];
}
cout<<res[i][j];
}
}
}
逐个乘以矩阵(每次乘法使用不同的循环)并再次运行程序。
OR
使用此修改后的代码:
#include<iostream.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
void main()
{
clrscr();
int gd=DETECT,gm;
initgraph(&gd,&gm,"C:\\TC\\BGI");
float x[3][3],y[3][3],z[3][3],p[3][3],q[3][3];
float angle,ptx,pty;
int i,j,k;
cout<<"Enter coordinates of triangle:";
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
cin>>y[j][i];
}
}
y[2][0]=1;
y[2][1]=1;
y[2][2]=1;
cout<<"Enter the point about:";
cin>>ptx>>pty;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(i==j)
x[i][j]=1;
else
x[i][j]=0;
}
}
x[0][2]=-ptx;
x[1][2]=-pty;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
z[i][j]=0;
for(int k=0;k<3;k++)
{
z[i][j]+=x[i][k]*y[k][j];
}
}
}
cout<<"Enter angle of rotation:";
cin>>angle;
angle*=(3.14/180);
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
{
if(i==j)
x[i][j]=1;
else
x[i][j]=0;
}
}
x[0][0]=cos(angle);
x[0][1]=-sin(angle);
x[1][0]=sin(angle);
x[1][1]=cos(angle);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
p[i][j]=0;
for(int k=0;k<3;k++)
{
p[i][j]+=(x[i][k]*z[k][j]);
}
}
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(i==j)
x[i][j]=1;
else
x[i][j]=0;
}
}
x[0][2]=ptx;
x[1][2]=pty;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
q[i][j]=0;
for(int k=0;k<3;k++)
{
q[i][j]+=(x[i][k]*p[k][j]);
}
}
}
clrscr();
line(y[0][0],y[1][0],y[0][1],y[1][1]);
line(y[0][0],y[1][0],y[0][2],y[1][2]);
line(y[0][1],y[1][1],y[0][2],y[1][2]);
line(q[0][0],q[1][0],q[0][1],q[1][1]);
line(q[0][0],q[1][0],q[0][2],q[1][2]);
line(q[0][1],q[1][1],q[0][2],q[1][2]);
getch();
}