Java 如何使用Pick';任意给定三角形上的s定理
所以我想计算任意给定三角形内的点数。我知道我必须使用Pick定理,但我的代码却长得离谱,每种情况下都要测试大量的if-else-if语句。我一直在使用它作为指导,但最终得到了它(顶点是一个由3个数组组成的数组。每个数组是三角形顶点的(x,y)坐标): 但是,我并不总是得到正确的答案。我做错什么了吗?:Java 如何使用Pick';任意给定三角形上的s定理,java,algorithm,Java,Algorithm,所以我想计算任意给定三角形内的点数。我知道我必须使用Pick定理,但我的代码却长得离谱,每种情况下都要测试大量的if-else-if语句。我一直在使用它作为指导,但最终得到了它(顶点是一个由3个数组组成的数组。每个数组是三角形顶点的(x,y)坐标): 但是,我并不总是得到正确的答案。我做错什么了吗?: 内部晶格点的数量 i=(2*A+2-b)/2 其中A是三角形的面积,b是边界处晶格点的数量 面积: 点(x0,y0)-(x1,y1)之间,包括第一个点,不包括最后一个点(GCD为): 对于所有边:
内部晶格点的数量
i=(2*A+2-b)/2
其中A是三角形的面积,b是边界处晶格点的数量面积: 点(x0,y0)-(x1,y1)之间,包括第一个点,不包括最后一个点(GCD为): 对于所有边:
b = PointsOnLine(V[0].x, V[0].y, V[1].x, V[1].y) +
PointsOnLine(V[1].x, V[1].y, V[2].x, V[2].y) +
PointsOnLine(V[0].x, V[0].y, V[2].x, V[2].y)
现在您可以根据@Mbo答案获得
i
:[已编辑]
private static long gcd(long n0, long n1) {
long a = n0;
long b = n1;
while (a != 0) {
long temp = a;
a = b % a;
b = temp;
}
return b;
}
public static long pointOnLine(long[][] vertices) {
return gcd(Math.abs(vertices[0][0] - vertices[1][0]),
Math.abs(vertices[0][1] - vertices[1][1])) +
gcd(Math.abs(vertices[1][0] - vertices[2][0]),
Math.abs(vertices[1][1] - vertices[2][1])) +
gcd( Math.abs(vertices[2][0] - vertices[0][0]),
Math.abs(vertices[2][1] - vertices[0][1]));
}
public static long area(long[][] vertices) {
return Math.abs((vertices[1][0] - vertices[0][0]) * (vertices[2][1] - vertices[0][1])
- (vertices[2][0] - vertices[0][0]) * (vertices[1][1] - vertices[0][1]));
}
public static void main(String[] args) {
long[][] vertices = {{91207, 89566}, {-88690, -83026}, {67100, 47194}};
//long[][] vertices = {{2,3}, {6,9}, {10,160}};
long i = (area(vertices) + 2 - pointOnLine(vertices)) / 2;
System.out.println("points: " + i);
}
我的答案是:b=b-3//因为顶点数了两次。@DavidPérezCabrera我加了b-3,但我还是得到了错误的答案。你能给我顶点和预期的结果吗?你试过我的算法了吗?@DavidPérezcabra(2,3)、(6,9)、(10160),ans:289这一个有效。(9120789566),(-88690,-83026),(6710047194),ans:1730960165。这个给了我一个很差的号码。谢谢,现在可以用了。
2*A = Abs (V[1].x-V[0].x)*(V[2].y-V[0].y) - (V[2].x-V[0].x)*(V[1].y-V[0].y))
function PointsOnLine(x0, y0, x1, y1) = GCD(Abs(x2-x1), Abs(y2-y1))
b = PointsOnLine(V[0].x, V[0].y, V[1].x, V[1].y) +
PointsOnLine(V[1].x, V[1].y, V[2].x, V[2].y) +
PointsOnLine(V[0].x, V[0].y, V[2].x, V[2].y)
private static long gcd(long n0, long n1) {
long a = n0;
long b = n1;
while (a != 0) {
long temp = a;
a = b % a;
b = temp;
}
return b;
}
public static long pointOnLine(long[][] vertices) {
return gcd(Math.abs(vertices[0][0] - vertices[1][0]),
Math.abs(vertices[0][1] - vertices[1][1])) +
gcd(Math.abs(vertices[1][0] - vertices[2][0]),
Math.abs(vertices[1][1] - vertices[2][1])) +
gcd( Math.abs(vertices[2][0] - vertices[0][0]),
Math.abs(vertices[2][1] - vertices[0][1]));
}
public static long area(long[][] vertices) {
return Math.abs((vertices[1][0] - vertices[0][0]) * (vertices[2][1] - vertices[0][1])
- (vertices[2][0] - vertices[0][0]) * (vertices[1][1] - vertices[0][1]));
}
public static void main(String[] args) {
long[][] vertices = {{91207, 89566}, {-88690, -83026}, {67100, 47194}};
//long[][] vertices = {{2,3}, {6,9}, {10,160}};
long i = (area(vertices) + 2 - pointOnLine(vertices)) / 2;
System.out.println("points: " + i);
}