1.问题简要说明:
a.图片的像素点大小为1×1的小矩形,以图片左下角为坐标原点,建立图片的直角坐标系
b.四边形的左下点在Y轴上半轴任意位置,宽为Width(>100),高为Height(>10),且与X轴有负小角度夹角(<10degree)
问题:
求取四边形所影响的像素点,及影响大小(四边形完全覆盖像素点时,定义影响大小为1)
2.快速扫描算法
a.传统扫描算法(C#)
1)根据四边形左下顶点的坐标及宽高,以及倾斜角度Theta,求取四边形四点坐标
2)根据四边形四个顶点求取扫描上下限(yLimit0,yLimit1)
3)建立四边形四条边对象
4)从yLimit0开始递增,求交。
a.每次将yIndex值与四边形转折点相比较,确定与扫描线相交的线段
b.建立活动边,逐次判断扫描线所处范围
5)相邻两条扫描线确定一行受影响区域
6)一行受影响区域中分成四个区域,即:区域Ⅰ,完全未收影响,影响大小为0;区域Ⅱ,受left line影响的部分区域,影响大小为大于0小于1的double数值;区域Ⅲ,完全受影响,受影响大小为1;区域Ⅳ,受right line影响的部分区域,影响大小为大于0小于1的double数值。
区域Ⅱ和区域Ⅳ的影响因子大小受制约算法效率的瓶颈。一般的求取方法是,根据交点逐一求取与x轴整数坐标值的交点。根据倾斜角度求取三角形或多边形面积。至少要算一次乘法,多次加减法。效率差强人意,在求取转折点时,突显出问题的复杂。
b.快速扫描算法(C#)
基本思想描述:
将倾斜四边形划分成三个区域,
采用垂直先扫描,中部区域占据四边形面积90%以上,一次乘法,之后通过加法计算交点,进而完成影响大小量的计算。左右区域较小,对计算精度影响较小,可采用行扫描一次粗略计算。
详细过程及代码——待续