Как нарисовать траектории, заданные в терминах прямого и изогнутого движения - PullRequest
1 голос
/ 19 февраля 2010

У меня есть информация о путях, которые я хотел бы нарисовать. Информация состоит из последовательности прямых участков и кривых. Для прямых участков у меня есть только длина. Для кривых у меня есть радиус, направление и угол. По сути, у меня есть черепаха, которая может двигаться прямо или двигаться по дуге окружности из текущей позиции (после чего движение по прямой будет в другом направлении).

Я бы хотел как-то нарисовать эти пути при следующих условиях:

  1. Минимальная (предпочтительно нет) тригонометрия.
  2. Возможность центрирования на холсте и масштабирования до любого произвольного размера.

Из того, что я могу сказать, GDI + дает мне номер 2, Каир дает мне номер 1, но ни один из них не облегчает получение обоих. Я открыт для предложений о том, как заставить работать GDI + или Cairo (предпочтительно pycairo), и я также открыт для любой другой библиотеки (предпочтительно C # или Python).

Я даже открыт для абстрактных математических объяснений того, как это можно сделать, чтобы я мог преобразовать их в код.

1 Ответ

2 голосов
/ 20 февраля 2010

Для 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;
}
...