すっきり

仕事で4点交差を実装した。4点交差ってA,B,C,Dっていう4点があるときにA,Bの線分とC,Dの線分があって、それの交点を求めるやつ。

Line2Dに交差するかどうかを判定するメソッドはあるんだけど、交点をだすメソッドはない。別に速度は求められてないので、めったにつかわないメソッドをつかってみようとおもってわざわざAffinTransform(行列)使ってみた。以下ソース。

public Point2D getCrossPoint(double ax, double ay, double bx, double by, 
                             double cx, double cy, double dx, double dy) 
               throws NoninvertibleTransformException {
        //行列で二元一次方程式を解く
	double[] elements = new double[]{
			by - ay          , dy - cy, 
			ax - bx          , cx - dx,
			ay * bx - ax * by, cy * dx - cx * dy,
	};

	AffineTransform trans = new AffineTransform(elements);
	AffineTransform itrans = trans.createInverse();
	Point2D cross = new Point2D.Double(0.0d, 0.0d);
	return itrans.transform(cross, null);
}

別に2元1次方程式を解くだけなので、一度解いてしまって一般解をここに書いてしまうのが早いんだろうと思う。4点交差なんて暗記してる人もいそう。

でも、2点を通る方程式をつくるのは楽だけど、それを解くのが結構面倒くさい。
紙に書いても字数が多くなるとやっぱり大変。あと、字が汚いので途中でaとかbとかxとかyとかごっちゃになってわからなくなってしまう。

ということで超すっきり。なんか計算遅そうだけど。
まあ、前提は「そんなに速くなくていい」なので、これでいいのだ。