Расчет координат на экране - PullRequest
1 голос
/ 10 ноября 2011

Я знаю, что есть множество других вопросов по этой теме, я думаю, что я прочитал большинство из них, наряду с Википедией и кучей других статей, но мне не хватает (я думаю) некоторой простой арифметики, чтобы завершить мои координаты расчеты.

У меня есть этот код: 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.

Может ли кто-нибудь указать на очевидную вещь, которую я пропустил, чтобы углы были правильными относительно последней строки, пожалуйста?

1 Ответ

1 голос
/ 10 ноября 2011

Если взять угол, под которым нарисована первая линия, как тета:

тета + 180 градусов ИЛИ тета - 180 градусов повернет вас назад по линии, которую вы только что нарисовали.

Тогда тета + 180 градусов + 60 ИЛИ тета - 180 градусов + 60 встретит вас под углом 60 градусов к первой линии.

Вам нужно выбрать + или - 180 в зависимости от диапазона градусов, который использует SVG (от -180 до 180 или от 0 до 360) и насколько велика ваша начальная тета. Также вам нужно выбрать + или - 60 градусов в зависимости от стороны первой линии, на которой вы хотите нарисовать вторую линию.

После того, как вы вычислили угол, на котором рисуете вторую линию (например, тэта + 180 + 60), вам нужно принять его в качестве следующей тэты, чтобы вычислить угол для третьей линии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...