- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(计算机图形学)关于任意直线的对称变换
实验3:关于任意直线的对称变换
实验类型:验证、设计
所需时间:3学时
主要实验内容及要求:
对于任意直线的二维图形对称变化的实验,要求输入的直线是任意直线,直线的端点只能由键盘输入或者鼠标拾取,要做对称变换的图形也是一个任意图形(至少应是一个任意多边形)。
对称变换,先分析如何使用一系列简单变换来构造题目要求的复合变换。本体要实现的变换可以用如下一组变换组合来实现:
将直线任一点移至与坐标原点重合
将平移后的直线绕原点旋转至与某一坐标轴重合
将题目要求的对称变换转为实现已知图形关于上述坐标轴的对称变换
按逆序求上述①、②变换的逆变换
将上述矩阵依次相乘得到最终的复合变换矩阵
则某一多边形关于任意直线的对称变换就转变为将该多边形的各顶点与上述求得的复合变换进行矩阵乘法,求得变换后的新多边形的各个顶点坐标。
根据上述流程,编程实现,并测试程序功能。
源代码:
#includeiostream
#includegl/glut.h
using 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 CPoint
{
public:
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 change[3][3] = {{1,0,0},{0,1,0},{-XY.x,-XY.y,1}};
int p1[3] = {0,0,0};
for (int j = 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];
return result;
}
CPoint CPoint::ToZero(CPoint p)
{
//关于原点对称
CPoint result;
int change[3][3] = {{-1,0,0},{0,-1,0},{0,0,1}};
int p1[3] = {0,0,0};
for (int j = 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];
return result;
}
CPoint CPoint::XYMoveToZero(CPoint p, CPoint XY)
{
//XY坐标向屏幕坐标的平移
CPoint result;
int change[3][3] = {{1,0,0},{0,1,0},{XY.x,XY.y,1}};
int p1[3] = {0,0,0};
for (int j = 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];
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
文档评论(0)