故事:
我最初的想法是获取包含三角形的矩形的坐标,迭代其中的点并使用其中一个"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]]))
有效数小时。
问题:
我认为主要的问题是我正在尝试检查可预先排除的太多点。计算三角形中点数的最效率方法是什么?
答案 0 :(得分:1)
“点”这个词对我来说似乎非常不准确,在大多数情况下,点的数量是无限的。你的意思是“像素”的数量?那么为什么不使用三角形区域的等式,例如abs((xB*yA-xA*yB)+(xC*yB-xB*yC)+(xA*yC-xC*yA))/2
,以像素为单位?