2011-11-10 7 views
1

このトピックに関する他の質問がたくさんあることは知っていますが、私はWikipediaや他の記事と共に大部分を読んだと思いますが、私の座標計算を完了します。画面上の座標を計算する

私はこのコードを持っています:

 
typedef struct { 
    double startX; 
    double startY; 
    double x2; 
    double y2; 
    double length; 
    double angle; 
    double lastAngle; 
} LINE; 
void lineCalc(LINE *lp) { 
    double radians = lp->angle * 3.141592653589793/180.0; 
    lp->x2 = lp->startX + (lp->length * cos(radians)); 
    lp->y2 = lp->startY + (lp->length * sin(radians)); 
    fprintf (stderr, "lineCalc:startX:%2.3f, startY:%2.3f, length:%2.3g, angle:%2.3f, cos(%2.3f):%2.3f, x2:%2.3f, y2:%2.3f\n", lp->startX, lp->startY, lp->length, lp->angle, lp->angle, cos(radians), lp->x2, lp->y2); 
} 
int main() { 
    // Initialise to origin of 250, 250. 0, 0 for initial end point. Length 150, first angle 60 (degrees), l.lastAngle currently not used 
    LINE l = {250, 250, 0, 0, 150, 60, 0}; 
    lineCalc(&l); 
    //drawLine(&l); 
    l.startX = x2; l.startY = y2; // make last end point, new start point. Angle stays at 60 degrees 
    lineCalc(&l); 
    //drawLine(&l); 
    l.startX = x2; l.startY = y2; 
    lineCalc(&l); 
    //drawLine(&l); 
} 
これは、開始点、長さおよび角度が与えられた行の終点を計算します。すべての罰金と良い、しかし私ができるようにしたいのは、形を描くことです、三角形はスタートになるでしょう。コードは、計算を行う(現実には、SVGを生成している)線を引く、最後のエンドポイントに、次の原点を行い、再計算し、次の行などを描きます瞬間

...

私が欠けている重要なビットは、描画された最後の線に対して相対的な角度を得る方法です。現時点では、原点の動きはうまくいきますが、角度は同じであるため、角度が60度の3本の線は、最後の線に対して相対的な角度ではなく、直線を描きます。

SVGを水平にした場合の関連性はゼロ度です。したがって、y100から始まる50単位の長さの線、90度の角度のx100は、y150、x100の終点を有する。

誰かが最後の行に相対的な角度を正確にするために私が紛失しているという明白なことを指摘できますか?

答えて

1

あなたが最初の行がシータように描画される角度取る場合:

シータ+ 180度ORシータを - 180度バックあなただけ描いたラインの下のあなたに直面するだろう。

次に、シータ+ 180度+60度またはシータ - 180度+60度は、最初の行まで60度で向きます。

svgが使用する度合いの範囲(-180〜180または0〜360になります)と開始時のシータの大きさに基づいて、180を+または - にするかどうかを選択する必要があります。また、2行目を描画する最初の行の側に基づいて、+または - 60度を選択する必要があります。

2番目の線を(theta + 180 + 60)に描画する角度を計算したら、次のthetaとして3番目の線の角度を計算する必要があります。

+0

迅速で正確な対応をありがとう。これは現在、任意の角度や他の形(または私が試した数少ないもの)で動作します。 – blankabout

関連する問題