gpt4 book ai didi

python - 获取二维三角形中的点数

转载 作者:行者123 更新时间:2023-11-28 18:28:45 27 4
gpt4 key购买 nike

<分区>

故事:

  • 输入: 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]]))

工作数小时。

问题:

我认为主要问题是我试图检查太多可以事先排除的点。计算三角形中点数的最有效方法是什么?

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com