图形的几何变换(平移,比例,定点比例)
2015-10-20 19:49
411 查看
#include <graphics.h> #include <stdio.h> typedef struct { int data[20][3]; int m,n; }Matrix; typedef struct { int x; int y; }POINT; typedef struct { POINT point[100]; int num; }Polygon; Matrix multimatrix(Matrix a, Matrix b) { Matrix c; int i,j,k; c.m=a.m; c.n=b.n; for(i=0;i<c.m;i++) for(j=0;j<c.n;j++) { c.data[i][j]=0; for(k=0;k<a.n;k++) c.data[i][j]+=a.data[i][k]*b.data[k][j]; } return c; } Polygon polymultimatrix(Polygon a, Matrix b) { Matrix c,e; Polygon d; int i,j; /* 先将多边形转换为矩形 */ c.m=a.num; c.n=3; for(i=0;i<c.m;i++) { c.data[i][0]=a.point[i].x; c.data[i][1]=a.point[i].y; c.data[i][2]=1; } /* 计算多边形表示的矩形和变换矩阵的乘积 */ e=multimatrix(c,b); /* 将矩阵转换为多边形 */ d.num=e.m; for(i=0;i<d.num;i++) { d.point[i].x=e.data[i][0]; d.point[i].y=e.data[i][1]; } return d; } void printmatrix(Matrix a) { int i,j; for(i=0;i<a.m;i++) { for(j=0;j<a.n;j++) printf("%d ",a.data[i][j]); printf("\n"); } } void draw(Polygon a) { int i=0; /* cleardevice(); for(i=0;i<a.num;i++) printf("%d,%d",a.point[i].x,a.point[i].y); getch(); printf("ok"); i=0; */ while(i<=a.num-2) { line(a.point[i].x,a.point[i].y,a.point[i+1].x,a.point[i+1].y); i=i+1; } line(a.point[a.num-1].x,a.point[a.num-1].y,a.point[0].x,a.point[0].y); } void initmatrix(Matrix * m1) { int i,j; m1->m=3;m1->n=3; for(i=0;i<m1->m;i++) for(j=0;j<m1->n;j++) if(i==j) m1->data[i][j]=1; else m1->data[i][j]=0; } void pingyi(Polygon a, int tx, int ty) { Matrix m1; Polygon p1; initmatrix(&m1); m1.data[2][0]=tx; m1.data[2][1]=ty; p1=polymultimatrix(a, m1); draw(p1); } void bili(Polygon a, int sx, int sy) { Matrix m1; Polygon p1; initmatrix(&m1); m1.data[0][0]=sx; m1.data[1][1]=sy; p1=polymultimatrix(a, m1); draw(p1); } void gubili(Polygon a, int gx, int gy, int sx, int sy) { Matrix m1,m2,m3,m4,m;Polygon p1; /* m=m1*m2*m3 */ initmatrix(&m1); m1.data[2][0]=-gx; m1.data[2][1]=-gy; initmatrix(&m2); m2.data[0][0]=sx; m2.data[1][1]=sy; initmatrix(&m3); m3.data[2][0]=gx; m3.data[2][1]=gy; m4=multimatrix(m1, m2); m4 =multimatrix(m4, m3); p1=polymultimatrix(a, m4); draw(p1); } void main() { int i,j,gdriver=DETECT,gmode; Matrix m1,m2,m3; Polygon b; initgraph(&gdriver,&gmode,""); b.num=4; for(i=0;i<b.num;i++) scanf("%d%d",&b.point[i].x,&b.point[i].y); draw(b); getch(); pingyi(b,100,200); bili(b,2,3);gubili(b, 50, 50, 2, 3); getch(); /* getch(); closegraph(); */ }
相关文章推荐
- 将 nginx 安装成 windows 的方法
- 【软剑攻城队】用户需求分析文档发布!
- 洛谷1281 书的复制
- 让代码帮助我们研发--代码半自动化
- GT and sequence(bc模拟题)
- 优秀程序员的 18 大法则
- UI02_UIButton
- TableViewCell重用机制避免重复显示问题
- 内存管理和泄露
- MiniUI中DataGrid数据的载入
- 判断是否为数组和方法
- 虚拟存储技术
- Mac使用bootcamp安装windows双系统以及mac系统全新重装
- Php 解析XML文件
- awk_从字母数字混排的字符串中将字母和数字分开
- HibernateCallback()
- ListView优化机制及滑动时数据时出现的数据错乱重复问题 .
- 亨元模式
- 什么是内联函数
- 私房库视频学习笔记-小清新BBS系统开发技术归纳 二