计算机图形学:直线的扫描转换算法解析与实现

图形学入门别怕!从DDA到Bresenham,手把手教你用C++实现直线扫描算法(附完整代码) 本文深入解析图形学中三种经典直线绘制算法:DDA、中点画线法和Bresenham算法,通过C++实现和性能对比,帮助读者掌握图形学底层绘制技术。文章详细介绍了算法原理、实现代码及优化技巧,适合图形学入门学习和工程实践。 阅读详情

直线的扫描转换:

DDA算法:

推理:

在计算机显示图形时,由于显示计算机的分辨率是有限的所以我们在绘制图形时需要将图形从连续量转换成离散量才能完成图形的绘制,直线的扫描转换就是将连续量转换为离散量的过程。
对于任意给我们两点(x0,y0)(x_0, y_0)(x0​,y0​)与(x1,y1)(x_1, y_1)(x1​,y1​)我们可以得到小面的一些量:
k=y1−y0x1−x0k = \frac{y_1-y_0}{x_1-x_0}k=x1​−x0​y1​−y0​​
此值的意义表示的是在x轴上自增1,在y轴上的增量。如图所示:
在这里插入图片描述

这样我们得到斜率之后,我们就知道在x轴上增加1,y轴上的增量了,但是目前我们仍旧不知道该怎么将这个这两点所确定的直线转换为离散的点集。
我们将这个图形转化为下图看一下:
在这里插入图片描述
在这里插入图片描述

也就是说对于直线上一点我们可以使用最接近这一点的像素来表示这一点。
所以我们就可以就可以将直线转换为一个一个离散的点了,为了获取最多的能够表示这一条直线的点,对于斜率为k的直线,我们需要沿着增量最快的轴作为自变量来增加,因为像素是一个挨着一个,所以作为自变量的轴每一次增加1,因为k的取值可以变化,无论k值怎样变化,第一次决策的点都应该属于下面的八个点,这样我们么一次抉择下一个点就是在周围的八个点之间做一个决策:
在这里插入图片描述
在这里插入图片描述

当k选择一个具体的值之后如k=0.5则直线的下一次取点的决策范围应该为:
在这里插入图片描述

现在我们已经说明了为什么要选择增量最快的轴作为自变量轴,同时也说明了为什么作为自变量的轴每一次要增加1而不是增加2或者其他的数字。
如果不使用增量最快的轴作为自变量轴则会出现什么情况能。如起始点(2,2),斜率为k的直线选择变化慢的轴作为自变量,则决策范围为:
在这里插入图片描述

可以看出这种取法会导致我们选取的点不是最符合直线的点。
所以我们要采取自变量变化快的轴作为我们的自变量,每次变化1.
如果根据起点与终点确定了点的坐标,我们同样要根据点的坐标进行舍入,来确定整数坐标的像素作为表是直线的点,如何进行舍入呢,我们以(2,2)点表示的像素为例,我们只需要确定(x,y)是不是属于红色区域的点
在这里插入图片描述

公式为:
1.5<=x<2.5→x=21.5<=y<2.5→y=2 1.5<=x<2.5\rightarrow x = 2\\ 1.5<=y<2.5\rightarrow y = 2 1.5<=x<2.5→x=21.5<=y<2.5→y=2
因为c语言中的取整规则是向下取整,所以我们在确定
点的时候要将x,y分别加上0.5,用(x+0.5, y+0.5)取整来确定像素点。

公式推导

起点(x起,y起)终点(x终,y终)k=y终−y起x终−x起Δx=x终−x起Δy=y终−y起k=ΔyΔx如果0≤k≤1则说明x轴变化快,选择x作为自变量起始点(x起,y起):x1=x起+1y1=y起+k选取点的时候选取:(⌊x1+0.5⌋,⌊y1+0.5⌋)x2=x1+1y2=y1+k选取点的时候选取:(⌊x2+0.5⌋,⌊y2+0.5⌋)......起点(x_起, y_起)终点(x_终, y_终)\\ k = \frac{y_终-y_起}{x_终-x_起}\\ \Delta x = x_终- x_起\\ \Delta y = y_终-y_起\\ k = \frac{\Delta y}{\Delta x}\\ 如果0\leq k\leq1则说明x轴变化快,选择x作为自变量\\ 起始点(x_起, y_起):\\ x_1 = x_起 + 1\\ y_1 = y_起 + k\\ 选取点的时候选取:(\lfloor x_1+0.5\rfloor, \lfloor y_1+0.5\rfloor)\\ x_2 = x_1 + 1\\ y_2 = y_1 + k\\ 选取点的时候选取:(\lfloor x_2+0.5\rfloor, \lfloor y_2+0.5\rfloor)\\ ...... 起点(x起​,y起​)终点(x终​,y终​)k=x终​−x起​y终​−y起​​Δx=x终​−x起​Δy=y终​−y起​k=ΔxΔy​如果0≤k≤1则说明x轴变化快,选择x作为自变量起始点(x起​,y起​):x1​=x起​+1y1​=y起​+k选取点的时候选取:(⌊x1​+0.5⌋,⌊y1​+0.5⌋)x2​=x1​+1y2​=y1​+k选取点的时候选取:(⌊x2​+0.5⌋,⌊y2​+0.5⌋)......
所以我们先计算k,然后一步一步的进行计算即可。
但是上述只讨论了0<=k<=10<=k<=10<=k<=1这一种情况,但是这已经够用了,因为对于坐标系内任意一点都可以通过一些对称轴转化至0<=k<=10<=k<=10<=k<=1区域内。
对于k>1k>1k>1的情况,我们知道此时变化较快的轴为y轴所以选取y轴为增加1的轴,其余分析同上。
如图:
在这里插入图片描述

我们可以通过对称轴y=x将上方区域的点转换到下方区域。其他区域也是同理。将点进行对称时一定要按照以起点为原点进行对称,也就是说这涉及到一个坐标系变换的问题,我们根据坐标系的变换规则我们可以知道
(1)当要进行终点在起始点的左上方时:
在这里插入图片描述

$x = x1+2*(x0-x1) =2x0-x1\
y = y1
$
其余同理可得:
(2)当终点在起始点的左下方的时候:
x=x1+2∗(x0−x1)=2∗x0−x1y=y1+2∗(y0−y1)=2∗y0−x1 x = x1+2*(x0-x1) =2*x0-x1\\ y = y1 + 2*(y0-y1) = 2*y0-x1 x=x1+2∗(x0−x1)=2∗x0−x1y=y1+2∗(y0−y1)=2∗y0−x1
(3)当终点在起始点的右下方的时候:
$
x =x1\
y = y1 + 2
(y0-y1) = 2*y0-x1
$
然后通过对称过去的点计算出点的坐标然后对称回来进行绘制即可。
我们可以写出下述算法:

void paintline(CPoint start, CPoint end, CDC* pDC, int deltax, int deltay, int flag ) {
	int num;
	float x1, y1, xIncreation, yIncreation;
	CPoint point;
	CPoint end2;
	switch (flag) {
	case 1:
		end2.x = end.x;
		end2.y = end.y;
		break;
	case 2:
		end2.x = 2 * start.x - end.x;
		end2.y = end.y;
		break;
	case 3:
		end2.x = 2 * start.x - end.x;
		end2.y = 2 * start.y - end.y;
		break;
	case 4:
		end2.y = 2 * start.y - end.y;
		end2.x = end.x;
		break;
	}
	deltax = end2.x - start.x;
	deltay = end2.y - start.y;
	num = deltax > deltay ? deltax : deltay;
	if (deltax > deltay) {
		yIncreation = 1.0 * deltay / deltax;
		xIncreation = 1;
	}
	else {
		xIncreation = 1.0 * deltax / deltay;
		yIncreation = 1;
	}
	x1 = start.x;
	y1 = start.y;
	for (int i = 0; i < num; i++) {
		point.x = (int)(x1 + 0.5);
		point.y = (int)(y1 + 0.5);
		switch (flag) {
		case 1:
			pDC->SetPixelV(point, RGB(255, 0, 0));
			break;
		case 2:
			point.x = 2 * start.x - point.x;
			pDC->SetPixelV(point, RGB(255, 0, 0));
			break;
		case 3:
			point.x = 2 * start.x - point.x;
			point.y = 2 * start.y - point.y;
			pDC->SetPixelV(point, RGB(255, 0, 0));
			break;
		case 4:
			point.y = 2 * start.y - point.y;
			pDC->SetPixelV(point, RGB(255, 0, 0));
			break;
		}
		x1 += xIncreation;
		y1 += yIncreation;
	}
}
void paintLine(CPoint start, CPoint end, CDC * pDC) {
	int deltax = end.x - start.x;
	int deltay = end.y - start.y;
	if (deltax > 0 && deltay > 0) {
		paintline(start, end, pDC, deltax, deltay, 1);
	}
	else if (deltax < 0 && deltay>0) {
		paintline(start, end, pDC, deltax, deltay, 2);
	}
	else if (deltax < 0 && deltay < 0) {
		paintline(start, end, pDC, deltax, deltay, 3);
	}
	else if (deltax > 0 && deltay < 0) {
		paintline(start, end, pDC, deltax, deltay, 4);
	}

}

void Ctest2Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	if (!flag) {
		start = point;
		flag = !flag;
	}
	else {
		end = point;
		flag = !flag;
		CDC* pDC = GetDC();
		paintLine(start, end, pDC);
		ReleaseDC(pDC);
	}
	CDialogEx::OnLButtonDown(nFlags, point);
}

中点画线法

算法原理

与DDA算法不同中点画线法的主要思想是这样的,对于任意一条直线来说这条直线会将平面分成上下两部分,将直线上方的点代入到直线方程中会得到大于0的结果,将直线下方的点代入直线方程中会得到小于0的结果。
在这里插入图片描述
也就是说如果我们代入两个像素的中间值,会得到大于0或小于0的结果,当大于0时我们需要选取直线下方的点作为我们的选取的点,当代入小于0的时候我们需要选取上方的点作为我们选取的点。
我们先推导0<=k<=1时选取点的条件:
设方程为y=k∗x+by = k*x+by=k∗x+b假设现在选取的点为(x,y)(x, y)(x,y)则下一点需要在(x+1,y+0)(x+1, y+0)(x+1,y+0)与(x+1,y+1)(x+1, y+1)(x+1,y+1)做出选择,此时我们将(x+1,y+0.5)(x+1, y+0.5)(x+1,y+0.5)代入得到d=y+0.5−k∗(x+1)−bd = y+0.5-k*(x+1)-bd=y+0.5−k∗(x+1)−b此时d>0 或 d<0

  1. 当d>0时选择(x+1, y)点
    下面那一点就从(x+2,y+0)(x+2, y+0)(x+2,y+0)与(x+2,y+1)(x+2, y+1)(x+2,y+1)之中选择,将(x+2,y+0.5)(x+2, y+0.5)(x+2,y+0.5)代入,$\d_{next} = y+0.5 - k*(x+1)-b\$d=y+0.5−k∗(x+2)−bd = y+0.5-k*(x+2)-bd=y+0.5−k∗(x+2)−b
    dnext=d+0.5−kd_{next} = d+0.5-kdnext​=d+0.5−k
    dnext−d=−kd_{next} - d = -kdnext​−d=−k
  2. 当d<0时选择(x+1, y+1)点.
    下面那一点就从(x+2,y+1)(x+2, y+1)(x+2,y+1)与(x+2,y+2)(x+2, y+2)(x+2,y+2)之中选择,将(x+2,y+1.5)(x+2, y+1.5)(x+2,y+1.5)代入,$\d_{next} = y+1.5 - k*(x+1)-b\$d=y+0.5−k∗(x+2)−bd = y+0.5-k*(x+2)-bd=y+0.5−k∗(x+2)−b
    dnext=d+1−kd_{next} = d+1-kdnext​=d+1−k
    dnext−d=1−kd_{next} - d = 1-kdnext​−d=1−k
    我们知道了增量是如何变化的还不够,我们需要求出初始d的值,
    d=y−k∗x+bd = y-k*x+bd=y−k∗x+b,因为初始点(x0,y0)(x_0, y_0)(x0​,y0​)在直线上将点(x_0+1, y_0+0.5)代入即可求出初始d。
    d = 0.5 + k;
    因为k>1的情况与0<=k<=1可以通过对称得到,所以对于k>1的情况我们将所有的x换成y,所有的y换成x就能得到k>1情况下的中点画线法。

减少浮点运算

因为增量与-k或0.5-k有关,这种是可能涉及到浮点运算的,为了避免浮点运算,我们通过*2Δx\Delta xΔx来将浮点运算转换为整数运算。
此时对于所有过程我们都要乘上2Δx\Delta xΔx,
由此得到初始d=Δx−2∗Δyd = \Delta x - 2*\Delta yd=Δx−2∗Δy
相应的d的增量变成−2∗Δy-2*\Delta y−2∗Δy与2∗Δx−2∗Δy2*\Delta x - 2*\Delta y2∗Δx−2∗Δy

算法实现

算法的实现与上面DDA算法类似。
代码如下:

void paintline(CPoint start, CPoint end, CDC* pDC, int deltax, int deltay, int flag) {
	int num;
	int d;
	CPoint point, point2;
	CPoint end2;
	switch (flag) {
	case 1:
		end2.x = end.x;
		end2.y = end.y;
		break;
	case 2:
		end2.x = 2 * start.x - end.x;
		end2.y = end.y;
		break;
	case 3:
		end2.x = 2 * start.x - end.x;
		end2.y = 2 * start.y - end.y;
		break;
	case 4:
		end2.y = 2 * start.y - end.y;
		end2.x = end.x;
		break;
	}
	deltax = end2.x - start.x;
	deltay = end2.y - start.y;
	num = deltax > deltay ? deltax : deltay;
	if (deltax >= deltay) {
		d = deltax - 2 * deltay;
	}
	else {
		d = deltay - 2 * deltax;
	}
	point.x = start.x;
	point.y = start.y;
	for (int i = 0; i < num; i++) {
		switch (flag) {
		case 1:
			point2.x = point.x;
			point2.y = point.y;
			pDC->SetPixelV(point2, RGB(255, 0, 0));
			break;
		case 2:
			point2.x = 2 * start.x - point.x;
			point2.y = point.y;
			pDC->SetPixelV(point2, RGB(255, 0, 0));
			break;
		case 3:
			point2.x = 2 * start.x - point.x;
			point2.y = 2 * start.y - point.y;
			pDC->SetPixelV(point2, RGB(255, 0, 0));
			break;
		case 4:
			point2.y = 2 * start.y - point.y;
			point2.x = point.x;
			pDC->SetPixelV(point2, RGB(255, 0, 0));
			break;
		}
		if (d > 0) {
			if (deltax >= deltay) {
				point.x += 1;
				d = d - 2 * deltay;
			}
			else {
				point.y += 1;
				d = d - 2 * deltax;
			}
			
		}
		else {
			point.x += 1;
			point.y += 1;
			if (deltax >= deltay) {
				d = d + (2 * deltax - 2 * deltay);
			}
			else {	
				d = d + (2 * deltay - 2 * deltax);
			}
		}
	}
}
void paintLine(CPoint start, CPoint end, CDC* pDC) {
	int deltax = end.x - start.x;
	int deltay = end.y - start.y;
	if (deltax > 0 && deltay > 0) {
		paintline(start, end, pDC, deltax, deltay, 1);
	}
	else if (deltax < 0 && deltay>0) {
		paintline(start, end, pDC, deltax, deltay, 2);
	}
	else if (deltax < 0 && deltay < 0) {
		paintline(start, end, pDC, deltax, deltay, 3);
	}
	else if (deltax > 0 && deltay < 0) {
		paintline(start, end, pDC, deltax, deltay, 4);
	}

}

这些代码都可以进行一下优化,这样能够提高效率,大家可以自行去优化。

VC++6.0环境下基于中点法的直线扫描转换实现 回望半个世纪前的那个算法,我们会惊讶地发现:它不仅没有被淘汰,反而在一次次技术迭代中焕发新生。因为它解决的不是一个具体问题,而是一类问题的通用范式:- 如何在离散空间中逼近连续结构?- 如何用有限精度表达无限细节?- 如何在性能与质量之间找到最优平衡?这些问题,至今仍在图形学、数值计算、信号处理等领域反复出现。所以当你下次画一条线的时候,不妨想想那个藏在背后默默工作的err变量。它可能只有几个字节大小,却承载着人类智慧对“完美直线”的不懈追求。✨。 阅读详情

相关推荐

计算机图形学基础:绘制直线、圆形与多边形

在VC++中,Microsoft Foundation Classes(MFC)提供了一套封装了Windows API的类库,用于简化图形用户界面(GUI)的开发。MFC图形绘制机制是基于Windows GDI(图形设备接口)实现的,它为开发者提供了大量的绘图功能,包括但不限于画笔(Pen)、画刷(Brush)、字体(Font)、位图(Bitmap)等资源的管理。在MFC应用程序中,每个窗口都继承自CWnd类,并通过重写OnPaint成员函数来实现自定义绘图逻辑。

weixin_42514750的博客 955

计算机图形学——基本图形的扫描转换

本文为大家讲解了计算机图形学——基本图形的扫描转换的内容,希望对你有用~~

weixin_53919192的博客 3865

计算机图形学基础实验与VC++实现

计算机图形学(Computer Graphics, CG)是研究如何利用计算机生成、处理和显示图形图像的学科,其核心在于将几何模型转化为可视化的二维或三维图像。自20世纪60年代起步以来,图形学已广泛应用于游戏开发、影视特效、虚拟现实、CAD设计、医学影像等领域。本章将从图形学的基本概念入手,解析光栅化过程、几何变换原理及图形绘制流程,帮助读者建立图形渲染的基础认知体系,为后续算法实现与VC++开发实践提供理论支撑。// 边的上下端点y坐标float x;// 当前扫描线对应的x坐标。

weixin_42602241的博客 769

计算机图形学-直线,圆,椭圆扫描转换算法

1. 直线的扫描转换 1.1 DDA算法 增量算法,每一步都需要进行舍入取整,不利于硬件实现 使用C++代码: void DDALine(int x0,int y0,int x1,int y1) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) //abs()函数为取绝对值函数

豆豆豆豆芽的博客 3046

Synopsys的CoreConsultant使用简析

CoreConsultant使用简析

weixin_58165606的博客 1万+

WSL2 Ubuntu复现FoundationPose项目(docker)

复现一个基于深度学习的物体姿态估计框架FoundationPose项目,使用docker,WSL2

woaidawangwang的博客 2002

【计算机图形学】图元的扫描转换之直线的扫描转换

相关资料来源于网络,侵删歉。 如果文章中存在错误,请下方评论告知我,谢谢! 直线的扫描转换 定义:直线的扫描转换是指在二维栅格上计算位于该直线上或充分靠近它的一串像素坐标(光栅化),并以此像素集近似替代原连续直线段在屏幕上显示的过程。直线由两个端点坐标确定。 要求 1.观感好,像素分布均匀 2.误差小,像素尽可能接近数学理想坐标 3.速度快,避免乘除法和浮点数运算 前提 线的宽度...

WINGREZ‘S BLOG 4586

Vivado FFT IP核配置与实战:FPGA信号处理硬件加速指南

快速傅里叶变换(FFT)是数字信号处理(DSP)中的核心算法,用于将时域信号转换到频域进行分析。其原理基于离散傅里叶变换(DFT),通过蝶形运算的分解与复用,大幅降低了计算复杂度。在工程实践中,软件实现的FFT难以满足高速实时处理的需求,因此硬件加速方案至关重要。FPGA凭借其并行架构和可定制性,成为实现高性能FFT的理想平台。通过集成专用的FFT IP核,如Vivado中的Pipelined Streaming I/O架构,可以构建流水线化的计算引擎,实现极低延迟和高吞吐量的连续数据流处理。这种硬件方案特

weixin_42536863的博客 649

【计算机图形学】扫面转换算法(DDA算法 & 中点画线算法 & Bresenham画线算法)

【计算机图形学】扫面转换算法(DDA算法 & 中点画线算法 & Bresenham画线算法)

m0_65787507的博客 5866

原创_新魔百和CM201-1鸿蒙架构当贝乐家语音安卓9线刷固件包刷机教程可救砖rom刷机包

不用担心变砖,因为系统内核会自动判断分区及CPU等级,假设你CPU是高于S905L3的那么。7.adb功能支持,系统增加开机自启功能,添加老人桌面模式,默认为年轻化桌面;所以我发的这个固件可适用于_cw_ys_zg_zn代工上生产的盒子进行刷机;5.CPU及GPU算法更改,当观看4K片源时,AI智能会自动优化系统后台进程,正如我所说,本固件是采用安卓公版镜像制作而成,那么代工厂也是使用的公版镜像,1.移植鸿蒙架构代码,完美融合安卓系统,增加系统的稳定性;刷机的时候 他会自动短接链接,所以不存在变砖。

a138088150的博客 1万+

Aider的Repo Map功能

要把整个项目的所有文件添加到 Repo Map 中,需要调整 Aider 的行为,让它扫描整个代码库并将所有文件纳入 Repo Map。在使用 Aider 时,Repo Map 默认只包含当前会话中明确指定的文件(通过命令行传入的。通过命令行将整个项目的文件列表传递给 Aider,使其初始化时包含所有文件。,让 Aider 在初始化时自动加载整个项目的文件到。如果你的项目是 Git 仓库,Aider 可以通过。在 Aider 的交互模式中,手动添加整个项目文件。,从而生成包含所有文件的 Repo Map。

qq_41638872的博客 1639

【计算机图形学】扫描转换算法(Bresenham1/4圆法 & 椭圆两头逼近法 & 方形刷子)

【计算机图形学】扫描转换算法(Bresenham1/4圆法 & 椭圆两头逼近法 & 方形刷子)

m0_65787507的博客 1910

探测器反向偏压_光探测器PN结原理

1 光探测原理在光的作用下,当光敏物质中的电子直接吸收光子的能量足以客服原子核的束缚时,电子就会从基态被激发到高能态,脱离原子核的束缚,在外电场作用下参与导电,因而产生了光电效应。(这里需要说明的是,如果光子不是直接与电子起作用而是能量被固体晶格振动吸收,引起固体的温度升高,导致固体电学性质的改变,这种情况就不是光电效应而是热电效应)。根据所用结的种类的不同,可分为PN结,PIN 结型,...

weixin_42489104的博客 2551

算法系列之十:直线生成算法

在欧氏几何空间中,平面方程就是一个三元一次方程,直线就是两个非平行平面的交线,所以直线方程就是两个三元一次方程组联立。但是在平面解析几何中,直线的方程就简单的多了。平面几何中直线方程有多种形式,一般式直线方程可用于描述所有直线: Ax+By+C = 0  (A、B不同时为0) 当知道直线上一点坐标(X0,Y0)和直线的斜率K存在时,可以用点斜式方程: Y-Y0 = K(X – X0) (当K不存在

oRbIt 的专栏 3万+

【专栏必读】王道考研408计算机组成原理万字笔记使用说明及章节导航

本文是为准备408王道计算机组成原理考试的学生精心整理的万字笔记,涵盖了从计算机系统概述、数据表示和运算到存储系统、指令系统等多个章节的重点内容。本文强调了学习笔记的重要性,并分享了学习建议,如按视频课逻辑记录,建立学科框架。笔记详细记录了每章的关键知识点,包括存储器、CPU、I/O系统的工作原理,还附带了习题和思维导图,旨在帮助考生高效复习。

快乐江湖的博客 9万+

Xilinx差分原语-IBUFGDS与OBUFGDS FPGA

它将差分信号转换为单端信号,并将其输入到FPGA的逻辑片上。它将单端信号转换为差分信号,并将其输出到FPGA的引脚。在FPGA设计中,差分信号是一种常见的信号传输方式,用于提高抗噪性和抑制共模噪声。Xilinx是一家知名的FPGA供应商,提供了许多差分原语,其中包括IBUFGDS和OBUFGDS。通过使用Xilinx的差分原语,如IBUFGDS和OBUFGDS,可以实现差分信号的输入和输出。这些差分原语提供了方便且可靠的接口,使得在FPGA设计中处理差分信号变得更加简单和高效。是差分输入信号的端口,

git_database727的博客 2096

计算机图形学总复习(纯理论加公式,无算法解析)

计算机图形学的定义 计算机图形学的应用 计算机图形学和图像处理以及模式识别的关系 图形显示器的发展及工作原理(理解帧缓存,位面)

weixin_63636942的博客 1972

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

计算机图形学:中点画圆算法

在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 + y2 = R2。在计算机图形学中,圆和直线一样,也存在在点阵输出设备上显示或输出的问题,因此也需要一套光栅扫描转换算法。为了简化,我们先考虑圆心在原点的圆的生成,对于中心不是原点的圆,可以通

Every day 3万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

XJTUSE计算机图形学总结笔记

XJTUSE计算机图形学总结笔记

weixin_47692652的博客 7250

计算机图形学常见简单算法整理

直线段的扫描转换算法(3) 1.DDA画直线算法 void CLine_ScanView::DDALine(int x1, int y1, int x2, int y2, int color) {     int dx,dy,epsl,k;     float x=10,y=10,xIncre,yIncre;     dx = x2-x1;     dy = y2-y1;    ...

pengbostudio的博客 9222

计算机图形学——直线生成算法(原理分析及代码实现)

一、 综述 直线的扫描转换是指在图形输出设备上,按照扫描线的顺序,确定一组最佳逼近于直线的像素点并对像素进行写操作。直线生成的具体问题是已知直线的两个端点,要求在图像输出设备上从起点到中点通过逐次循环迭代,找到最接近直线的像素点集合。 本次实验所涉及的算法有三种:DDA算法、B算法和重点分割法。在MFC环境中测试三种算法并对比分析三种算法的误差及效率。 二、 程序框架 实验程序为MFC框架,cg......

阿蓬的个人博客 8452

计算机图形学复习2

直线生成算法和圆弧生成算法。

暖风吹起云之博客 3973

直线扫描转换算法DDA算法(数值微分算法)

数值微分算法(Digital Differential Analyzer,简称DDA):一种直接从直线的微分方程生成直线的方法。 首先,我们通过给定直线的两端点坐标P0(x0,y0){P_0}({x_0},{y_0})P0​(x0​,y0​)和P1(x1,y1){P_1}({x_1},{y_1})P1​(x1​,y1​),可以得到直线的微分方程: dydx=y1−y0x1−x0=k\frac{d_...

胡图图的博客 5978

计算机图形学的多边形扫描转换和区域填充

1.多边形扫描转换 多变形的两种表示方式: (1)顶点表示:存储多边形的顶点坐标 (2)点阵表示:存储多边形内的像素坐标

qq_51476492的博客 4136

计算机图形学学习笔记(4.3):多边形扫描转换与区域填充

多边形扫描转换 区域填充

大鹏的blog 4001
上一篇: leetcode刷题日记:217. Contains Duplicate(存在重复元素)和219. Contains Duplicate II(存在重复元素 II)
下一篇: 多边形的裁剪:一种基于有效边表的有效多边形裁剪算法的分析
apprentice_eye
博客等级 码龄6年 1165粉丝 348原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值