程序技术好文:计算机图形学

简介: 程序技术好文:计算机图形学

计算机图形学


光追一般指光线追踪。 光线跟踪(也叫ray //代码效果参考:http://hnjlyzjd.com/hw/wz_24127.html

tracing或者光束投射法)。是一个在二维(2D)屏幕上呈现三维(3D)图像的方法。

BRDF是双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)


用来定义给定入射方向上的辐射照度(irradiance),如何影响给定出射方向上的辐射率(radiance)。


更笼统地说,它描述了入射光线经过某个表面反射后如何在各个出射方向上分布


——这可以是从“理想镜面反射”到“漫反射”、“各向同性(isotropic)”或者“各向异性(anisotropic)”的各种反射。


辉度


发光强度的主观感受


本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!


辉度是对(消色)发光强度的主观感受,或“一个视感觉的属性,对应区域发射光线的多少”。


辉度用以说明表面辐射光的强度。它与我们看发光面的感受相关,同样,计量也与眼睛看表面的视角相关。


中文名辉度因 素我们看发光面的感受


亮度(Luminance)


亮度(Luminance,L)单位:坎德拉每平方米(cd/㎡)一光源或一被照面之辉度指其单位表面在某一方向上的光强度密度,也可说是人眼所感知此光源或被照面之明亮程度。


台湾早期受日本照明术语的影响,老一辈的习惯称"辉度"(汉字),新一辈的习惯直接翻自英文Brightness叫"亮度",单位便是cd/㎡(nit)//代码效果参考:http://hnjlyzjd.com/xl/wz_24125.html

,footlambert。前者为公制,后者为英制。

双缓存技术double buffer:为了获得平滑的动画效果,需要先在内存中生成下一幅图像,然后把已经生成的图像从内存复制到屏幕上;


OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。


拓扑等价如果其中任一个可以通过拓扑变换从其余图形得到,就称它们为拓扑等价的,或称几个图形,其中每一个可以从其余任一个图形经扭转、弯曲、拉长或收缩得到,而不出现任何点的重叠与断开,它们就是拓扑等价的。


正则集合运算:能够产生正则形体的集合运算称为正则集合运算。


正则集合运算 包括正则并(∪)、正则交(∩)、正则差(—)。


正则形体(正则体)为了保证几何造型的可靠性和可加工性,要求形体上任何一点的足够小的领域在拓扑上应是一个等价的封闭圈,即围绕该点的形体邻域在二维空间中可构成一个单连通域,我们把满足这个定义的形体成为正则形体。


实体表面特性


连通性:实体表面任意两点都可以用实体表面上一条路径连接起来。


有界性:实体表面可以将空间分为互不连通的两部分,其中一部分有界。


非自相交:表面不能自相交。


可定向:表面两侧可以定义出实体内侧和外侧。


闭合:每条变有且只有两个顶点;每条边连接两个或多个面;


有效实体的特性


刚性:不变的形状。


维数一致性:一个实体各个部分均应是三维,必须有连通的内部,不能有悬挂的或者孤立的边界。


有限性:一个实体只能占有有限空间。


边界确定性:根据实体边界能区别实体内部和外部。


封闭性:经过刚体运动和集合运算后,仍然保持为有效实体。


开集与闭集/正则集(开集的闭包)


闭包=闭集=正则集


实体:三维空间中的物体是空间中点的集合(点集拓扑理论)。三位空间中点集的正则集就是三维正则形体,也就是有效的实体。


闭包:一个开集的闭包是该开集与其所有边界点集合的并集,闭包本身是一个闭集。


组成一个三位物体的点集可以分为内部点和边界点两部分。


正则集:由内部点构成的点集的闭包就是正则集。


元组是包含多个字段以表示数据成员的轻量级数据结构。


光栅由大量等宽等间距的平行狭缝构成的光学器件称为光栅(grating)。一般常用的光栅是在玻璃片上刻出大量平行刻痕制成,刻痕为不透光部分,两刻痕之间的光滑部分可以透光,相当于一狭缝。精制的光栅,在1cm宽度内刻有几千条乃至上万条刻痕。


计算机图形学:使用计算机通过算法和程序在显示设备上构造出图形来。


在数学上,理想的直线是没有宽度的,由无数个点构成的集合。我们只能在显示器所给定的有限个像素组成的矩阵中,确定最佳逼近于该直线的一组像素,并且按照扫描顺序,用当前的写方式,对这些像素进行写操作。


在光栅显示器的荧光屏上生成一个对象,实质是往帧缓冲寄存器的相应单元中填入数据。


直线光栅化:画一条从(x1,y1)(x2,y2)的直线(注意:这里的坐标是显示器的坐标,以像素为单位,也可称为设备坐标),实质上是一个发现最佳逼近直线的像素序列,并填入色彩数据的过程。这个过程也称为直线光栅化。


#include#includeusing namespace std; HWND consoleWindow = GetConsoleWindow(); // Get a console handle HDC consoleDC = GetDC(consoleWindow);// Get a handle to device contextvoid CDraw::drawLine(int xa,int ya,int xb,int yb,int c){ int dx, dy,steps; float deltaX, deltaY, x, y; if (ya == yb)//水平线 { dx = xb - xa; steps = abs(dx); deltaX = (float)dx / (float)steps; x = xa; y = ya; SetPixel(consoleDC, x, y, c); for (size_t i = 1; i <= steps; i++) { x += deltaX; SetPixel(consoleDC, x, y, c); } return; } if (xa == xb)//垂直线 { dy = yb - ya; steps = abs(dy); deltaY = (float)dy / (float)steps; x = xa; y = ya; SetPixel(consoleDC, x, y, c); for (size_t i = 1; i <= steps; i++) { y += deltaY; SetPixel(consoleDC, x, y, c); } return; } //斜线 dx = xb - xa; dy = yb - ya; if (abs(dx) > abs(dy))steps = abs(dx); else steps = abs(dy); deltaX = (float)dx / (float)steps; deltaY = (float)dy / (float)steps; x = xa; y = ya; SetPixel(consoleDC,x,y,c); for (size_t i = 1; i <=steps; i++) { x += deltaX; y += deltaY; SetPixel(consoleDC, x, y, c); }}//绘制矩形框void CDraw::drawRect(int minX, int minY, int maxX, int maxY, int c){ drawLine(minX, minY, maxX, minY, c); drawLine(maxX, minY, maxX, maxY, c); drawLine(maxX, maxY, minX, maxY, c); drawLine(minX, maxY, minX, minY, c); }//绘制区域void CDraw::drawRegion(int minX, int minY, int maxX, int maxY, int c){ for (int x = minX; x <= maxX; x++) { for (int y = minY; y < maxY; y++) { SetPixel(consoleDC,x,y,c); } } }


void CDraw::drawCircle(int cx, int cy, int r, int c){ int r2 = r r; double sq; for (int x = 0; x <= r; x++) { sq = sqrt(r2 - x x); SetPixel(consoleDC, cx + x, cy + sq, c); SetPixel(consoleDC, cx + x, cy - sq, c); SetPixel(consoleDC, cx - x, cy + sq, c); SetPixel(consoleDC, cx - x, cy - sq, c); }}


该方法所画的原型,当X远离圆心时,点越来越稀疏


//直角坐标法 画圆void CDraw::drawCircle(int cx, int cy, int r, int c){ int r2 = r r; double sq; for (int x = 0; x <= r; x++) { sq = sqrt(r2 - x * x); SetPixel(consoleDC, cx + x, cy + sq, c); SetPixel(consoleDC, cx + x, cy - sq, c); SetPixel(consoleDC, cx - x, cy + sq, c); SetPixel(consoleDC, cx - x, cy - sq, c); }}//极坐标法 画圆void CDraw::drawCirclePolor(int cx, int cy, int r, int c){ double radianStep = 1.0

相关文章
|
12月前
|
存储 NoSQL Cloud Native
MongoDB云原生化:为企业开发注入高效动力
MongoDB云原生化为企业开发注入高效动力,分为三部分:1. 介绍阿里云和MongoDB的服务;2. 阿里云MongoDB解决自建模型痛点的功能,包括隔离性、海量数据处理、弹性能力及运维操作优化;3. 客户案例展示。通过云原生架构,MongoDB实现了灵活的扩展、高效的备份恢复和快速的回档能力,显著提升了企业的业务迭代速度和数据管理效率。典型客户如吉比特、莉莉丝、掌阅等受益于这些功能,实现了更稳定和高效的数据库服务。
|
12月前
|
分布式计算 DataWorks Serverless
通过函数计算节点实现GitHub实时数据分析与结果发送
开发人员在基于GitHub开源项目进行开发时会产生海量事件,GitHub会记录每次事件的类型、详情、开发者和代码仓库等信息,并开放其中的公开事件。DataWorks提供“Github十大热门编程语言”模板,通过对GitHub中公开数据集进行加工和分析,并将分析结果以邮箱的方式发送给指定用户。运行本案例后,您将得到Github中Top10编程语言每小时被提交的次数与排行。
297 10
|
JavaScript Java 测试技术
基于Java的儿童福利院管理系统设计和实现(源码+LW+部署讲解)
基于Java的儿童福利院管理系统设计和实现(源码+LW+部署讲解)
270 7
|
算法 网络架构
计算机网络——数据链路层-数据链路层概述(介绍、三个重要问题、使用广播信道的数据链路层、其他问题)
计算机网络——数据链路层-数据链路层概述(介绍、三个重要问题、使用广播信道的数据链路层、其他问题)
713 0
|
消息中间件 JavaScript Java
跨平台 AMQP 客户端开发指南
【8月更文第28天】高级消息队列协议 (AMQP) 是一种开放标准的应用层协议,用于中间件。它定义了消息如何在消息代理(通常是消息队列服务器)与客户端应用程序之间传递。本文将指导您如何为不同的编程语言构建跨平台的 AMQP 客户端,并提供一些具体的代码示例。
477 1
|
编解码
Sora视频重建与创新路线问题之什么是因果3D卷积,如何实现
Sora视频重建与创新路线问题之什么是因果3D卷积,如何实现
221 1
|
前端开发 JavaScript 应用服务中间件
WEB前端有必要学会docker吗?0基础-45分钟带你学会(包含视频笔记案例源代码)
WEB前端有必要学会docker吗?0基础-45分钟带你学会(包含视频笔记案例源代码)
238 0
|
存储 Linux 网络安全
无公网ip如何随时随地远程查看本地群晖NAS存储的文件资源(下)
无公网ip如何随时随地远程查看本地群晖NAS存储的文件资源(下)
604 0
|
网络安全
【IntelliJ IDEA】连接https报错问题: E230001: Server SSL certificate verification failed:
最近新安装了一个2018版本的idea,但是用idea去连接SVN的时候出现了这样的错误,在网上搜了很多,都没有用,最后找到这样的方式,把问题搞定,果断把解决方式记录下,以便帮助更多的人。
777 1
【IntelliJ IDEA】连接https报错问题: E230001: Server SSL certificate verification failed:
|
移动开发 JavaScript HTML5
JS实现轮播图(一看就懂逻辑清晰)
JS实现轮播图(一看就懂逻辑清晰)

热门文章

最新文章