7

3点間の角度を計算する必要があります。このために、私は次のことを行います。

  1. 3つのポイントをつかみます(前、現在、次、ループ内にあります)
  2. ピタゴラスで点間の距離を計算する
  3. を使用して角度を計算しますMath.acos

これは、角度が 180 度を超える形状では問題ないように見えますが、形状にそのような角がある場合、短辺が計算されます。これが私が何を意味するかを示す図です(赤い値は間違っています):

計算で何がうまくいかないかを示すスクラッチ

これは、計算を行うコードです。

// Pythagoras for calculating distance between two points (2D)
pointDistance = function (p1x, p1y, p2x, p2y) {
    return Math.sqrt((p1x - p2x)*(p1x - p2x) + (p1y - p2y)*(p1y - p2y));
};

// Get the distance between the previous, current and next points
// vprev, vcur and vnext are objects that look like this:
//     { x:float, y:float, z:float }
lcn = pointDistance(vcur.x, vcur.z, vnext.x, vnext.z);
lnp = pointDistance(vnext.x, vnext.z, vprev.x, vprev.z);
lpc = pointDistance(vprev.x, vprev.z, vcur.x, vcur.z);

// Calculate and print the angle
Math.acos((lcn*lcn + lpc*lpc - lnp*lnp)/(2*lcn*lpc))*180/Math.PI

コードに何か問題がありますか、何かをするのを忘れましたか、それともまったく別の方法で行う必要がありますか?

4

3 に答える 3

1

これがどのように機能するかの実際の例がありますが、必ずしも簡単ではありません。

var point1x = 0, point1y = 0,
    point2x = 10, point2y = 10,
    point3x = 20, point3y = 10,
    point4x = 10, point4y = 20;

var slope1 = Math.atan2(point2y-point1y,point2x-point1x)*180/Math.PI;
var slope2 = Math.atan2(point3y-point2y,point3x-point2x)*180/Math.PI;
var slope3 = Math.atan2(point4y-point3y,point4x-point3x)*180/Math.PI;
alert(slope1);
alert(slope2);
alert(slope3);
var Angle1 = slope1-slope2;
var Angle2 = slope2-slope3;
alert(180-Angle1);
alert(180-Angle2);

( http://jsfiddle.net/ZUESt/1/を参照)

複数のステップを説明するために、slopeN変数は個々の線分の傾きです。角度 N は、各ジャンクション (ポイント N+1) での回転量です。正の角度は右折、負の角度は左折です。

次に、この角度を 180 から差し引いて、必要な実際の内角を取得できます。

もちろん、このコードは圧縮可能であり、5 行は何が起こっているかを確認するために変数を出力しているだけであることに注意してください。これは概念実証であるため、自分で使用するために最適化することについて心配させてください。

于 2013-08-01T15:24:52.987 に答える
0

境界条件を確認し (ポイントが同一線上にあるかどうか)、適切な計算を適用して角度を見つける必要があります。また、三角形は 180 度を超える (内) 角度を持つことはできません。三角形の角の和は180度です。

于 2013-08-01T14:34:52.623 に答える