kanetaiの二次記憶装置

プログラミングに関するやってみた、調べた系のものをQitaに移して、それ以外をはてブでやる運用にしようと思います。http://qiita.com/kanetai

いろいろメモ

メモ
後でまとめる
作業ディレクトリとrev

svn diff -x -b -r 4117

intersectSC old ver.
 o(x_c, y_c), \vec{sv} = \vec{s_s s_e}, \vec{cv} ~ \vec{s_s o}とする。

    •  \vec{sv}\bullet \vec{cv}<0の場合  |\vec{cv}|\leq rなら交差、 |\vec{cv}|>rなら非交差

intersectSC1

    •  \vec{sv}\bullet \vec{cv}\geq 0かつ \vec{sv}\bullet \vec{cv} > |\vec{sv}|^2 の場合  |\vec{s_e o}| \leq rなら交差、 |\vec{s_e o}|>rなら非交差

※このとき常に、 \cos \theta \geq 0
intersectSC2

    • その他の場合  |\vec{cv}||\sin \theta | \leq rなら交差、 |\vec{cv}||\sin \theta| > rなら非交差

intersectSC3
 |\vec{cv}|^2 - \frac{(\vec{sv}\bullet \vec{cv})^2}{|\vec{sv}|^2} = |\vec{cv}|^2 - \frac{|\vec{sv}|^2|\vec{cv}|^2\cos^2\theta}{|\vec{cv}|^2} = |\vec{cv}|^2 - |\vec{cv}|^2\cos^2\theta = |\vec{cv}|^2(1-\cos^2\theta) = |\vec{cv}|^2\sin^2\theta

//instance method of Line class
public final boolean intersectsSC(Circle c){
	Point cv = c.o.sub(start), sv = end.sub(start);
	double d0 = sv.dot(cv);
	if(less(d0, 0)) return leq(cv.norm(), c.r);
	if(greater(d0, sv.normsq())) return leq(end.distanceSq(c.o), c.r * c.r);
	return leq(cv.normsq() - (d0/sv.normsq()) * d0, c.r * c.r);
}