Java 检查点是否位于三角形内的性能(3D)
我正在寻找一种快速的java方法来检查一个点是否在三角形内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
我在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。