すあまの備忘録

誰得内容の自分のための非営利目的備忘録ブログ(筆者がわかっても内緒にしてください)

多角形の内角を計算する

f:id:godofsuama:20191115003137g:plain

上記のようなポリゴンの凹を避けるために使用しました。使用例は後日

計算式はかけないので以下の記事を参考にWrangleで実装

@NULLcharさんありがとうございます。

180度以上の角度(へこみ)が存在している多角形の角度計算プログラム - Qiita

//Point Wrangleで実行、結果の角度はPointのpDegreeに値が入ります。
//180度以上の角度が存在する多角形の角度計算

//----------------------------------------//
//初期値
vector p0 = set(0,0,0);
vector p1 = set(0,0,0);
vector p2 = set(0,0,0);
float triArea = 0;

//----------------------------------------//
//最期のポイント番号の時だけ分岐
if (@ptnum == 0) {
    p0 = point(0,"P",@numpt -1);
    p1 = point(0,"P",@ptnum);
    p2 = point(0,"P",@ptnum +1);

}else if(@ptnum == @numpt -1) {
    p0 = point(0,"P",@ptnum -1);
    p1 = point(0,"P",@ptnum);
    p2 = point(0,"P",0);
}else{
    p0 = point(0,"P",@ptnum -1);
    p1 = point(0,"P",@ptnum);
    p2 = point(0,"P",@ptnum +1);
}

//----------------------------------------//
//角度計算式の各要素を事前計算
float xA = (p0.x - p1.x);
float xB = (p2.x - p1.x);
float zA = (p0.z - p1.z);
float zB = (p2.z - p1.z);

//角度計算式
float formA = (xA * xB) + (zA * zB);
float formB = sqrt(pow(xA,2) + pow(zA,2)) * sqrt(pow(xB,2) + pow(zB,2));
float pRad = acos(formA / formB);

//角度に変換
f@pDegree = degrees(pRad);

//----------------------------------------//
//三角形の符号付き面積を計算
triArea =  ((p0.x * p1.z) + (p1.x * p2.z) + (p2.x * p0.z) - (p0.z * p1.x) - (p1.z * p2.x) - (p2.z * p0.x)) /2;

//符号付綿製から内角を計算
if(triArea > 0){
    @pDegree = 360 - @pDegree;
}