前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >光栅化 (Rasterization)

光栅化 (Rasterization)

作者头像
全栈程序员站长
发布2022-09-20 11:25:58
6090
发布2022-09-20 11:25:58
举报
文章被收录于专栏:全栈程序员必看

上一篇文章讨论了如何在多边形的某一点上分配光强度值,这里主要讨论如何为多边形确定实际的像素,即在栅格屏幕上的对应位置,这个过程称为光栅化(Rasterization)或者扫描转换 (Scan conversion)。

1 光栅化边

主要方法:DDA算法

起始点(xs,ys),终点(xe,ye)

Δy = 1,Δx 用 m 表示

∵ Δy/x= (ye-ys)/ (xe-xs), Δy = 1,

∴ m = (xe-xs)/(ye-ys)

浮点数伪代码:

光栅化 (Rasterization)
光栅化 (Rasterization)

整数伪代码:

光栅化 (Rasterization)
光栅化 (Rasterization)

这里 x = xi, xf > 0 时,一开始 xf = -0.5,四舍五入,如果 xf > 0,则说明 mf > 0.5,所以近1。

光栅化 (Rasterization)
光栅化 (Rasterization)

PS: div是整除,mod是取余,ye-ys为常数。

这里存在的一个问题是将3*3的正方形画成4*4,解决的办法是去掉第一个顶点或者去掉最后一个,这个根据个人习惯。

2 光栅化多边形

光栅化 (Rasterization)
光栅化 (Rasterization)

光栅化多边形可以用链表数组 a[n] 来实现,a[i] 代表 yi 所包含的所有的 x 值的链表(linked list)。链表的元素结构是 A(value, pointer),pointer指向下一个元素。

如图所示,竖条的每一个小格代表一个 a[i],y的值是无序的,扫描中,每一条扫描线每产生一对 (x,y),找到对应y值,如果不存在这个y,则加入一个链表,即 a[n+1],然后 x 根据升序插入,因为是链表,所以可以插入。在得出多边形在屏幕中相应位置时,也要计算改像素点的光强并存储。

PS: a[0] 出现两个相同的 x 值4,是因为它处于转折点。

实现光栅后,接下来要做的事情是多边形填充,可参见转载的文章 多边形区域填充算法--扫描线填充算法

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168028.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档