获取2D三角形中的点数

时间:2016-08-26 21:15:06

标签: python math geometry

故事:

  • 输入: 3坐标 - 三角形的顶点
  • 所需输出:位于三角形内的整数坐标的点数,不包括边界

我最初的想法是获取包含三角形的矩形的坐标,迭代其中的点并使用其中一个"Is this point inside a triangle?"解决方案来确定点是否在三角形内。到目前为止我所拥有的:

from collections import namedtuple
from operator import attrgetter


def is_inside_triangle(s, p1, p2, p3):
    as_x = s.x - p1.x
    as_y = s.y - p1.y

    s_ab = (p2.x - p1.x) * as_y - (p2.y - p1.y) * as_x > 0

    if ((p3.x - p1.x) * as_y - (p3.y - p1.y) * as_x > 0) == s_ab:
        return False

    if ((p3.x - p2.x) * (s.y - p2.y) - (p3.y - p2.y) * (s.x - p2.x) > 0) != s_ab:
        return False

    return True


def solution(vertices):
    Point = namedtuple('Point', 'x,y')
    vertices = [Point(x, y) for x, y in vertices]

    min_x = min(vertices, key=attrgetter('x')).x
    min_y = min(vertices, key=attrgetter('y')).y

    max_x = max(vertices, key=attrgetter('x')).x
    max_y = max(vertices, key=attrgetter('y')).y

    return sum(1
               for x in range(min_x + 1, max_x)
               for y in range(min_y + 1, max_y)
               if is_inside_triangle(Point(x, y), *vertices))

适用于以下输入:

print(solution([(-1, -1), (1, 0), (0, 1)]))  # 1
print(solution([[3, 3], [4, 2], [10, 190]]))  # 96

虽然在足够大的三角形上证明这种方法非常慢,例如:

print(solution([[91207, 89566], [-88690, -83026], [67100, 47194]]))

有效数小时。

问题:

我认为主要的问题是我正在尝试检查可预先排除的太多点。计算三角形中点数的最效率方法是什么?

1 个答案:

答案 0 :(得分:1)

“点”这个词对我来说似乎非常不准确,在大多数情况下,的数量是无限的。你的意思是“像素”的数量?那么为什么不使用三角形区域的等式,例如abs((xB*yA-xA*yB)+(xC*yB-xB*yC)+(xA*yC-xC*yA))/2,以像素为单位?