Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取二维三角形中的点数_Python_Math_Geometry - Fatal编程技术网

Python 获取二维三角形中的点数

Python 获取二维三角形中的点数,python,math,geometry,Python,Math,Geometry,故事: 输入:3个坐标-三角形的顶点 所需输出:位于三角形(不包括边界)内具有整数坐标的点数 我最初的想法是获得包含三角形的矩形的坐标,迭代其中的点,并使用其中一个解决方案确定点是否在三角形内。到目前为止,我所拥有的: from collections import namedtuple from operator import attrgetter def is_inside_triangle(s, p1, p2, p3): as_x = s.x - p1.x as_y

故事:

  • 输入:3个坐标-三角形的顶点
  • 所需输出:位于三角形(不包括边界)内具有整数坐标的点数
我最初的想法是获得包含三角形的矩形的坐标,迭代其中的点,并使用其中一个解决方案确定点是否在三角形内。到目前为止,我所拥有的:

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]]))
它可以工作几个小时

问题:


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

我觉得“点”这个词很不准确,在大多数情况下点数是无限的。你是说像素数吗?那么为什么不使用三角形面积的方程,例如,
abs((xB*yA-xA*yB)+(xC*yB-xB*yC)+(xA*yC-xC*yA))/2
,以像素为单位测量?

@Karin,我想我搜索得不够好。谢谢你指出这是一个副本!对于那些对高效的特定于Python的解决方案感兴趣的人,我最终选择了以下内容:。对于不准确的术语,我深表歉意(试图通过使用“带整数坐标的点”而不是“点”使其更好一些)。这个等式考虑了三角形的边界,对吗?如果是,是否可以将其调整为不包括边界?谢谢