Java 检查点是否位于三角形内的性能(3D)

Java 检查点是否位于三角形内的性能(3D),java,c++,math,vector,3d,Java,C++,Math,Vector,3d,我正在寻找一种快速的java方法来检查一个点是否在三角形内 我在Kasper Fauerby的论文中找到了下面的C++代码: typedef unsigned int uint32; #define in(a) ((uint32&) a) bool checkPointInTriangle(const VECTOR& point, const VECTOR& pa,const VECTOR& pb, const VECTOR& pc) { VECTOR

我正在寻找一种快速的java方法来检查一个点是否在三角形内

我在Kasper Fauerby的论文中找到了下面的C++代码:

typedef unsigned int uint32;
#define in(a) ((uint32&) a)
bool checkPointInTriangle(const VECTOR& point, const VECTOR& pa,const VECTOR& pb, const VECTOR& pc) {
  VECTOR e10=pb-pa;
  VECTOR e20=pc-pa;

  float a = e10.dot(e10);
  float b = e10.dot(e20);
  float c = e20.dot(e20);
  float ac_bb=(a*c)-(b*b);
  VECTOR vp(point.x-pa.x, point.y-pa.y, point.z-pa.z);

  float d = vp.dot(e10);
  float e = vp.dot(e20);
  float x = (d*c)-(e*b);
  float y = (e*a)-(d*b);
  float z = x+y-ac_bb;
  return (( in(z)& ~(in(x)|in(y)) ) & 0x80000000);
}
我想知道这个代码片段是否可以转换为java,如果可以,它是否比我的java代码性能更好:

public class Util {
    public static boolean checkPointInTriangle(Vector p1, Vector p2, Vector p3, Vector point) {
        float angles = 0;

        Vector v1 = Vector.min(point, p1); v1.normalize();
        Vector v2 = Vector.min(point, p2); v2.normalize();
        Vector v3 = Vector.min(point, p3); v3.normalize();

        angles += Math.acos(Vector.dot(v1, v2));
        angles += Math.acos(Vector.dot(v2, v3));
        angles += Math.acos(Vector.dot(v3, v1));

        return (Math.abs(angles - 2*Math.PI) <= 0.005);
    }

    public static void main(String [] args) {
        Vector p1 = new Vector(4.5f, 0, 0);
        Vector p2 = new Vector(0, -9f, 0);
        Vector p3 = new Vector(0, 0, 4.5f);
        Vector point = new Vector(2, -4, 0.5f);

        System.out.println(checkPointInTriangle(p1, p2, p3, point));
    }
}
还是有一种更快的Java方法


提前谢谢

您找到的代码如果正确,应该比您得到的代码快一点。返回语句

return (( in(z)& ~(in(x)|in(y)) ) & 0x80000000);
这只是检查浮点数符号位的一种复杂方法;如果我没有完全错的话,这相当于:

return z < 0 && x >= 0 && y >= 0;
返回z<0&&x>=0&&y>=0;

论文的正文应该证实这一点。其余的我想你可以自己转换。

你找到的代码,如果正确的话,应该比你得到的要快一点。返回语句

return (( in(z)& ~(in(x)|in(y)) ) & 0x80000000);
这只是检查浮点数符号位的一种复杂方法;如果我没有完全错的话,这相当于:

return z < 0 && x >= 0 && y >= 0;
返回z<0&&x>=0&&y>=0;

论文的正文应该证实这一点。其余的我想你可以改变自己。

在问之前你真的试过吗?如果你做了什么?你知道吗?凯文:我不知道如何将C++代码片段转换成java(返回语句是什么?),所以我需要在正确的方向上轻轻推动。但是讨论是关于2D的。在提问之前你真的试过了吗?如果你做了什么?你知道吗?凯文:我不知道如何将C++代码片段转换成java(返回语句是什么?),所以我需要在正确的方向上轻轻推动。但讨论的是2D。