用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");
}
}
}
运行结果:
测试一:
请输入 3 个点代表三角形的三个顶点:
pt[0].x: 60
pt[0].y: 50
pt[0].z: 50
pt[1].x: 80
pt[1].y: 100
pt[1].z: 100
pt[2].x: 40
pt[2].y: 70
pt[2].z: 70
输入旋转轴向量的起始坐标和终止坐标:
startp.x: 1
startp.y: 2
startp.z: 3
endp.x: 4
endp.y: 6
endp.z: 8
输入旋转的角度:
30
平移矩阵的逆
1.000000 0.000000 0.000000 -1.000000
0.000000 1.000000 0.000000 -2.000000
0.000000 0.000000 1.000000 -3.000000
0.000000 0.000000 0.000000 1.000000
平移矩阵
1.000000 0.000000 0.000000 1.000000
0.000000 1.000000 0.000000 2.000000
0.000000 0.000000 1.000000 3.000000
0.000000 0.000000 0.000000 1.000000
构建新坐标系A
-0.800000 0.600000 0.000000 0.000000
-0.424264 -0.565685 0.707107 0.000000
0.424264 0.565685 0.707107 0.000000
0.000000 0.000000 0.000000 1.000000
求新坐标系A的转置(逆)
-0.800000 -0.424264 0.424264 0.000000
0.600000 -0.565685 0.565685 0.000000
0.000000 0.707107 0.707107 0.000000
0.000000 0.000000 0.000000 1.000000
旋转矩阵
0.866025 -0.500000 0.000000 0.000000
0.500000 0.866025 0.000000 0.000000
0.000000 0.000000 1.000000 0.000000
0.000000 0.000000 0.000000 1.000000
平移的逆 * A的转置
-0.800000 -0.424264 0.424264 1.000000
0.600000 -0.565685 0.565685 2.000000
0.000000 0.707107 0.707107 3.000000
0.000000 0.000000 0.000000 1.000000
平移的逆 * A的转置 * 旋转矩阵R
-0.904952 0.032577 0.424264 1.000000
0.236773 -0.789898 0.565685 2.000000
0.353553 0.612372 0.707107 3.000000
0.000000 0.000000 0.000000 1.000000
平移的逆 * A的转置 * 旋转矩阵R * A
0.890141 -0.321399 0.323035 1.000000
0.385707 0.908897 -0.158542 2.000000
-0.242650 0.265722 0.933013 3.000000
0.000000 0.000000 0.000000 1.000000
平移的逆 * A的转置 * 旋转矩阵R * A * 平移
0.890141 -0.321399 0.323035 -0.216447
0.385707 0.908897 -0.158542 0.272125
-0.242650 0.265722 0.933013 -0.087832
0.000000 0.000000 0.000000 1.000000
旋转后点0的坐标为:
53.273783
60.932316
45.289877
1.000000
旋转后点1的坐标为:
71.158380
106.164216
100.373599
1.000000
旋转后点2的坐标为:
35.503678
68.225272
74.117575
1.000000
Press any key to continue
测试二:
请输入 3 个点代表三角形的三个顶点:
pt[0].x: 60
pt[0].y: 50
pt[0].z: 50
pt[1].x: 80
pt[1].y: 100
pt[1].z: 100
pt[2].x: 40
pt[2].y: 70
pt[2].z: 70
输入旋转轴向量的起始坐标和终止坐标:
startp.x: 1
startp.y: 2
startp.z: 3
endp.x: 4
endp.y: 6
endp.z: 8
输入旋转的角度:
0
平移矩阵的逆
1.000000 0.000000 0.000000 -1.000000
0.000000 1.000000 0.000000 -2.000000
0.000000 0.000000 1.000000 -3.000000
0.000000 0.000000 0.000000 1.000000
平移矩阵
1.000000 0.000000 0.000000 1.000000
0.000000 1.000000 0.000000 2.000000
0.000000 0.000000 1.000000 3.000000
0.000000 0.000000 0.000000 1.000000
构建新坐标系A
-0.800000 0.600000 0.000000 0.000000
-0.424264 -0.565685 0.707107 0.000000
0.424264 0.565685 0.707107 0.000000
0.000000 0.000000 0.000000 1.000000
求新坐标系A的转置(逆)
-0.800000 -0.424264 0.424264 0.000000
0.600000 -0.565685 0.565685 0.000000
0.000000 0.707107 0.707107 0.000000
0.000000 0.000000 0.000000 1.000000
旋转矩阵
1.000000 0.000000 0.000000 0.000000
0.000000 1.000000 0.000000 0.000000
0.000000 0.000000 1.000000 0.000000
0.000000 0.000000 0.000000 1.000000
平移的逆 * A的转置
-0.800000 -0.424264 0.424264 1.000000
0.600000 -0.565685 0.565685 2.000000
0.000000 0.707107 0.707107 3.000000
0.000000 0.000000 0.000000 1.000000
平移的逆 * A的转置 * 旋转矩阵R
-0.800000 -0.424264 0.424264 1.000000
0.600000 -0.565685 0.565685 2.000000
0.000000 0.707107 0.707107 3.000000
0.000000 0.000000 0.000000 1.000000
平移的逆 * A的转置 * 旋转矩阵R * A
1.000000 -0.000000 0.000000 1.000000
-0.000000 1.000000 0.000000 2.000000
0.000000 0.000000 1.000000 3.000000
0.000000 0.000000 0.000000 1.000000
平移的逆 * A的转置 * 旋转矩阵R * A * 平移
1.000000 -0.000000 0.000000 -0.000000
-0.000000 1.000000 0.000000 0.000000
0.000000 0.000000 1.000000 0.000000
0.000000 0.000000 0.000000 1.000000
旋转后点0的坐标为:
60.000000
50.000000
50.000000
1.000000
旋转后点1的坐标为:
80.000000
100.000000
100.000000
1.000000
旋转后点2的坐标为:
40.000000
70.000000
70.000000
1.000000
Press any key to continue
自己的作业,做完了发出来分享下
C# 冒泡排序
情殇
所谓偶像
说实在的
不过是个依赖
一个精神的寄托
每个人的心里总是需要个依靠的
当一个人
缺少依靠时
才会去崇拜所谓的偶像
偶像
也是一种现实的转换
或者说的是一种表现形式吧
当喜欢上一个人又不敢去追的时候
就会努力去寻找“偶像”
或许
通过它
能找到些许她的影子
也可以放声呐喊
我喜欢她...
没人会说你是花痴
因为这个很正常
现在的影星歌星要是没有所谓的fans
他们又靠什么活呢
说来说去
这是一种变相的逃避现实
当一个人无法或不敢直视残酷的现实的时候
就往往容易用上以上所谓的方法去寻找寄托
一种心灵的慰藉
每日奔波劳累
说是为了它
其实是为了她
其实不过只是个
借口...借口...
每天这样着欺骗自己
但心里最清楚的又何尝不是自己呢
突破
心里总是写着突破
而行动上呢
依然还是那样的平静
如水...
曾经想过放弃
你都未曾努力过就放弃了?
于是又鼓起勇气...
到喉咙却又降下去
如此反复...
就像一个死循环
总也跳不出
却又结束不了
就这样
一个学期
两个学期...
就这么过了
得到些什么呢!
没有
什么都没有
心情呢?
却是日渐的压抑,
看着屏幕里闪出一串串关于她的文字
心在快速的跳动
是因为紧张而不安
还是因为激动而加速...
自己分不清
qq
整日挂着
看着一个个跳动的头像
没有一个是她的
无聊
隐身
偶尔她的头像突然跳进视野
那颗落寞的心随之一跳
接着
是一阵不安
欲言又止
惶惶的下线
一句话也没留
用Opengl画圆
#include
#include
#include
const int n = 360;
const GLfloat R = 20.0f;
const GLfloat Pi = 3.1415926536f;
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,400.0,0.0,300.0);
}
void myDisplay(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0,0.0,0.0);
glTranslatef(100.0,150.0,-0.0); //平移函数,确定圆心
glBegin(GL_POINTS);
for(i=0; i
glEnd();
glFlush();
}
void main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(50,100);
glutInitWindowSize(800,600);
glutCreateWindow("circle");
init();
glutDisplayFunc(myDisplay);
glutMainLoop();
}
贴个源码,希望对opengl初学者有所帮助...
用OpenGL画旋转矩形