2011-11-10 116 views
1

我知道有關於這個主題的其他問題的負載,我想我已經閱讀了大部分,連同維基百科和一堆其他文章,但我錯過了(我認爲)一些簡單的算術完成我的座標計算。計算座標在屏幕上

我有這樣的代碼:

 
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度的線將僅繪製一條直線,因爲角度相對於起點而不是相對於最後一條線。

以防萬一它是相關的,與SVG水平是零度。因此,從y100開始,長度爲50單位的線,在90度角處的x100將具有y150,x100的結束點。

有人能指出一個明顯的事情,我錯過了,使角度正確的相對最後一行嗎?

回答

1

如果你把它在第一線的繪製爲THETA角度:

THETA + 180度或θ - 180度將面對你背下來剛繪製的線。

然後theta + 180 deg + 60 or theta - 180 deg + 60會在第一行60度時面對你。

您需要根據svg使用的度數範圍(是否爲-180到180或0到360)以及您的起始theta的大小來選擇是加+還是-180。您還需要根據要繪製第二條線的第一條線的一側選擇+或 - 60度。一旦你計算出你正在繪製第二條線的角度(例如theta + 180 + 60),那麼你需要把它作爲你的下一個theta來計算第三條線的角度。

+0

感謝您提供快速準確的答覆。它現在適用於任意角度和其他形狀(或者至少我嘗試過的幾個)。 – blankabout