C语言高手帮忙啊!

有两个题目:
[1]输入两个矩阵,实现两矩阵的和、差、积的运算。
[2]绘制一个三角形,并对其实现平移、伸缩、镜射、旋转。
第一个已经会写了,第二个是我们C语言的作业,所以只能用C来做……

/*平移*/
#include <stdio.h>
#include <math.h>

struct point
{
float x;
float y;
};

get_point(struct point *p)
{
float a,b;
scanf("%f,%f",&a,&b);
p->x=a;
p->y=b;
return 0;
}

put_point(struct point a)
{
printf("%f,%f\n",a.x,a.y);
return 0;
}

struct point add(struct point a,struct point b)
{
struct point c;
c.x=a.x+b.x;
c.y=a.y+b.y;
return c;
}

struct point sub(struct point a,struct point b)
{
struct point c;
c.x=a.x-b.x;
c.y=a.y-b.y;
return c;
}

float triangle(struct point A, struct point B, struct point C)
{
float a,b,c,p,area;
struct point d,e,f;
d=sub(A,B);
e=sub(A,C);
f=sub(B,C);

c=sqrt(d.x*d.x+d.y*d.y);
b=sqrt(e.x*e.x+e.y*e.y);
a=sqrt(f.x*f.x+f.y*f.y);

p=(a+b+c)/2;
area=sqrt(p*(p-a)*(p-b)*(p-c));
return area;
}

main()
{
struct point a,b,c,n;
printf("Please input a point:");
get_point(&a);
printf("The Point you input is: ");
put_point(a);

printf("Please input 3 points of triangle :");
get_point(&a);
get_point(&b);
get_point(&c);

printf("The area of triangle is:%f\n",triangle(a,b,c));
printf("输入平移向量坐标:");
get_point(&n);
a=add(a,n);
b=add(b,n);
c=add(c,n);
printf("平移后三角形面积为:%f",triangle(a,b,c));
}

/*旋转*/
#include
#include

#define DIM 4
#define N 1
#define NUM 3
#define PI 3.1415926

typedef struct POINT
{
int x,y,z;
}POINT;

void trans(double matrix[DIM][DIM], double x, double y, double z) //矩阵平移
{
for(int i=0;i {
for(int j=0;j {
if(i==j) matrix[i][j]=1;
else matrix[i][j]=0;
}
}
matrix[0][3]=x;
matrix[1][3]=y;
matrix[2][3]=z;
return;
}
void t(double matrix[][DIM],double matrix1[][DIM]) //矩阵的转置
{
for(int i=0;i {
for(int j=0;j {
matrix[i][j]=matrix1[j][i];
}
}
return;
}
void rotate(double matrix[][DIM],int angle) //矩阵绕 z 坐标轴旋转
{
int n=360;
for(int i=0;i {
for(int j=0;j {
if(i==j) matrix[i][j]=1;
else matrix[i][j]=0;
}
}

matrix[0][0]=cos(2*PI/n*angle);
matrix[1][1]=matrix[0][0];
matrix[0][1]=-sin(2*PI/n*angle);
matrix[1][0]=-matrix[0][1];
return;
}
void new_or(double matrix[][DIM],int px1,int py1,int pz1,int px2,int py2,int pz2) //根据旋转向量,建立坐标系
{
for(int i=0;i {
for(int j=0;j {
if(i==j) matrix[i][j]=1;
else matrix[i][j]=0;
}
}
double px,py,pz,mo,mo1;
px=px2-px1;
py=py2-py1;
pz=pz2-pz1;
mo=sqrt(px*px+py*py+pz*pz);
matrix[2][0]=px/mo;
matrix[2][1]=py/mo;
matrix[2][2]=pz/mo;
mo1=sqrt(px*px+py*py);
matrix[0][0]=-py/mo1;
matrix[0][1]=px/mo1;
matrix[0][2]=0;
matrix[1][0]=matrix[2][1]*matrix[0][2]-matrix[2][2]*matrix[0][1];
matrix[1][1]=matrix[2][2]*matrix[0][0]-matrix[0][2]*matrix[2][0];
matrix[1][2]=matrix[2][0]*matrix[0][1]-matrix[0][0]*matrix[2][1];
return;

}

void phalanx_mul(double matrix[][DIM],double matrix1[][DIM],double matrix2[][DIM])//方阵乘法4*4 * 4*4
{
double mul[DIM][DIM];
for(int i=0;i {
for(int j=0;j {
mul[i][j]=0;
for(int k=0;k {
mul[i][j]+=matrix1[i][k]*matrix2[k][j];
}
}
}
for(i=0;i {
for(int j=0;j {
matrix[i][j]=mul[i][j];
}
}
}
void matrix_mul(double matrix[DIM][N],double matrix1[DIM][DIM],double matrix2[DIM][N])//矩阵乘法4*4 * 4*1
{
for(int i=0;i {
for(int j=0;j {
matrix[i][j]=0;
for(int k=0;k {
matrix[i][j]+=matrix1[i][k]*matrix2[k][j];
}
}
}
return;
}
void main()
{
POINT startp,endp,pt[NUM];
int angle;
double trans1[DIM][DIM]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}},
trans2[DIM][DIM]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}},
matrix[DIM][DIM]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}},
rotate1[DIM][DIM]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}},
matrix1[DIM][N]={0},point[DIM][N]={0},
t1[DIM][DIM]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}},
result[DIM][DIM]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};
printf("请输入 %d 个点代表三角形的三个顶点:\n",NUM);//构建三角形的三个顶点
for(int i=0;i {
printf("pt[%d].x:\t",i);
scanf("%d",&pt[i].x );
printf("pt[%d].y:\t",i);
scanf("%d",&pt[i].y );
printf("pt[%d].z:\t",i);
scanf("%d",&pt[i].z );
}
printf("输入旋转轴向量的起始坐标和终止坐标:\n"); //构建旋转轴坐标
printf("startp.x:\t");
scanf("%d",&startp.x );
printf("startp.y:\t");
scanf("%d",&startp.y );
printf("startp.z:\t");
scanf("%d",&startp.z );
printf("endp.x:\t\t");
scanf("%d",&endp.x );
printf("endp.y:\t\t");
scanf("%d",&endp.y );
printf("endp.z:\t\t");
scanf("%d",&endp.z );
printf("\n输入旋转的角度:\n"); //旋转角度
scanf("%d",&angle);
if(startp.x !=0 && startp.y !=0 && startp.z !=0) //假如向量起始坐标非零
{
trans(trans1, -startp.x, -startp.y, -startp.z);
trans(trans2, startp.x, startp.y, startp.z);
}
printf("\n平移矩阵的逆\n");
for(i=0;i {
for(int j=0;j {
printf("%f\t",trans1[i][j]);
}
printf("\n");
}
printf("\n平移矩阵\n");
for(i=0;i {
for(int j=0;j {
printf("%f\t",trans2[i][j]);
}
printf("\n");
}

new_or(matrix,startp.x ,startp.y ,startp.z ,endp.x ,endp.y ,endp.z );
printf("\n构建新坐标系A\n");
for(i=0;i {
for(int j=0;j {
printf("%f\t",matrix[i][j]);
}
printf("\n");
}

t(t1,matrix);
printf("\n求新坐标系A的转置(逆)\n");
for(i=0;i {
for(int j=0;j {
printf("%f\t",t1[i][j]);
}
printf("\n");
}

rotate(rotate1,angle);
printf("\n旋转矩阵\n");
for(i=0;i {
for(int j=0;j {
printf("%f\t",rotate1[i][j]);
}
printf("\n");
}

phalanx_mul(result,trans2,t1);
printf("\n平移的逆 * A的转置\n");
for(i=0;i {
for(int j=0;j {
printf("%f\t",result[i][j]);
}
printf("\n");
}

phalanx_mul(result,result,rotate1);
printf("\n平移的逆 * A的转置 * 旋转矩阵R\n");
for(i=0;i {
for(int j=0;j {
printf("%f\t",result[i][j]);
}
printf("\n");
}

phalanx_mul(result,result,matrix);
printf("\n平移的逆 * A的转置 * 旋转矩阵R * A\n");
for(i=0;i {
for(int j=0;j {
printf("%f\t",result[i][j]);
}
printf("\n");
}

phalanx_mul(result,result,trans1);
printf("\n平移的逆 * A的转置 * 旋转矩阵R * A * 平移\n");
for(i=0;i {
for(int j=0;j {
printf("%f\t",result[i][j]);
}
printf("\n");
}
for(int k=0;k {
printf("\n旋转后点%d的坐标为:\n",k);
matrix1[0][0]=pt[k].x;
matrix1[1][0]=pt[k].y;
matrix1[2][0]=pt[k].z;
matrix1[3][0]=1;

matrix_mul(point,result,matrix1);

for(i=0;i {
for(int j=0;j {
printf("%f\t",point[i][j]);
}
printf("\n");
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-06-10
这么复杂也不给点分,没有人愿意回答的.
第2个回答  2008-06-10
就是,太抠了。
第3个回答  2008-06-11
【1】 矩阵的运算简单,按照定义,熟悉语言就可以做,又不需要优化算法。
【2】平移:三角形的三个顶点的横纵坐标分别加上对应的平移值。伸缩:如果以其中一个顶点的位置坐标不变的话,该顶点的两条边伸缩求另外两个顶点。旋转:安旋转角度求坐标,要看旋转的参照点。

C语言仅仅是工具!
第4个回答  2008-06-11
【1】学过还好做,【2】不会;

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网