私は、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.このコードをより読みやすくする方法はありますか?
、ガレス・リースは_」に定義さ:3
あなたが怒鳴るデモを実行することができます
更新処理を持ついくつかの問題があることに注意してください2次元ベクトルクロスプロダクト** v ** x ** w ** ** v ** x ** w ** y ** - ** ** v ** y ** w ** x "_ 。代わりに** + **を使用しています。 –
[線分間の交点の計算]の可能な複製(http://stackoverflow.com/questions/16314069/calculation-of-intersections-between-line-segments) –