(计算机图形学)关于任意直线的对称变换.doc

上传人:w****2 文档编号:6565117 上传时间:2020-02-29 格式:DOC 页数:6 大小:56KB
返回 下载 相关 举报
(计算机图形学)关于任意直线的对称变换.doc_第1页
第1页 / 共6页
(计算机图形学)关于任意直线的对称变换.doc_第2页
第2页 / 共6页
(计算机图形学)关于任意直线的对称变换.doc_第3页
第3页 / 共6页
点击查看更多>>
资源描述
实验3:关于任意直线的对称变换实验类型:验证、设计所需时间:3学时主要实验内容及要求:对于任意直线的二维图形对称变化的实验,要求输入的直线是任意直线,直线的端点只能由键盘输入或者鼠标拾取,要做对称变换的图形也是一个任意图形(至少应是一个任意多边形)。对称变换,先分析如何使用一系列简单变换来构造题目要求的复合变换。本体要实现的变换可以用如下一组变换组合来实现: 将直线任一点移至与坐标原点重合 将平移后的直线绕原点旋转至与某一坐标轴重合 将题目要求的对称变换转为实现已知图形关于上述坐标轴的对称变换 按逆序求上述、变换的逆变换 将上述矩阵依次相乘得到最终的复合变换矩阵 则某一多边形关于任意直线的对称变换就转变为将该多边形的各顶点与上述求得的复合变换进行矩阵乘法,求得变换后的新多边形的各个顶点坐标。根据上述流程,编程实现,并测试程序功能。源代码:#include#includeusing namespace std;void Initial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);class CPointpublic: int x;int y;CPoint()CPoint(int x1,int y1)x=x1; y=y1; static CPoint ZeroMoveToXY(CPoint p, CPoint XY);/原始坐标向屏幕坐标XY的平移static CPoint ToZero(CPoint p);/关于原点对称 static CPoint XYMoveToZero(CPoint p, CPoint XY);/XY坐标向屏幕坐标的平移static CPoint Charge_AllLine(CPoint p, CPoint line_start, CPoint line_end);/关于Ax+By+C = 0对称;CPoint CPoint:ZeroMoveToXY(CPoint p, CPoint XY)/原始坐标向屏幕坐标XY的平移CPoint result;int change33 = 1,0,0,0,1,0,-XY.x,-XY.y,1;int p13 = 0,0,0;for (int j = 0;j 3;j+)p1j=p.x * change0j + p.y * change1j + change2j;result.x = p10;result.y = p11;return result;CPoint CPoint:ToZero(CPoint p)/关于原点对称CPoint result;int change33 = -1,0,0,0,-1,0,0,0,1;int p13 = 0,0,0;for (int j = 0;j 3;j+)p1j=p.x * change0j + p.y * change1j + change2j;result.x = p10;result.y = p11;return result;CPoint CPoint:XYMoveToZero(CPoint p, CPoint XY)/XY坐标向屏幕坐标的平移CPoint result;int change33 = 1,0,0,0,1,0,XY.x,XY.y,1;int p13 = 0,0,0;for (int j = 0;j 3;j+)p1j=p.x * change0j + p.y * change1j + change2j;result.x = p10;result.y = p11;return result;CPoint CPoint:Charge_AllLine(CPoint p, CPoint line_start, CPoint line_end)/关于Ax+By+C = 0对称double A,B,C;if(line_start.x = line_end.x)A = 1;B = 0;C = -line_start.x;else if(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);CPoint result;float Y_f = (-A*B*p.x + A*A*p.y - B*C)/(B*B+A*A);float X_f = (-A*B*p.y + B*B*p.x - A*C)/(B*B+A*A);CPoint xy,m1,m2;xy.x=X_f;xy.y = Y_f;m1 = CPoint:ZeroMoveToXY(p, xy);m2 = CPoint:ToZero(m1);result = XYMoveToZero(m2, xy);return result;void Display(void)glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);glBegin(GL_LINES);int n,x,y,i; cout请输入对称图形的顶点数:n; CPoint *p=new CPointn; for(i=0;in;i+) cout请输入第i+1个顶点坐标xy; pi.x=x; pi.y=y; if(i=0|i=1) glVertex2i(pi.x,pi.y); else if(i=n-1) glVertex2i(pi-1.x,pi-1.y); glVertex2i(pi.x,pi.y); glVertex2i(pi.x,pi.y); glVertex2i(p0.x,p0.y); else glVertex2i(pi-1.x,pi-1.y); glVertex2i(pi.x,pi.y); cout请输入对称直线的两个顶点:endl;CPoint *p2=new CPoint2;for(i=0;i2;i+)cout请输入第i+1个顶点坐标xy; p2i.x=x; p2i.y=y;glVertex2i(p2i.x,p2i.y); for(i=0;in;i+)pi=CPoint:Charge_AllLine(pi, p20, p21);if(i=0|i=1) glVertex2i(pi.x,pi.y); else if(i=n-1) glVertex2i(pi-1.x,pi-1.y); glVertex2i(pi.x,pi.y); glVertex2i(pi.x,pi.y); glVertex2i(p0.x,p0.y); else glVertex2i(pi-1.x,pi-1.y); glVertex2i(pi.x,pi.y); glEnd(); glFlush();int main(int argc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,300);glutInitWindowPosition(0,0);glutCreateWindow(矩形);glutDisplayFunc(Display);Initial(); glutMainLoop();return 0;实验结果:
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 临时分类 > 人文社科


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!