Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Java 如何使用Pick';任意给定三角形上的s定理_Java_Algorithm - Fatal编程技术网

Java 如何使用Pick';任意给定三角形上的s定理

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为): 对于所有边:

所以我想计算任意给定三角形内的点数。我知道我必须使用Pick定理,但我的代码却长得离谱,每种情况下都要测试大量的if-else-if语句。我一直在使用它作为指导,但最终得到了它(顶点是一个由3个数组组成的数组。每个数组是三角形顶点的(x,y)坐标):

但是,我并不总是得到正确的答案。我做错什么了吗?


内部晶格点的数量

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);

}