【实验内容】

以矩阵运算为数学基础,采用旋转、平移、缩放、对称等基本几何变换,对一简单的二维图形做变换。

【实验步骤】

1. 编写二维图形基本变换(包括旋转、平移、缩放、对称)的通用子程序;

2. 以(540,240)为原点建立图形变换的参考坐标系;

3. 以P1(540,240)、P2(650,150)、P3(560,120)为顶点绘制三角形,调用以上的通用子程序实现图形变换,并输出变换结果;

4. 上机调试程序,显示最终结果。

1. 旋转:

程序说明:

1.数组int xz[3][3],存放的是 顺时针旋转90度的齐次坐标矩阵。

如果改为逆时针旋转90度,则齐次坐标矩阵为int xz[3][3]={0,-1,0,1,0,0,0,0,1};

2.int pos[3][3] ={0,0,1,110,-90,1,20,-120,1};直接就是 把P1点平移到坐标原点后,现在三角形的三个点的整体坐标。考虑到平移变换的实质,ans[0][0]+=540;ans[1][0]+=540;ans[2][0]+=540;

ans[0][1]+=240;ans[1][1]+=240;ans[2][1]+=240;

这样操作,直接就等价于与平移矩阵相乘之后的结果。

int pingyi[3][3]={1,0,0,0,1,0,-540,-240,1};

#include <stdio.h>
#include <graphics.h>
#include <math.h>
int p1_x=540,p1_y=240;
int p2_x=650,p2_y=150;
int p3_x=560,p3_y=120;
void xuanzhuan()
{int xz[3][3]={0,1,0,-1,0,0,0,0,1};int pos[3][3] ={0,0,1,110,-90,1,20,-120,1}; int i,j,k,sum;int ans[3][3];for(i=0;i<=2;i++){for(j=0;j<=2;j++){sum = 0;for(k=0;k<=2;k++)sum = sum + pos[i][k]*xz[k][j];ans[i][j] = sum;}}ans[0][0]+=540;ans[1][0]+=540;ans[2][0]+=540;ans[0][1]+=240;ans[1][1]+=240;ans[2][1]+=240;line(ans[0][0],ans[0][1],ans[1][0],ans[1][1]);line(ans[1][0],ans[1][1],ans[2][0],ans[2][1]);line(ans[0][0],ans[0][1],ans[2][0],ans[2][1]);
}
void draw()
{line(p1_x,p1_y,p2_x,p2_y);line(p2_x,p2_y,p3_x,p3_y);line(p1_x,p1_y,p3_x,p3_y);
}
int main()
{int gdriver=DETECT,gmode;initgraph(&gdriver,&gmode,"e:\\TC\\bgi");setcolor(4);setbkcolor(0);draw();xuanzhuan();getchar();closegraph();return 0;
}

2.平移

程序说明:

1.数组int pingyi[3][3]={1,0,0,0,1,0,-100,-100,1};

存放的是向左平移 (x-100,y-100)的齐次坐标矩阵。

#include <stdio.h>
#include <graphics.h>
#include <math.h>
int p1_x=540,p1_y=240;
int p2_x=650,p2_y=150;
int p3_x=560,p3_y=120;
void pingyi()
{int pingyi[3][3]={1,0,0,0,1,0,-100,-100,1};int pos[3][3] ={540,240,1,650,150,1,560,120,1};int i,j,k,sum;int ans[3][3];for(i=0;i<=2;i++){for(j=0;j<=2;j++){sum = 0;for(k=0;k<=2;k++)sum = sum + pos[i][k]*pingyi[k][j];ans[i][j] = sum;}}line(ans[0][0],ans[0][1],ans[1][0],ans[1][1]);line(ans[1][0],ans[1][1],ans[2][0],ans[2][1]);line(ans[0][0],ans[0][1],ans[2][0],ans[2][1]);
}
void draw()
{line(p1_x,p1_y,p2_x,p2_y);line(p2_x,p2_y,p3_x,p3_y);line(p1_x,p1_y,p3_x,p3_y);
}
int main()
{int gdriver=DETECT,gmode;initgraph(&gdriver,&gmode,"e:\\TC\\bgi");setcolor(4);setbkcolor(0);draw();pingyi();getchar();closegraph();return 0;
}

3.缩放

程序说明:

1.数组int sf[3][3],存放的是整体缩放一倍的齐次坐标矩阵。

2.int pos[3][3] ={0,0,1,110,-90,1,20,-120,1};直接就是 把P1点平移到坐标原点后,现在三角形的三个点的整体坐标。考虑到平移变换的实质,ans[0][0]+=540;ans[1][0]+=540;ans[2][0]+=540;

ans[0][1]+=240;ans[1][1]+=240;ans[2][1]+=240;

这样操作,直接就等价于与平移矩阵相乘之后的结果。

int pingyi[3][3]={1,0,0,0,1,0,-540,-240,1};

#include <stdio.h>
#include <graphics.h>
#include <math.h>
int p1_x=540,p1_y=240;
int p2_x=650,p2_y=150;
int p3_x=560,p3_y=120;
void suofang()
{double sf[3][3]={0.5,0,0,0,0.5,0,0,0,1};double pos[3][3] ={0,0,1,110,-90,1,20,-120,1};int i,j,k;double sum;int ans[3][3];for(i=0;i<=2;i++){for(j=0;j<=2;j++){sum = 0;for(k=0;k<=2;k++)sum = sum + pos[i][k]*sf[k][j];ans[i][j] = sum;}}ans[0][0]+=540;ans[1][0]+=540;ans[2][0]+=540;ans[0][1]+=240;ans[1][1]+=240;ans[2][1]+=240;line(ans[0][0],ans[0][1],ans[1][0],ans[1][1]);line(ans[1][0],ans[1][1],ans[2][0],ans[2][1]);line(ans[0][0],ans[0][1],ans[2][0],ans[2][1]);
}
void draw()
{line(p1_x,p1_y,p2_x,p2_y);line(p2_x,p2_y,p3_x,p3_y);line(p1_x,p1_y,p3_x,p3_y);
}
int main()
{int gdriver=DETECT,gmode;initgraph(&gdriver,&gmode,"e:\\TC\\bgi");setcolor(4);setbkcolor(0);draw();suofang();getchar();closegraph();return 0;
}

4.对称

程序说明:

1.数组int dc[3][3],存放的是沿着直线y=x对称的齐次坐标矩阵。

2.int pos[3][3] ={0,0,1,110,-90,1,20,-120,1};直接就是 把P1点平移到坐标原点后,现在三角形的三个点的整体坐标。考虑到平移变换的实质,ans[0][0]+=540;ans[1][0]+=540;ans[2][0]+=540;

ans[0][1]+=240;ans[1][1]+=240;ans[2][1]+=240;

这样操作,直接就等价于与平移矩阵相乘之后的结果。

int pingyi[3][3]={1,0,0,0,1,0,-540,-240,1};

#include <stdio.h>
#include <graphics.h>
#include <math.h>
int p1_x=540,p1_y=240;
int p2_x=650,p2_y=150;
int p3_x=560,p3_y=120;
void duichen()
{int dc[3][3]={0,1,0,1,0,0,0,0,1};int pos[3][3] ={0,0,1,110,-90,1,20,-120,1};int i,j,k,sum;int ans[3][3];for(i=0;i<=2;i++){for(j=0;j<=2;j++){sum = 0;for(k=0;k<=2;k++)sum = sum + pos[i][k]*dc[k][j];ans[i][j] = sum;}}
ans[0][0]+=540;ans[1][0]+=540;ans[2][0]+=540;
ans[0][1]+=240;ans[1][1]+=240;ans[2][1]+=240;line(ans[0][0],ans[0][1],ans[1][0],ans[1][1]);line(ans[1][0],ans[1][1],ans[2][0],ans[2][1]);line(ans[0][0],ans[0][1],ans[2][0],ans[2][1]);
}
void draw()
{line(p1_x,p1_y,p2_x,p2_y);line(p2_x,p2_y,p3_x,p3_y);line(p1_x,p1_y,p3_x,p3_y);
}
int main()
{int gdriver=DETECT,gmode;initgraph(&gdriver,&gmode,"e:\\TC\\bgi");setcolor(4);setbkcolor(0);draw();duichen();getchar();closegraph();return 0;
}

利用Turbo C进行平面二维图形的平移,旋转,缩放,对称相关推荐

  1. WebGL 实践篇(三)—— 二维图形的平移、旋转、缩放

    一 平移 (1)平移直接体现在代码当中 在二维当中,平移相当于就是改变x,y的位置. function setRectangle(gl, x, y, width, height) {var x1 = ...

  2. 图形学 ---- 二维几何变换(二维图形矩阵平移,旋转,缩放)

    二维图形几何变换,矩阵计算 前言:对于一个图形的几何变换,对应的是操作到图形中的每一个点! 即对每一个点做出相应的几何变换.比如平移,就是对二维图形的每个点都平移相同的距离:旋转则是对每一个点,基于基 ...

  3. 二维图形平移变换c语言程序,[转载]计算机图形学Opengl实现二维图形的平移、旋转、缩放复合变换...

    参考课堂教学中关于模型变化的讲解,编写对一个三角形分别实现平移.缩放.旋转等变化的源码及效果图.请以该例为蓝本,实现3题的代码编写. 如下的几幅图,第一幅就是在给出的代码部分进行修改,将GL_FLAT ...

  4. 计算机图形学:二维图形的几何变换(算法原理及代码实现)

    一.实现方案 对于一个二维图形作平移.旋转.放缩变换,可以转换为在二维坐标系中图形的所有点分别可以对应到在x,y轴方向分别平移tx,ty(平移).绕一点旋转固定的角(旋转).在x,y轴方向分别放缩sx ...

  5. 利用Matlab做二维图形和三维图形

    二维图形 1.曲线图 Matlab作图是通过描点.连线来实现的,故在画一个曲线图形之前,必须先取得该图形上的一系列的点的坐标(即横坐标和纵坐标),然后将该点集的坐标传给Matlab函数画图. 命令为: ...

  6. CAD三维图形转化成二维图形的过程具体的步骤

    输入这个命令MSPACE然后再输入这个命令solprof选中你的图纸.然后敲回车,再输入Y敲回车,连续三次.然后回到模型空间.关闭第一第二两个图层,就是你想要的二维图了.把它挪开,然后把关闭的图层打开 ...

  7. 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等

    接上文 计算机图形学 学习笔记(六):消隐算法:Z-buffer,区间扫描线,Warnock,光栅图形学小结 在图形学中,有两大基本工具:向量分析,图形变换.本文将重点讲解向量和二维图形的变换. 5. ...

  8. 计算机图形学-二维图形变换 笔记总结与代码实战

    文章目录 1.向量基础知识 2.图形坐标系 3.二维图形变换原理 4.二维图形几何变换 5.窗口视区变换 基本二维几何变换代码 二维复合变换实战-五星红旗绘制 1.向量基础知识 为什么向量如此重要:在 ...

  9. 计算机图形学二维图形基本变换实验原理,计算机图形学实验:二维图形变换.docx...

    计算机图形学实验:二维图形变换.docx (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实验三 二维图形变换一.实验任务1. 通 ...

最新文章

  1. 3D中的OBJ文件格式详解(转载)
  2. 疑难杂症--单回话下 WITH(NOLOCK)返回更多数据
  3. MySQL/InnoDB处理AUTO_INCREMENT(二)
  4. 【Python基础】Pandas笔记---通过比赛整理出的10条Pandas实用技巧
  5. Thinkphp小知识点
  6. Nginx 性能优化
  7. P4980-[模板]Pólya定理
  8. Android官方开发文档Training系列课程中文版:构建第一款安卓应用之创建用户界面
  9. PartitionStateMachine分析
  10. es6 class语法糖
  11. 下载css-loader 安装及使用
  12. 0xc000007b——应用程序无法正常启动解决办法
  13. 小记:iOS 中一般对于 view 不依赖 model 的的两种代码书写形式
  14. 如何添加虚拟PDF打印机
  15. 基带信号带宽与占空比的关系
  16. python绘制基因结构图_手把手教你从头绘制基因簇结构图
  17. android模拟奥克斯空调红外,奥克斯空调手机遥控器
  18. 关于stm32ADC采集分压电阻取值
  19. 索尼android sd卡上,SD卡各个文件夹功能详解 入手必看经验!!!!
  20. Zabbix 主动/被动 监控

热门文章

  1. NPDP知识推送-第七章产品生周期管理(3)
  2. MATLAB约当标准型,用MATLAB求其约当标准型状态空间表达式
  3. 图算法入门4:活动网络-AOE网络和关键路径(critical path)
  4. Tomcat之——宕机自动重启和每日定时启动tomcat
  5. 搭建个人的GPS定位系统
  6. 使用Javascript无限添加QQ好友原理解析
  7. 天是岸:优秀的网络营销推广人,身上一般都具备这7大特质
  8. 小龟视频APP-插件打包-v1.6.x反编译教程及未加固apk包ios最新版文件分享
  9. 【自然语言处理】【检索】GENER:自回归实体检索
  10. java定义一个eat方法_Java继承概念详细解读