参考文档:
参考1:https://blog.youkuaiyun.com/u013044116/article/details/49737585
参考2:https://blog.youkuaiyun.com/keneyr/article/details/83747501
算法思想:
对多边形沿y轴从0开始遍历,建立边表NET。只记录顶点的x, dx, ymax。
根据NET构建活动边表AET(activate edge table)。射线与多边形的交点坐标为(x + △x, y + 1), △x是斜率的倒数(dx)。详解见 参考1。
实现代码:
点击查看代码
# encoding=utf8
import math
import cv2
import numpy as np
class EdgeTable:
def __init__(self, x, dx, ymax):
self.x = x
self.dx = dx
self.ymax = ymax
self.next = None
def fill_polys(polys):
poly_x_max = float('-inf')
poly_y_max = float('-inf')
for poly in polys:
poly_x_max = max(poly_x_max, poly[0])
poly_y_max = max(poly_y_max, poly[1])
poly_x_max += 1
poly_y_max += 1
point_count = len(polys)
# build edge table
net = [None for _ in range(poly_y_max)]
for i in range(poly_y_max):
for j in range(point_count):
# 一个点跟前面的点形成线段 跟后边的点也形成线段
if polys[j][1] == i:
if polys[(j - 1 + point_count) % point_count][1] > polys[j][1]:
x_ = polys[j][0]
dx_ = (
polys[(j - 1 + point_count) % point_count][0] - polys[j][0]
) / (polys[(j - 1 + point_count) % point_count][1] - polys[j][1])
ymax_ = polys[(j - 1 + point_count) % point_count][1]
pnt = EdgeTable(x_, dx_, ymax_)