線分の交点
目次
# 解説
2つの線分の交点を求める.
線分を, とおく.
S1を底辺とみなすと、とをそれぞれ頂点として三角形が2つ出来る.
これらの高さをそれぞれ, とおく.
高さは、三角形の面積と底辺の長さで求まる.
底辺の長さは.
面積は外積の絶対値の二分の一なので、.
さて、交点をとおくと、求めるは始点から長さだけに向けて進んだ位置にある.
その長さが分かれば解が求まる.
長さは以下の比を満たす.
求める長さについて変形して、
よって、
求めるのはベクトルではなく点なので、始点を加えてやって
最後にが0の誤差範囲内であれば0と出力することを忘れずに.
# コード
Vector2 crossPoint(Vector2 &p0, Vector2 &p1, Vector2 &p2, Vector2 &p3) {
Vector2 baseSeg = p1 - p0;
Vector2 crossSeg = p3 - p2;
double h1 = fabs(baseSeg.cross(p2 - p0)) / (baseSeg.length() * 2);
double h2 = fabs(baseSeg.cross(p3 - p0)) / (baseSeg.length() * 2);
Vector2 p = p2 + crossSeg * h1 / (h1 + h2);
if (fabs(p.x) < EPS) p.x = 0.0;
if (fabs(p.y) < EPS) p.y = 0.0;
return p;
}