2010-02-19 113 views
1

我有關於我想繪製的路徑的信息。信息由一系列直線部分和曲線組成。對於直線部分,我只有長度。對於曲線,我有半徑,方向和角度。基本上,我有一隻可以直線移動或從當前位置以圓弧移動的烏龜(在此之後移動直線會朝不同的方向移動)。如何繪製直線和曲線運動指定的路徑

我想一些方法來繪製在以下條件下這些路徑:

  1. 最小(優選無)三角。
  2. 能夠以畫布爲中心並以任意大小縮放。

從我所知道的情況來看,GDI +給了我2號碼,開羅給了我1號碼,但都沒有讓它們變得特別容易。我願意提供如何使GDI +或開羅(最好是pycairo)工作的建議,並且我也向任何其他庫(最好是C#或Python)開放。

我甚至可以抽象的數學解釋如何做到這一點,我可以轉換成代碼。

回答

2

對於2D運動,狀態爲[x, y, a]。其中角度a相對於正x軸。假設初始狀態爲[0, 0, 0]。需要2個例程來根據每種類型的運動更新狀態。每個路徑產生一個新的狀態,所以座標可以用來相應地配置畫布。例程應該是這樣的:

//by the definition of the state 
State followLine(State s, double d) { 
    State s = new State(); 
    s.x = s0.x + d * cos(s0.a); 
    s.y = s0.y + d * sin(s0.a); 
    s.a = s0.a; 
    return s; 
} 

State followCircle(State s0, double radius, double arcAngle, boolean clockwise) { 
    State s1 = new State(s0); 
    //look at the end point on the arc 
    if(clockwise) { 
     s1.a = s0.a - arcAngle/2; 
    } else { 
     s1.a = s0.a + arcAngle/2; 
    } 
    //move to the end point of the arc 
    State s = followLine(s1, 2 * radius * sin(arcAngle/ 2)); 
    //fix new angle 
    if(clockwise) { 
     s.a = s0.a - arcAngle; 
    } else { 
     s.a = s0.a + arcAngle; 
    } 
    return s; 
} 
+0

這絕對有幫助。我只需要弄清楚如何在一個圓圈之前和之後採取狀態並將其轉換爲某些圖形庫的參數。 – 2010-02-22 14:27:25