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
小智 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)
好的我会提出一个算法,它不会很棒,但它会起作用.
首先,我们需要一个三角形测试点.我建议使用这个优秀帖子中解释的"重心技术":
http://www.blackpawn.com/texts/pointinpoly/default.html
现在到算法:
let(x1,y1)(x2,y2)(x3,y3)是三角形顶点
设ymin = floor(min(y1,y2,y3))ymax = ceiling(max(y1,y2,y3))xmin = floor(min(x1,x2,x3))ymax = ceiling(max(x1,x2, 3))
迭代从xmin到xmax和ymin到ymax,你可以枚举包含三角形的矩形区域中的所有整数点
使用三角形测试点,您可以测试枚举中的每个点,看它是否在三角形上.
这很简单,我认为它可以在不到半小时内完成编程.