利用Turbo C进行平面二维图形的平移,旋转,缩放,对称
2017-10-27 07:40
686 查看
【实验内容】
以矩阵运算为数学基础,采用旋转、平移、缩放、对称等基本几何变换,对一简单的二维图形做变换。
【实验步骤】
1. 编写二维图形基本变换(包括旋转、平移、缩放、对称)的通用子程序;
2. 以(540,240)为原点建立图形变换的参考坐标系;
3. 以P1(540,240)、P2(650,150)、P3(560,120)为顶点绘制三角形,调用以上的通用子程序实现图形变换,并输出变换结果;
4. 上机调试程序,显示最终结果。
![](https://img-blog.csdn.net/20171027100714254?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFsYWxhODg2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
程序说明:
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};
![](https://img-blog.csdn.net/20171027100748600?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFsYWxhODg2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
程序说明:
1.数组int pingyi[3][3]={1,0,0,0,1,0,-100,-100,1};
存放的是向左平移 (x-100,y-100)的齐次坐标矩阵。
![](https://img-blog.csdn.net/20171027100800007?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFsYWxhODg2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
程序说明:
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};
![](https://img-blog.csdn.net/20171027100814777?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFsYWxhODg2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
程序说明:
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};
以矩阵运算为数学基础,采用旋转、平移、缩放、对称等基本几何变换,对一简单的二维图形做变换。
【实验步骤】
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=24 cb21 0; 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; }
相关文章推荐
- 七、Sketchup用ruby进行二次开发--利用Transformation实现Move工具(平移、旋转和缩放)
- 使用GDI+变换矩阵实现图形的平移、缩放及旋转
- Android对图片进行平移,缩放,旋转操作
- 计算机图形学之二维平移旋转缩放代码
- [置顶] 第四节 WebGL中的图形变换:旋转、平移和缩放
- 【图形处理】如何将一个平面图形按照角度往z轴扭曲【2】-根据左右上下四个边进行旋转
- IOS 改变图形上下文中的形状:平移、缩放、旋转
- 【J2me3D系列学习文章之三】(立即模式)对立方体进行变换操作-旋转、缩放、平移
- Android单点触控技术,对图片进行平移,缩放,旋转操作
- Android单点触控对图片进行平移,缩放,旋转操作
- perl-opengl基本图形操作-缩放,二维旋转,二维平移
- Android 利用Matrix实现图片随手指平移、旋转、缩放
- Android 利用Matrix实现图片随手指平移、旋转、缩放
- 七 iOS之 矩阵操作(图形上下文的平移、缩放、旋转)
- ios-day02-03(使用transform对按钮进行平移、缩放、旋转)
- WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示
- 【转载】使用GDI+变换矩阵实现图形的平移、缩放及旋转
- unity3d对材质球的uv进行平移,缩放和旋转
- 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等
- iOS 图形上下文的矩阵操作(平移、旋转、缩放)