Aquacolor

Aquacolor



直线绘制算法

Gumdrop · 2026-05-19 · 7浏览 · 未分类



简化策略

可以通过判断Dx、Dy的值是>0、=0、<0来将整个平面分成四个象限和四个轴向,轴向能被包含进象限。

又可以通过比较|Dx|、|Dy|,将一个象限分成两部分。

简化策略选取第一象限且|Dx|>=|Dy|的部分,考虑直线的绘制方法。

直线1.png

绘制流程

直线倒向x轴,因此可以认为x到y为单射,取绘制顺序x从x1到x2。

由于是光栅,点(x1,y1)代表了整个格子而非格点,同时建系认为(x1,y1)是格点中心。

于是光栅上(x1,y1)已经涂色,而x1+1可能对应涂黑y1或y1+1。

直线上x1+k对应y1+kDy/Dx,对于k=1,可能的判据就是Dy/Dx>=1/2;对于k=2,则判据可能为2Dy/Dx>=1/2或2Dy/Dx>=3/2;……

很明显的,判据具有a*Dy/Dx>=(2b-1)/2的形式,且判定成功一次则b+=1,而a=k。

直线2.png

初始化判据,绘制第一个像素

k从1开始,直到x1+k=x2

	如果判据得到真
	
		修改判据右侧(即b),绘制右上
		
	如果判据得到假
	
		绘制右侧
		
	k+=1,由于a=k,也修改了判据

算法实际进行的改进

判据a*Dy/Dx>=(2b-1)/2实际上就是a*2Dy-(2b-1)Dx>=0,在k=1时判据为2Dy-Dx>=0,若判定成功则判据变为4Dy-3Dx>=0,否则变为4Dy-Dx>=0。

判据为e>=0,实际上就是判定成功则e+2(Dy-Dx),否则e+2Dy。

解释那张图

直线4.png

是第四象限,且|Dx|>=|Dy|。m=Dy/Dx,是增量。

直线3.png

x从x1到x2,而y初始化为y1,实际上设置的是下一次(即循环第一次)的绘制点,可以看成是在循环前做了初始化

	绘制(x,y)
	
	如果增量e+m超过了判据,即-0.5的位置
	
		绘制目标往下挪一格,y <- y-1
		
		修改判断条件往下一格,判据e+2m>=-1.5其实就是(e+m+1)+m>=-0.5,也满足了判据右边不变
		
	如果增量没有超过判据
	
		绘制目标不动,还在y
		
		判断条件没改所以用的是(e+m)+m>=-0.5


©

comment 评论区

添加新评论

face表情



  • ©2026 bilibili.com

textsms
内容不能为空
昵称不能为空
email
邮件地址格式错误
web
beach_access
验证码不能为空
keyboard发表评论


star_outline 咱快来抢个沙发吧!




©2026 Aquacolor

Theme Romanticism2.2 by Akashi
Powered by Typecho