Неправильный угол, неправильная сторона рассчитана

Мне нужно рассчитать угол между 3 точками. Для этого я делаю следующее:

  1. Захватите 3 точки (предыдущий, текущий и следующий, это в цикле)
  2. Рассчитайте расстояние между точками с помощью Пифагора
  3. Рассчитайте угол, используя Math.acos

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

Отрывок, иллюстрирующий ошибки в вычислениях

Это код, который выполняет вычисления:

// Pythagoras for calculating distance between two points (2D)
pointDistance = function (p1x, p1y, p2x, p2y) {
    return Math.sqrt((p1x - p2x)*(p1x - p2x) + (p1y - p2y)*(p1y - p2y));
};

// Get the distance between the previous, current and next points
// vprev, vcur and vnext are objects that look like this:
//     { x:float, y:float, z:float }
lcn = pointDistance(vcur.x, vcur.z, vnext.x, vnext.z);
lnp = pointDistance(vnext.x, vnext.z, vprev.x, vprev.z);
lpc = pointDistance(vprev.x, vprev.z, vcur.x, vcur.z);

// Calculate and print the angle
Math.acos((lcn*lcn + lpc*lpc - lnp*lnp)/(2*lcn*lpc))*180/Math.PI

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

7 голосов | спросил Broxzier 1 PM00000060000003431 2013, 18:32:34

3 ответа


0

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

Определить, с какой стороны линии лежит точка

isLeft = function(ax,ay,bx,by,cx,cy){
 return ((bx - ax)*(cy - ay) - (by - ay)*(cx - ax)) > 0;
}

Где топор и ay составляют вашу первую точку bx вашей второй и cx cy вашей третьей.

если это слева, просто добавьте 180 к вашему углу

ответил ZJS 1 PM00000070000005631 2013, 19:55:56
0

У меня есть рабочий, но не обязательно краткий пример того, как это может работать:

var point1x = 0, point1y = 0,
    point2x = 10, point2y = 10,
    point3x = 20, point3y = 10,
    point4x = 10, point4y = 20;

var slope1 = Math.atan2(point2y-point1y,point2x-point1x)*180/Math.PI;
var slope2 = Math.atan2(point3y-point2y,point3x-point2x)*180/Math.PI;
var slope3 = Math.atan2(point4y-point3y,point4x-point3x)*180/Math.PI;
alert(slope1);
alert(slope2);
alert(slope3);
var Angle1 = slope1-slope2;
var Angle2 = slope2-slope3;
alert(180-Angle1);
alert(180-Angle2);

(смотрите http://jsfiddle.net/ZUESt/1/)

Чтобы объяснить несколько шагов, переменные slopeN - это наклоны отдельных отрезков. AngleN - это величина, повернутая на каждом перекрестке (т. Е. Точка N + 1). Положительный угол - это поворот направо, а отрицательный - поворот налево.

Затем вы можете вычесть этот угол из 180, чтобы получить фактический внутренний угол, который вы хотите.

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

ответил Chris 1 PM00000070000005231 2013, 19:24:52
0

Вам нужно проверить граничные условия (очевидно, если точки коллинеарны) и применить правильный расчет, чтобы найти угол. Кроме того, треугольник не может иметь (внутренний) угол больше 180 градусов. Сумма угла треугольника составляет 180 градусов.

ответил Jiminion 1 PM00000060000005231 2013, 18:34:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132