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

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

计算机图形学


光追一般指光线追踪。 光线跟踪(也叫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

相关文章
|
4月前
|
开发者
从代码中汲取智慧——我的编程之旅与技术感悟
【9月更文挑战第24天】在数字世界的迷宫中,代码是指引我们前行的罗盘。它不仅仅是冷冰冰的指令集合,更是一扇窗,透过它,我们可以看到逻辑的严谨、问题的解决以及创新的火花。本文将分享我在编程旅途中的一些深刻体会,从最初的困惑与挫败,到逐渐掌握编程语言的乐趣,再到通过代码解决问题的成就感。我将探讨如何通过编程提升思维能力,以及编程对个人成长和职业发展的重要性。无论你是编程新手还是资深开发者,这段旅程都将启发你去思考和探索技术的深层次意义。
38 1
|
2月前
|
设计模式 前端开发 算法
探索代码之美:我的编程之旅与实践感悟
【10月更文挑战第23天】 在数字世界的海洋中,编程是构建梦想之船的技艺。本文将带你领略编程的魅力,从我踏入这个奇妙世界的第一步开始,到逐渐掌握各种编程语言和工具的过程。我们将一起探讨编程思维的重要性、解决问题的策略,以及如何通过不断学习和实践来提升自己的技术水平。文章不仅分享了我个人的经验和技巧,还提供了实用的代码示例,旨在帮助初学者更好地理解编程概念,并为资深开发者提供新的视角和灵感。
53 2
|
7月前
|
XML JSON 移动开发
程序技术好文:让你的WizFi250适应各种气候
程序技术好文:让你的WizFi250适应各种气候
|
3月前
|
自然语言处理 算法 语音技术
探索编程世界的奇妙之旅:从初学者到实践者的蜕变
【10月更文挑战第14天】探索编程世界的奇妙之旅:从初学者到实践者的蜕变
29 0
|
4月前
|
前端开发 算法 JavaScript
探索编程之海:我的技术感悟之旅
【9月更文挑战第14天】在编程的浩瀚海洋中,我是一位勇敢的探险者。每一次代码的编写,都是对未知领域的挑战。本文将分享我在技术探索中的心得体会,从初识编程的迷茫到逐渐找到自己的航线,再到不断精进技艺的过程。通过这段旅程,我深刻理解了“你必须成为你希望在世界上看到的改变”这句话的内涵,并将它融入到我的学习和实践中。让我们一起跟随这篇文章,揭开编程世界的神秘面纱,找到属于自己的航道。
46 9
|
4月前
|
人工智能 自动驾驶 数据挖掘
探索代码之美:从小白到大牛的编程之旅
【9月更文挑战第4天】编程,一种将思维转化为现实的神奇艺术。本文将以通俗易懂的方式,带领读者走进编程的世界,从基础概念到实际案例,逐步揭示编程的魅力和挑战。无论你是编程新手,还是有一定经验的开发者,都能在这篇文章中找到属于自己的启示和成长路径。让我们一起开启这场探索代码之美的旅程吧!
43 5
|
5月前
|
人工智能 数据挖掘 数据库
探索代码之美:我的编程之旅与技术感悟
【8月更文挑战第31天】在数字世界的海洋中,编程是那艘能带我们探索未知的船。我通过编程找到了自己的方向,从一个迷茫的大学毕业生成长为一名不断学习和提升的技术人员。就像甘地所说,“你必须成为你希望在世界上看到的改变。”我在代码中看到了创造和改变的力量,这篇文章将分享我的技术旅程和对编程之美的理解。
|
7月前
|
算法 开发者
代码之美:我的编程之旅与技术感悟
【6月更文挑战第23天】编程不仅是技术的实践,更是艺术的创造。本文将通过个人经历,探讨如何从初学者成长为一名有洞察力的开发者,并分享在编程旅途中的技术感悟。我们将一起探索编程的本质、学习过程中的挑战与乐趣,以及如何培养解决问题的能力,最终达到技术与创造力的融合。
|
7月前
|
算法 开发者
探索技术之美:我的编程之旅
【6月更文挑战第15天】在数字世界的迷宫中,我是一名探险家,用代码作为指南针。每一段算法的编写,都是我与问题对话的过程;每一次系统的优化,都仿佛是对宇宙规律的更深理解。本文将分享我在技术探索中的个人感悟,以及如何通过编程实践来提升自我。
|
7月前
|
移动开发 JavaScript 算法
程序技术好文:离散数学知识点总结(3)
程序技术好文:离散数学知识点总结(3)