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

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

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

広告

角R計算の順序

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

①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

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

広告
新着ページ

AIを利用し、衣服のデザイン画から型紙を制作する方法  
2つのアパレル3D技術でひらくオーダーメイド生産の手法  
【洋裁型紙】前後身頃の肩の傾きは何故前身頃の方が傾いているのか  
電子追尾式天体写真撮影法  
日本ミツバチ巣箱の種類  
ドラフター(製図台)でソーイング  
日本ミツバチが逃亡  
カメさんの箱庭  
天体用デジタルカメラの構造と天体写真  
Javaで静止画像(Jpeg)を動画(Mov)に変換  
USBカメラをJAVAで制御  

他のサイト

3D-CAD
洋裁CAD

いいねなど

 RSS 

Author: Tomoyuki Ito

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