![]() |
2
13
皮克定理( http://en.wikipedia.org/wiki/Pick%27s_theorem )声明放置在整数点上的简单多边形的表面由以下公式给出:
这里a是三角形的曲面,i是内部点的数目,b是边界点的数目。边界点b的个数可以通过求每条直线的斜率的最大公约数之和很容易地计算出来:
表面也可以计算。有关计算曲面的公式,请参见 https://stackoverflow.com/a/14382692/2491535 . 结合这些已知值,我可以通过以下方式计算:
|
![]() |
3
11
我下意识的反应是野蛮地强迫它:
|
![]() |
4
5
这被称为“三角形中的点”测试。 这里是 文章 对于这个问题有几种解决方案: Point in the Triangle Test .
检查点是否在三角形中的常用方法是 找到向量 将该点连接到三角形的三个顶点中的每一个,以及 求和 在这些向量之间。如果角度之和为 2×PI (360度)然后点是 在三角形内 否则就不是了。 |
![]() |
5
5
好的,我会提出一个算法,它不会很出色,但会起作用。 首先,我们需要三角测试中的一个点。我建议使用“重心技术”,如这篇优秀文章所述: http://www.blackpawn.com/texts/pointinpoly/default.html 现在来看看算法:
它很简单,我想它可以在不到半小时内被编程。 |
![]() |
6
1
对于非暴力方法,我只有一半的答案。如果顶点是整数,可以将其简化为计算如何找到边相交的整数点。利用这个数字和三角形的面积(Heron公式),您可以使用pick定理来找到内部整数点的数量。 编辑:对于另一半,找到与边缘相交的整数点,我怀疑它是点之间x和y差减去1的最大公分母,或者如果距离减去1,如果x或y差之一为零。 |
![]() |
7
1
这是另一种方法,不一定是最好的,但一定能打动面试官。 首先,用最低的x坐标“l”、最高的x坐标“r”和剩余的点“m”(左、右和中)调用该点。 然后,建立了两个布雷森汉姆直线算法实例。参数化一个实例从L到R,第二个实例从L到M。同时运行x=x[l]到x[m]的算法。但是,不要绘制任何线条或打开任何像素,而是计算线条之间的像素。 从x[l]到x[m]后,将第二个bresenham的参数从m改为r,然后继续同时运行x=x[m]到x[r]的算法。 这与7小时前Erwin Smout提出的解决方案非常相似,但使用的是Bresenham而不是线性斜率公式。 我认为为了计算像素的列数,需要确定m是在线lr的上方还是下方,当然,当两个点具有相同的x或y坐标时,会出现特殊情况。但当这一点出现时,你的面试官会适当地感到敬畏,你可以继续下一个问题。 |
![]() |
8
0
快速n'dirty伪代码:
|
![]() |
9
0
我有这个主意- 设a(x1,y1),b(x2,y2)和c(x3,y3)为三角形的顶点。“count”是构成三角形的整数点的数目。 如果我们需要三角形边上的点,那么使用欧几里得距离公式 http://en.wikipedia.org/wiki/Euclidean_distance ,三边的长度都可以确定。 所有三个边的长度之和-3,将给出这个计数。 为了找到三角形内的点数,我们需要使用三角形填充算法,而不是执行实际的渲染,即执行drawpixel(x,y),只需遍历循环并在循环时不断更新计数。 三角形填充算法
应该帮助。这里提到的 http://www.gidforums.com/t-20838.html 干杯 |
![]() |
10
0
我要这样做: 取三角形的最高点(Y坐标最高的点)。从那一点开始有两个“斜坡”。这不是一般的解决方案,但为了便于可视化,请考虑“向左”(减少x坐标)和“向右”两种情况。 从这两个斜面和任何小于最高点的给定Y坐标,您应该能够计算出现在由斜面设置的边界内的整数点的数目。迭代减少Y坐标,将所有这些点相加。 当减少的Y坐标达到三角形的第二个最高点时停止。 现在,您已经计算了所有“第二个最高点以上”的点,现在剩下的问题是“计算某些点(小得多)内的所有点”。!!!)三角形,你知道它的上边和x轴平行。 重复同样的步骤,但现在用“最左边的点”代替“最上面的点”,用“增加x”代替“减少y”继续。 在那之后,剩下的问题是计算一个,再一次小得多的三角形中的所有整数点,你知道三角形的上边平行于x轴,左边平行于y轴。 不断重复(重复),直到你在你剩下的三角形中不计算任何点为止。 (我现在给你做作业了吗?) |
![]() |
12
0
我发现了一个非常有用的链接,它清楚地解释了这个问题的解决方案。我在坐标几何中很弱,所以我使用这个解决方案并在爪哇中编码它(至少对于我试过的测试案例)。 http://mathforum.org/library/drmath/view/55169.html
|
![]() |
13
0
下面是的python实现 @Prabhala's solution :
用途:
|
![]() |
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 6 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 6 月前 |
![]() |
b39b332d · 使用C++标准库实现高效间隔存储 10 月前 |
![]() |
Paul C · 在维基百科上,将二叉搜索树转换为排序链表的算法是否存在错误? 10 月前 |
![]() |
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 10 月前 |
![]() |
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 11 月前 |