三个点内形成三角形的整数点数是多少?

tzu*_*zup 29 algorithm geometry

实际上,这是一个典型的问题,因为SO用户Victor提出了这个问题(在另一个关于在面试中要询问哪些任务的问题).

我不能在一小时(叹气)做到这一点,那么计算三角形内整数点数的算法是什么?

编辑:假设顶点在整数坐标处.(否则它成为一个问题,即找到三角形内的所有点,然后减去所有浮点只剩下整数点;一个不太优雅的问题).

Bil*_*ard 36

假设顶点位于整数坐标处,您可以通过在三角形周围构造一个矩形来得到答案,如Kyle Schultz的"调查拣选定理"中所述.

对于ajxk 矩形,内部点的数量是

I = (j – 1)(k – 1).
Run Code Online (Sandbox Code Playgroud)

对于下面的5 x 3矩形,有8个内部点.

alt text http://jwilson.coe.uga.edu/EMAT6680Fa05/Schultz/6690/Pick/Pick_Main_files/image008.jpg

对于具有垂直腿(j)和水平腿(k)的三角形,内部点的数量由下式给出

I = ((j – 1)(k – 1) - h) / 2
Run Code Online (Sandbox Code Playgroud)

其中h是矩形内部与三角形的斜边(而不是长度)重合的点数.

alt text http://jwilson.coe.uga.edu/EMAT6680Fa05/Schultz/6690/Pick/Pick_Main_files/image012.jpg

对于具有垂直侧或水平侧的三角形,内部点(I)的数量由下式给出

alt text http://jwilson.coe.uga.edu/EMAT6680Fa05/Schultz/6690/Pick/Pick_Formula5.jpg

其中j,k,h1,h2和b在下图中标出

alt text http://jwilson.coe.uga.edu/EMAT6680Fa05/Schultz/6690/Pick/Triangle3.jpg

最后,没有垂直或水平边的三角形的情况可以分成两个子情况,一个是三角形周围的区域形成三个三角形,另一个是周围区域形成三个三角形和一个矩形(见下图) .

第一子情况中的内部点(I)的数量由下式给出

alt text http://jwilson.coe.uga.edu/EMAT6680Fa05/Schultz/6690/Pick/Pick_Formula7.jpg

其中所有变量都标在下图中

alt text http://jwilson.coe.uga.edu/EMAT6680Fa05/Schultz/6690/Pick/triangle5.jpg

第二子情况下的内部点数(I)由下式给出

alt text http://jwilson.coe.uga.edu/EMAT6680Fa05/Schultz/6690/Pick/Pick_Main_files/image042.png

其中所有变量都标在下图中

alt text http://jwilson.coe.uga.edu/EMAT6680Fa05/Schultz/6690/Pick/Pick_Main_files/image038.png

  • @Cocksure然后不要理会这个,因为显示的方法不适用于[我们的三角形](http://imgur.com/S5F5ePA).使用[Shoelace Formula](http://en.wikipedia.org/wiki/Shoelace_formula)计算A要容易得多,用GCD计算边界点并解决Pick的定理为'I = A - B/2 + 1' (5认同)
  • 你们在编辑时一定是在读书.:) (3认同)

小智 13

Pick's定理(http://en.wikipedia.org/wiki/Pick%27s_theorem)指出放置在整数点上的简单多边形的表面由下式给出:

A = i + b/2 - 1
Run Code Online (Sandbox Code Playgroud)

这里A是三角形的表面,i是内部点的数量,b是边界点的数量.通过对每条线的斜率的最大公约数求和,可以容易地计算边界点b的数量:

b =   gcd(abs(p0x - p1x), abs(p0y - p1y)) 
    + gcd(abs(p1x - p2x), abs(p1y - p2y)) 
    + gcd(abs(p2x - p0x), abs(p2y - p0y))
Run Code Online (Sandbox Code Playgroud)

表面也可以计算.有关计算表面的公式,请参阅/sf/answers/1006788471/.结合这些已知值,我可以通过以下方式计算:

i = A + 1 - b/2
Run Code Online (Sandbox Code Playgroud)


gno*_*ice 11

我的下意识反应是蛮力:

  • 找到x和y方向上三角形的最大和最小范围.
  • 循环遍历这些范围内的所有整数点组合.
  • 对于每组点,使用标准测试之一(例如,相同或重心技术)来查看点是否位于三角形内.由于此类计算是用于检测光线/线段和三角形之间的交叉点的算法的组成部分,因此您还可以查看此链接以获取更多信息.


tek*_*ues 5

好的我会提出一个算法,它不会很棒,但它会起作用.

首先,我们需要一个三角形测试点.我建议使用这个优秀帖子中解释的"重心技术":

http://www.blackpawn.com/texts/pointinpoly/default.html

现在到算法:

  1. let(x1,y1)(x2,y2)(x3,y3)是三角形顶点

  2. 设ymin = floor(min(y1,y2,y3))ymax = ceiling(max(y1,y2,y3))xmin = floor(min(x1,x2,x3))ymax = ceiling(max(x1,x2, 3))

  3. 迭代从xmin到xmax和ymin到ymax,你可以枚举包含三角形的矩形区域中的所有整数点

  4. 使用三角形测试点,您可以测试枚举中的每个点,看它是否在三角形上.

这很简单,我认为它可以在不到半小时内完成编程.


Rob*_*ino 5

这被称为"三角形点"测试.

下面是文章有几种解决方案,这一问题:在三角测试点.

替代文字

检查点是否在三角形中的常用方法是找到将点连接到三角形的三个顶点中的每个顶点的向量,并对这些向量之间的角度求和.如果角度之和为2*pi(360度),则该点在三角形内,否则不是.