图形的一点透视和平移
一点透视
一点透视只有一个主灭点,进行透视投影时,需要很好地考虑图面布局,以避免三维形体的平面或直线积聚成直线或点而影响直观性。具体而言,就是要考虑一下三点:
三维形体与画面(投影面)的相对位置
视距,即视点(投影中心)与画面的距离
视点的高度
为简述方便,假定视点(投影中心)在Z轴上(z=-d处),画面(投影面)在xoy面上,一点透视的步骤如下:
将三维形体平移到适当位置l,m,n
令视点在Z轴,进行投影变换,此时的透视变换矩阵
最后,向xoy面作正投影变换,将结果变换到xoy面上。如此构造的一点透视变换矩阵为
则三维形体中心任意一点(x,y,z)的一点透视变换的齐次坐标计算形式为
下面绘制如图所示的单位立方体的一点透视图
#include<stdio.h>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
struct point
{double x;double y;double z;
}point[10];
int l,m,n;
int d;
void init()
{//将三维形体平移到适当位置l,m,n//投影中心在Z轴上(z=-d处)l=50;m=50;n=50;d=200;point[1].x=0;point[1].y=0;point[1].z=100;point[2].x=100;point[2].y=0;point[2].z=100;point[3].x=100;point[3].y=0;point[3].z=0;point[4].x=0;point[4].y=0;point[4].z=0;point[5].x=0;point[5].y=100;point[5].z=100;point[6].x=100;point[6].y=100;point[6].z=100;point[7].x=100;point[7].y=100;point[7].z=0;point[8].x=0;point[8].y=100;point[8].z=0;
}
void sol1() //一点透视
{int i;for(i=1;i<=8;i++){point[i].x=(point[i].x+l)*d/(d+(n+point[i].z));point[i].y=(point[i].y+m)*d/(d+(n+point[i].z));}
}
void sol2() //绘制透视的图形
{line(point[1].x,point[1].y,point[2].x,point[2].y);line(point[2].x,point[2].y,point[3].x,point[3].y);line(point[1].x,point[1].y,point[4].x,point[4].y);line(point[3].x,point[3].y,point[4].x,point[4].y);line(point[5].x,point[5].y,point[8].x,point[8].y);line(point[4].x,point[4].y,point[8].x,point[8].y);line(point[5].x,point[5].y,point[1].x,point[1].y);line(point[7].x,point[7].y,point[8].x,point[8].y);line(point[7].x,point[7].y,point[3].x,point[3].y);setlinestyle(PS_DOT);line(point[7].x,point[7].y,point[6].x,point[6].y);line(point[2].x,point[2].y,point[6].x,point[6].y);line(point[5].x,point[5].y,point[6].x,point[6].y);
}
int main()
{initgraph(500,500); init();sol1();sol2();getch(); closegraph(); return 0;
}
图形的平移即像素点的移动
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#include <graphics.h>
#define MAX 500
int main()
{int i;IMAGE img; //保存图像的对象initgraph(501,501);rectangle(0,0,30,30); //画空心矩形getimage(&img,0,0,31,31); //从当前绘图设备中获取图像for(i=0;i<MAX;i++){putimage(i,i,&img); //在当前设备上绘制指定图像Sleep(50);putimage(i,i,&img,0);//清除图像}getch();closegraph();return 0;
}
可看到一正方形从左上角移至右下角
图形的一点透视和平移相关推荐
- createbitmap 旋转90度_小学数学,图形的运动,平移与旋转
对称现象在我们生活中非常常见,小到我们的衣服,大到各种建筑.比如说北京天安门城楼也是对称的.对称的物体有个特点,看着比较美观.协调.如果是运动物体,它相对的平衡性也好.比如说飞机是对称的,我们放的风筝 ...
- webgl_图形变换(旋转,平移,缩放)
平移 平移一个三角形,你需要对顶点坐标的每个分量(x和y),加上三角形在对应轴(如X轴或Y轴)上平移的距离.比如,将点p(x, y, z)平移到p'(x', y', z'),在X轴.Y轴.Z轴三个方向 ...
- 全新C#写的读取cad dxf文件,并解析显示,显示的图形可放大缩小平移
全新C#写的读取cad dxf文件,并解析显示,显示的图形可放大缩小平移,目前可解析圆,圆弧,线段,可解析cad2000到2018等各个版本的文件,可显示解析文件的详细信息,并可修改源代码保存为不同版 ...
- OpenGL 图形变换练习(平移,缩小)——画小汽车
写在前面 哈哈哈哈哈哈哈哈哈哈,东拼西凑自己写出来的作业,太爽了 效果图 俺觉得还挺好看的~ 代码 #include <GL/glut.h> #include "math.h&q ...
- C语言 图形任意多次平移、旋转、缩放和对称的变换方案
#include <stdio.h> int main() {long long a[4] = {0}; //0-平移,1-旋转,2-缩放,3-对称long long b[4] = {0} ...
- 行测-判断推理-图形推理-位置规律-平移
位置平移,选D 空白每次顺时针移动一格,黑色圆每次逆时针移动2格 选C 两个黑色⚪,每次顺时针移动2格 白色⚪,先到对角位置,再顺时针移动一格 选B 三角形的底,顺时针移动 三角形的顶点,在正方形的内 ...
- cesium 缩放_Cesium 中的图形变换:局部平移、缩放、旋转思路及代码实现
开门见山:tileset.modelMatrix 这个属性可以在数据本身的基础上再进行坐标变换,不熟悉转换矩阵各个部分的含义的可参考图形学有关资料. 此文不一定是最佳算法,但是提供一种思路.转载请注明 ...
- OpenGL实验2:图形的旋转、平移、缩放
之后有空再补一下具体的细节理论叭(可能正好当作自己复习的资料啦,
- 图形学 ---- 二维几何变换(二维图形矩阵平移,旋转,缩放)
二维图形几何变换,矩阵计算 前言:对于一个图形的几何变换,对应的是操作到图形中的每一个点! 即对每一个点做出相应的几何变换.比如平移,就是对二维图形的每个点都平移相同的距离:旋转则是对每一个点,基于基 ...
最新文章
- pytorch自定义数据集和数据加载器
- linux设备模型(8)_platform设备,Linux设备模型之platform总线
- Linux怎么修改用户密码
- 【w3cschool】通过C语言类比快速上手C#
- 关于 easyPr的问题
- mysql按照汉字拼音排序
- php融云开源sdk使用im,开源项目索引
- Glide 源码解析之监听生命周期
- 如何把公司网址生成二维码
- 怎么修改扫描PDF?扫描件PDF修改编辑教程
- ambari 修改服务器名,ambari - Ambari无法运行用于修改用户配置单元的自定义钩子 - 堆栈内存溢出...
- 实验七 二极管包络检波实验
- JZOJ 2679. 跨时代
- python爬虫微信_搜狗微信采集 —— python爬虫系列一
- 【Java获取配置文件的2种方式】
- JAVA-extends
- ACL 2016 会议论文全集
- 字符串的charCode
- 跟老齐学python轻松入门_跟老齐学Python:轻松入门
- 关于浏览器被hao123劫持的解决办法