ともさんのHP >プロブラミング >JAVAで幾何計算 >角Rの計算


JAVAで角Rを計算するアルゴリズム

2直線の交点に角Rを描画するためのメソッドを紹介します。下の図のように描画できます。
javaで角R

広告

角R計算の順序

計算の考え方を図で書くと以下のようになります。
2本の直線

@2つの直線それぞれに角Rの半径だけオフセットした直線を求める。  (オフセット線は2方向できるので、2直線の組み合わせは4通りになる)
オフセット線

A2つのオフセット線の交点を求める。
 この交点が角Rの中心点となる。交点は4つできるので、この中から描画したい位置を選ぶ必要があります。
オフセット線交点

B角Rの中心点から2つの直線それぞれに垂点を下ろす。
 この点が、角R線の始終点になる
垂点

C中心点から角R線の始終点へ直線をひき、それぞれの角度を求める。
垂直線

C中心点、半径、描画開始角度、描画角度が得られたので、この情報を元に角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

ともさんのHP >プロブラミング >JAVAで幾何計算 >角Rの計算

このエントリーをはてなブックマークに追加
広告
おすすめ記事
新着ページ

型紙の製図方法  
CADデータエクセルファイルに変換するJavaClass  
自作したミツバチの巣箱  
Javaで静止画像(Jpeg)を動画(Mov)に変換  
蜂舎のこと  
「吉田式巣箱」の製作:巣箱編  
ミツバチ用電気柵の構造  
【家庭菜園】輪作プラン  
小屋作り  
ミツバチの巣箱  
吉田式巣箱  

私の他のサイト

ともさんの箱庭(ブログ)
家庭菜園
3D-CAD
洋裁CAD

いいねなど

 RSS 
PageSpeedInsights
html5チェック

Author: Tomoyuki Ito

このサイトの文章・写真の無断転載を禁じます