计算机图形学关于任意直线的对称变换Word文档格式.docx
- 文档编号:20860392
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:8
- 大小:47.25KB
计算机图形学关于任意直线的对称变换Word文档格式.docx
《计算机图形学关于任意直线的对称变换Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机图形学关于任意直线的对称变换Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
4按逆序求上述
、
变换的逆变换
5将上述矩阵依次相乘得到最终的复合变换矩阵
那么某一多边形关于任意直线的对称变换就转变为将该多边形的各顶点与上述求得的复合变换进展矩阵乘法,求得变换后的新多边形的各个顶点坐标。
根据上述流程,编程实现,并测试程序功能。
源代码:
#include<
iostream>
gl/glut.h>
usingnamespacestd;
voidInitial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}
classCPoint
public:
intx;
inty;
CPoint(){}
CPoint(intx1,inty1)
x=x1;
y=y1;
}
staticCPointZeroMoveToXY(CPointp,CPointXY);
//原始坐标向屏幕坐标XY的平移
staticCPointToZero(CPointp);
//关于原点对称
staticCPointXYMoveToZero(CPointp,CPointXY);
//XY坐标向屏幕坐标的平移
staticCPointCharge_AllLine(CPointp,CPointline_start,CPointline_end);
//关于Ax+By+C=0对称
};
CPointCPoint:
:
ZeroMoveToXY(CPointp,CPointXY)
CPointresult;
intchange[3][3]={{1,0,0},{0,1,0},{-XY.x,-XY.y,1}};
intp1[3]={0,0,0};
for(intj=0;
j<
3;
j++)
{
p1[j]=p.x*change[0][j]+p.y*change[1][j]+change[2][j];
result.x=p1[0];
result.y=p1[1];
returnresult;
ToZero(CPointp)
intchange[3][3]={{-1,0,0},{0,-1,0},{0,0,1}};
XYMoveToZero(CPointp,CPointXY)
intchange[3][3]={{1,0,0},{0,1,0},{XY.x,XY.y,1}};
Charge_AllLine(CPointp,CPointline_start,CPointline_end)
{//关于Ax+By+C=0对称
doubleA,B,C;
if(line_start.x==line_end.x)
A=1;
B=0;
C=-line_start.x;
elseif(line_start.y==line_end.y)
A=0;
B=1;
C=-line_start.y;
else
A=1000/(line_end.x-line_start.x);
B=-1000/(line_end.y-line_start.y);
C=1000*(-line_start.x/(line_end.x-line_start.x)+line_start.y/(line_end.y-line_start.y));
CPointresult;
floatY_f=(-A*B*p.x+A*A*p.y-B*C)/(B*B+A*A);
floatX_f=(-A*B*p.y+B*B*p.x-A*C)/(B*B+A*A);
CPointxy,m1,m2;
xy.x=X_f;
xy.y=Y_f;
m1=CPoint:
ZeroMoveToXY(p,xy);
m2=CPoint:
ToZero(m1);
result=XYMoveToZero(m2,xy);
voidDisplay(void)
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glBegin(GL_LINES);
intn,x,y,i;
cout<
<
"
请输入对称图形的顶点数:
endl;
cin>
>
n;
CPoint*p=newCPoint[n];
for(i=0;
i<
i++)
请输入第"
i+1<
个顶点坐标"
x>
y;
p[i].x=x;
p[i].y=y;
if(i==0||i==1){
glVertex2i(p[i].x,p[i].y);
elseif(i==n-1){
glVertex2i(p[i-1].x,p[i-1].y);
glVertex2i(p[0].x,p[0].y);
else{
请输入对称直线的两个顶点:
CPoint*p2=newCPoint[2];
2;
p2[i].x=x;
p2[i].y=y;
glVertex2i(p2[i].x,p2[i].y);
p[i]=CPoint:
Charge_AllLine(p[i],p2[0],p2[1]);
}
glEnd();
glFlush();
intmain(intargc,char*argv[])
glutInit(&
argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(0,0);
glutCreateWindow("
矩形"
);
glutDisplayFunc(Display);
Initial();
glutMainLoop();
return0;
实验结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 关于 任意 直线 对称 变换