3

任意のポリゴンでコーナーが凹面か凸面かを検出しようとしています。すべてのエッジペア間の角度を計算する以下の関数を作成しました。ただし、それが戻るのが内側または外側のコーナー角度であるかどうかはわかりません。私はこれについてどうやって行くのか分かりません。助けていただければ幸いです!!!!

function findConvexCorner (pt){
var isCornerConvex = [];
for (var i =0; i < pt.length ;i++)
{
    var lastPt = pt.length -1;
    if (i==0){
        var vec1 = vec3.createXYZ( pt[lastPt].x - pt[i].x , pt[lastPt].y - pt[i].y ,0.0);
        var vec2 = vec3.createXYZ( pt[i].x - pt[i+1].x , pt[i].y - pt[i+1].y ,0.0);
        vec3.normalize(vec1);vec3.normalize(vec2);
            isCornerConvex.push(Math.acos(vec3.dot(vec1,vec2))*180/Math.PI);}
    else if(i == lastPt){
        var vec2 = vec3.createXYZ( pt[i-1].x - pt[i].x , pt[i-1].y - pt[i].y ,0.0);
        var vec1 = vec3.createXYZ( pt[0].x - pt[i].x , pt[0].y - pt[i].y ,0.0);
        vec3.normalize(vec1);vec3.normalize(vec2);
            isCornerConvex.push(Math.acos(vec3.dot(vec1,vec2))*180/Math.PI);}
    else{
        var vec1 = vec3.createXYZ( pt[i-1].x - pt[i].x , pt[i-1].y - pt[i].y ,0.0);
        var vec2 = vec3.createXYZ( pt[i+1].x - pt[i].x , pt[i+1].y - pt[i].y ,0.0);
        vec3.normalize(vec1);vec3.normalize(vec2);
            isCornerConvex.push(Math.acos(vec3.dot(vec1,vec2))*180/Math.PI);}
}
console.log("Angle: "+ isCornerConvex);
}

問題

4

3 に答える 3

3

凹面と凸面のコーナーを解決するためのコードを次に示します。

// this assumes nextEdge and previousEdge are vectors pointing out of a vertex and to the next one
var angle = ((Math.atan2(nextEdge.x, nextEdge.y) - Math.atan2(previousEdge.x, previousEdge.y) + Math.PI * 2) % (Math.PI * 2)) - Math.PI;

if (angle > 0) {
   corner.type = 'convex';
} else if (angle < 0) {
    corner.type = 'concave';
} else {
    corner.type = 'straight';
}
于 2014-09-03T13:49:42.490 に答える
0

あなたがやろうとしていることについてもう少し詳しく説明すると役立つかもしれません。そうは言っても、凸包を生成するためのアルゴリズムが役立つかもしれないようです。次のように、おそらく効率と実装の容易さの最良のバランスです。

http://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain

どの点が凸包の一部であるかがわかれば、残りはもう少し簡単になります。

于 2012-11-18T07:28:45.310 に答える
0

これを行う簡単な方法は、ベクトル行列式を評価することです。

まず、ポリゴンが時計回り/反時計回りであることを確認します(靴紐方式を使用)。

時計回りに行きましょう。つまり、すべての内角は、それぞれの隣接する辺の間で反時計回りに描かれていると見なすことができます。

辺ABとBCの間の特定の角度ABCについて、ベクトルBAとBCの間の行列式を計算できます(ad-bc式)。

行列式が<=0の場合、凹角(つまり、360度-ベクトル間の角度)を選択します。detが0より大きい場合、凸角を取ります。お役に立てれば

于 2019-07-23T02:21:28.553 に答える