前回の記事で多角形GDLに各辺の長さを追加してみました。
今回はそれに角度の機能を追加していこうと思います。
下の画像は、頂点に角度を表示し、確認としてArchicadの寸法ツールで角度を測っている様子です。緑の文字と青い文字の数値がしっかり一致していることがわかるかと思います。
角度の表示 |
角度の計算
今回の角度の求め方は、ベクトルの内積と外積を用いました。
内積の計算でアークコサインより角度を求め、外積で向きを求めています。
そのコードを下記に示します。
マスタースクリプト
for i=1 to vertices x[i]=x[i] y[i]=y[i] next i for i=1 to vertices if i=vertices then after=1 else after=i+1 endif length[i]=sqr((x[after]-x[i])**2+(y[after]-y[i])**2) next i parameters \ x=x, y=y, length=length for i=1 to vertices if i=1 then i1=vertices else i1=i-1 endif if i=vertices then i2=1 else i2=i+1 endif !ベクトルの成分 ax=x[i2]-x[i] ay=y[i2]-y[i] bx=x[i1]-x[i] by=y[i1]-y[i] !内積から角度を求める t=acs((ax*bx+ay*by)/(sqr(ax**2+ay**2)*sqr(bx**2+by**2))) !外積から向きを求める if ax*by-ay*bx >= 0 then angle[i]=t else angle[i]=360 - t endif next i parameters angle=angle
2Dスクリプト
DEFINE STYLE "test" "New York", 2, 5, 0 SET STYLE "test" unID=1 for i=1 to vertices hotspot2 0 , y[i], unID, x[i], 1+128 :unID=unID+1 hotspot2 x[i], y[i], unID, x[i], 2 :unID=unID+1 hotspot2 -1 , y[i], unID, x[i], 3 :unID=unID+1 hotspot2 x[i], 0 , unID, y[i], 1+128 :unID=unID+1 hotspot2 x[i], y[i], unID, y[i], 2 :unID=unID+1 hotspot2 x[i], -1 , unID, y[i], 3 :unID=unID+1 if i=vertices then after=1 else after=i+1 endif if sqr((x[after]-x[i])**2+(y[after]-y[i])**2)>0 then line2 x[i], y[i], x[after], y[after] hotline2 x[i], y[i], x[after], y[after], unID :unID=unID+1 !長さ表示 text2 (x[after]-x[i])/2+x[i], (y[after]-y[i])/2+y[i], str(length[i]*1000, 5,0) !角度表示 text2 x[i], y[i], str(angle[i], 3, 2) endif next i
動きの確認
今回の機能は下の動画より確認できます。
角度による判定が必要な状況(例えば、入隅出隅判定など)ではこのようなプログラムが必要になったりしますので、是非試してみてください。
今回は以上となります。
最近は、より汎用的な基本プログラムに重点を置いてブログを書いています。
次回も機能を追加していきたいと思います。
なお、基本的なGDLの学習はこちらの教材がおすすめです!
GDLリファレンスがgraphisoftが用意していますが、初見では理解しづらいので、
簡単にまとめられたやさしく学ぶArchiCAD GDLプログラミングという本で基礎をしっかり学びましょう!
また、ココナラでのサポートサービスも始めましたので、
ご活用いただければと思います。
1日GDL作成やArchiCAD関連の相談のります 自分でGDLを作成している方へ【お知らせ】
Xのアカウントを作成しましたので、ぜひフォロー頂けると嬉しいです。
アカウントはこちらから⇨https://x.com/BIM_arekore
世界の建設業従事者、BIM推進者と繋がりたいです。よろしくお願いします。
0 件のコメント:
コメントを投稿
何でも気軽にコメントください。