张德长

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

计算机图形学

计算机图形学

 

 

 

 

 

 

 

 

 

光追一般指光线追踪。 光线跟踪(也叫ray tracing或者光束投射法)。是一个在二维(2D)屏幕上呈现三维(3D)图像的方法。

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

 

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

 

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

 

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

辉度

发光强度的主观感受

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

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

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

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

亮度(Luminance)

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

台湾早期受日本照明术语的影响,老一辈的习惯称"辉度"(汉字),新一辈的习惯直接翻自英文Brightness叫"亮度",单位便是cd/㎡(nit),footlambert。前者为公制,后者为英制。

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

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

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

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

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

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

实体表面特性

  1. 连通性:实体表面任意两点都可以用实体表面上一条路径连接起来。
  2. 有界性:实体表面可以将空间分为互不连通的两部分,其中一部分有界。
  3. 非自相交:表面不能自相交。
  4. 可定向:表面两侧可以定义出实体内侧和外侧。
  5. 闭合:每条变有且只有两个顶点;每条边连接两个或多个面;

有效实体的特性

  1. 刚性:不变的形状。
  2. 维数一致性:一个实体各个部分均应是三维,必须有连通的内部,不能有悬挂的或者孤立的边界。
  3. 有限性:一个实体只能占有有限空间。
  4. 边界确定性:根据实体边界能区别实体内部和外部。
  5. 封闭性:经过刚体运动和集合运算后,仍然保持为有效实体。

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

闭包=闭集=正则集

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

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

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

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

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

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

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

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

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

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

#include<cmath>
#include<windows.h>
using namespace std;
HWND consoleWindow = GetConsoleWindow(); // Get a console handle
HDC consoleDC = GetDC(consoleWindow);// Get a handle to device context
void 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 / r;//转动一个单位所对应的弧度
double radian = 0; //弧度值
double x, y;
//cout <<"sin(30)=" << sin(3.1415926 / 6) << endl;
while(true)
{
x = r * cos(radian);
y= r * sin(radian);
SetPixel(consoleDC, x+cx, y+cy, c);
SetPixel(consoleDC, -x + cx, y + cy, c);
SetPixel(consoleDC, x + cx, -y + cy, c);
SetPixel(consoleDC, -x + cx, -y + cy, c);
radian += radianStep;
if (radian > 3.1415926 /2)break;
}
}

 

posted on   张德长  阅读(391)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示