2010-02-19 114 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