JAVAで3点円を求める
JAVA(コンピュータ言語)で3点を通る円を求めるメソッドの紹介です。
円の中心点を算出する方法
恥ずかしいけど理解していない。ネットで拾った計算式をそのまま使いました。
こちら
を参考にさせていただきました。ありがとうございました。
この計算式だと、X,Y座標ともに符号が無くなっています。
そこで、x座標とy座標それぞれについて3点との距離を計算し、3つとも同じ距離(半径です)になった符号の組み合わせを選びとるようにしました。
距離の計算結果はdoubleだと微妙に違うのでintに変換してから比較しています。
xとyの符号の組み合わせは4つ。4回計算しますが、3つとも同じであれば、その時点で計算を終了します。
3点円を求めるJAVAメソッド
3つをpointを入力してCircleクラスを得ます。
PointはXY座標を格納する簡単なクラス
Circleは中心点と半径、描画の開始/終了角度を格納する簡単なクラスです。
public Circle sanTenEn( tomojavalib.p2cad.Point p1, tomojavalib.p2cad.Point p2,tomojavalib.p2cad.Point p3)
{
Circle c = new Circle();
double G=( p2.y*p1.x-p1.y*p2.x +p3.y*p2.x-p2.y*p3.x +p1.y*p3.x-p3.y*p1.x );
if(G==0.){c=null;return c;}
c.p.x = ((p1.x*p1.x+p1.y*p1.y)*(p2.y-p3.y)+(p2.x*p2.x+p2.y*p2.y)*(p3.y-p1.y)+(p3.x*p3.x+p3.y*p3.y)*(p1.y-p2.y) )/ ( 2.0 * G );
c.p.y = ((p1.x*p1.x+p1.y*p1.y)*(p2.x-p3.x)+(p2.x*p2.x+p2.y*p2.y)*(p3.x-p1.x)+(p3.x*p3.x+p3.y*p3.y)*(p1.x-p2.x) )/ ( 2.0 * G );
//xy符号のチェック
for(int ii=0;ii<4;ii++)
{
if(ii==1){ c.p.y = -c.p.y ; }
if(ii==2){ c.p.x=-c.p.x ; c.p.y = -c.p.y ; }
if(ii==3){ c.p.y = -c.p.y ; }
int r1 =(int)Math.sqrt((c.p.x-p1.x)*(c.p.x-p1.x)+(c.p.y-p1.y)*(c.p.y-p1.y));
int r2 =(int)Math.sqrt((c.p.x-p2.x)*(c.p.x-p2.x)+(c.p.y-p2.y)*(c.p.y-p2.y));
int r3 =(int)Math.sqrt((c.p.x-p3.x)*(c.p.x-p3.x)+(c.p.y-p3.y)*(c.p.y-p3.y));
if(r1==r2){if(r2==r3){break; }}
}
//半径を求める
c.r = Math.sqrt((c.p.x-p1.x)*(c.p.x-p1.x)+(c.p.y-p1.y)*(c.p.y-p1.y));
//円の開始角度
c.sangle=0.;
//円の終了角度
c.eangle=360.;
return c;
}
最終更新日: 2014-04-03 21:00:00