我正試圖在Java中實現描述基於矢量的段交集算法here(最新推出的答案),但是因爲它通常與實現算法一起使用,所以您不能完全理解,所以我一直失敗。如果有人能校對我的代碼並告訴我我做錯了什麼,我將非常感激。段交集實現
boolean intersect(PVector p, PVector r, PVector q, PVector s){
// r x s
double rxs = r.x*s.y + r.y*s.x;
//(q-p) x r
double qpxr = (q.x-p.x)*r.y + (q.y-p.y)*r.x;
PVector qp = q.sub(p).copy(); //q - p
//case one lines parallel might intersect:
if(rxs==0 && qpxr==0){
println("case one: collinear might intersect");
double t0 = qp.dot(r);
double t1 = qp.dot(r)/r.dot(r)+(s.dot(r)/r.dot(r));
return max((float)t0 , 0.f) <= min((float)t1, 1.f);//if ranges intersect the segments intersect
}else if(rxs==0 && qpxr!=0){
println("case two: parallel no intersect");
return false;
}else if(rxs!=0){
println("case three");
double u = qpxr/rxs;
double t = (qp.x*r.y + qp.y*r.x)/rxs;
if((u>=0 && u<=1) && (t<=1 && t>=0)){
PVector intersect = p.copy();
intersect.add(r.copy().mult((float)t));
point(intersect.x, intersect.y);
return true;
}else{
println("no intersect");
print(u);
print(" ");
println(t);
}
}else{
println("case four no intersect");
return false;
}
return false;
}
另外我試着用手工作一些答案,似乎仍然失敗,所以現在我有點失落。例如:
p=(0;0), r=(10;10)
q=(10;0), s=(-10;10)
則r x s = 10*10 + (-10*10) = 0
這會傳遞到其中假定並行性的第二情況下,即使各段都沒有。
P.S.有沒有辦法讓這段代碼更具可讀性?
在這個問題的答案,加雷思·雷斯定義_「的二維矢量交叉乘積** v **×** w **是** ** ** ** ** ** ** ** ** ** ** ** ** **「**」 。您正在使用** + **。 –
[計算線段之間的交點]可能有重複(http://stackoverflow.com/questions/16314069/calculation-of-intersections-between-line-segments) –