0

我有以下 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。请帮忙......

4

1 回答 1

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];
    }
  }
}

将您的矩阵一一相乘(每次乘法使用不同的循环)并再次运行您的程序。

或者

使用此修改后的代码:

#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();
}
于 2013-10-31T14:34:14.560 回答