Я знаю, что есть множество других вопросов по этой теме, я думаю, что я прочитал большинство из них, наряду с Википедией и кучей других статей, но мне не хватает (я думаю) некоторой простой арифметики, чтобы завершить мои координаты расчеты.
У меня есть этот код:
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 горизонталь равна нулю градусов. Таким образом, линия длиной 50 единиц, начинающаяся с y100, x100 под углом 90 градусов, будет иметь конечную точку y150, x100.
Может ли кто-нибудь указать на очевидную вещь, которую я пропустил, чтобы углы были правильными относительно последней строки, пожалуйста?