如何绘制直线和曲面运动指定的路径

时间:2010-02-19 16:12:36

标签: language-agnostic math graphics drawing

我有关于我想绘制的路径的信息。信息由一系列直线部分和曲线组成。对于直段,我只有长度。对于曲线,我有半径,方向和角度。基本上,我有一只乌龟可以直接移动或从当前位置以圆弧移动(此后直线移动将朝不同的方向移动)。

我想用某种方法在以下条件下绘制这些路径:

  1. 最小(最好不是)三角法。
  2. 能够以画布为中心并缩放以适合任意大小。
  3. 据我所知,GDI +给了我2号,Cairo给了我1号,但是没有人能让两者变得特别容易。我愿意接受如何使GDI +或Cairo(最好是pycairo)工作的建议,并且我也对任何其他库(最好是C#或Python)开放。

    我甚至愿意抽象地解释如何将其转化为代码。

1 个答案:

答案 0 :(得分: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;
}