JAVAで角Rを計算するアルゴリズム
2直線の交点に角Rを描画するためのメソッドを紹介します。下の図のように描画できます。
角R計算の順序
計算の考え方を図で書くと以下のようになります。
①2つの直線それぞれに角Rの半径だけオフセットした直線を求める。
(オフセット線は2方向できるので、2直線の組み合わせは4通りになる)
②2つのオフセット線の交点を求める。
この交点が角Rの中心点となる。交点は4つできるので、この中から描画したい位置を選ぶ必要があります。
③角Rの中心点から2つの直線それぞれに垂点を下ろす。
この点が、角R線の始終点になる
④中心点から角R線の始終点へ直線をひき、それぞれの角度を求める。
④中心点、半径、描画開始角度、描画角度が得られたので、この情報を元に角Rを描画します。
角Rを求めるJAVAメソッド
上の考え方をJAVAのコードで書くと下記のようになります。
lineOffset()はオフセット線を返すメソッド。
kouten()は2直線の交点を返すメソッド
suiten()は垂点を返すメソッド
2つの垂点と2直線の交点の角度を求めて比較しています。
角Rの描画範囲は始点から時計回りと反時計回りに描画する2通りの書き方があります。
描画範囲内に交点方向を含む一方を選択選択するためにこの比較をしています。
JAVA 楽天 によるアルゴリズム
public Circle kadoR(Line l1 , Line l2 , double r , int houkou )
{
Circle c = new Circle();
//半径を設定
c.r = r;
double i1,i2;
//方向による場合分け
//houkouの0-3の値で交点の位置を選ぶ
if(houkou ==0){i1=0.;i2=0.;}else if(houkou ==1){i1=0.;i2=1.;}else if(houkou ==2){i1=1.;i2=0.;}else {i1=1.;i2=1.;}
//2直線のオフセット線を算出する
Line l1f = lineOffset( l1 , r ,i1);
Line l2f = lineOffset( l2 , r ,i2);
//System.out.println(l2f+"-");
//オフセット線の交点(角Rの中心)を算出
c.p = kouten( l1f , l2f );
//System.out.println(c.p.x+"--");
//交点がなければNULLを返す
if(c.p==null){ return null; }
//垂点の算出
Point sp1 = suiten( l1, c.p);
Point sp2 = suiten( l2, c.p);
//2直線の交点
Point kouten = kouten( l1 , l2 );
//角度の算出
double kakudo1= tenTenKakudo( c.p , sp1 ) ;
double kakudo2= tenTenKakudo( c.p , sp2 ) ;
double kakudo3= tenTenKakudo( c.p , kouten ) ;
c.sangle = kakudo1;
double endangle = kakudo2-kakudo1;
if(endangle>=360.){endangle=endangle-360.;}if(endangle<0.){endangle=endangle+360.;}
double midangle = kakudo3-kakudo1;
if(midangle>=360.){midangle=midangle-360.;}if(midangle<0.){midangle=midangle+360.;}
double houkoua = endangle - midangle;
if(houkoua >0 ){
c.eangle = endangle;
}else {
c.eangle = -360.+endangle;
}
return c;
}
直線の処理
角Rを描画することはこのメソッドで出来ますが、角Rを作った直線のトリムもする必要があります。
これは上のメソッドで得たCircle cを用いて下記のように修正します。
(Line)l.sp = pointLengthAngle(c.p, c.r, c.sangle);
または
(Line)l.ep = pointLengthAngle(c.p, c.r, c.eangle);
pointLengthAngle()はある点からある距離、ある角度だけ移動した点を求めるメソッドです。
つまりkadoR()の中で計算した垂点と同じ位置の点を計算しています。
最終更新日: 2014-04-12 06:51:03