我正在使用Processing 3.0.1。我想检查两个2D段是否相互交叉。
每个点都是" float [2]"。该函数接收四个点(P1,P2,P3,P4)作为参数,并通过求解线P1P2,P3P4的参数方程来检查它。
一方面,我宣布了四点:
float p1[] = new float[2];
p1[0] = 200.0;
p1[1] = 200.0;
float p2[] = new float[2];
p1[0] = 200.0;
p1[1] = 100.0;
float p3[] = new float[2];
p1[0] = 150.0;
p1[1] = 150.0;
float p4[] = new float[2];
p1[0] = 200.0;
p1[1] = 300.0;
System.out.println(cross(p1, p2, p3, p4));
打印" false"。
另一方面,我创建了一个点数组并初始化它们。
float trian[][] = new float[3][2];
trian[0][0] = 150.0;
trian[0][1] = 150.0;
trian[1][0] = 200.0;
trian[1][1] = 300.0;
trian[2][0] = 300.0;
trian[2][1] = 200.0;
float squar[][] = new float[4][2];
squar[0][0] = 100.0;
squar[0][1] = 100.0;
squar[1][0] = 100.0;
squar[1][1] = 200.0;
squar[2][0] = 200.0;
squar[2][1] = 200.0;
squar[3][0] = 200.0;
squar[3][1] = 100.0;
System.out.println(cross(squar[2], squar[3], trian[0], trian[1]));
打印" true"。
为什么我会得到不同的结果?我把这个函数计算在这里(我已经重新检查了两次,这是正确的)
// Returns whether segments P1P2 and P3P4 cross or not
boolean cross(float p1[], float p2[], float p3[], float p4[]) {
float x1 = p1[0];
float y1 = p1[1];
float x2 = p2[0];
float y2 = p2[1];
float x3 = p3[0];
float y3 = p3[1];
float x4 = p4[0];
float y4 = p4[1];
float den = (x2 - x1)*(y4 - y3) - (y2 - y1)*(x4 - x3);
if (den == 0)
return false;
float num = (x2 - x1)*(y1 - y3) + (y2 - y1)*(x3 - x1);
float k = num/den;
if ((k >= 0) && (k <= 1))
return true;
return false;
}
感谢您的帮助。
答案 0 :(得分:0)
看起来您已经解决了问题,但将来,使用PVector
而不是带有2个索引的数组来跟踪您的观点可能会有所帮助:
PVector p1 = new PVector(200, 200);
PVector p2 = new PVector(200, 100);
PVector p3 = new PVector(150, 150);
然后,您可以创建一个跟踪点数的Shape
类:
class Shape{
ArrayList<PVector> points = new ArrayList<PVector>();
public void addPoint(PVector p){
points.add(p);
}
public void draw(){
//draw the points
}
}
然后使用Shape
类:
Shape triangle = new Shape();
triangle.addPoint(p1);
triangle.addPoint(p2);
triangle.addPoint(p3);
这将比使用数组更好地帮助您组织和封装数据。这是物体被发明的东西,它们会让你的生活变得更加容易。