Я работаю над алгоритмом, определяющим направление ребра BC относительно ребра AB.Алгоритм определения направления смещений Влево и вправо
Я реализовал определение ArcCos. Это почти работает. Он правильно определяет форвард и правильно определяет, когда нужен поворот. Но неправильно определяет, является ли это правильным или левым поворотом.
private Direction DetermineDirectionOfV2(Vertex v1, Vertex v2, Vertex v3)
{
if (v1 == null || v2 == null || v3 == null)
return Direction.Forward;
double p12 = v1.distance2D(v2);
double p13 = v1.distance2D(v3);
double p23 = v2.distance2D(v3);
double p12S = p12 * p12;
double p13S = p13 * p13;
double p23S = p23 * p23;
double a = p12S + p13S - p23S;
double b = 2 * p12 * p13;
if(b == 0.0)
return Direction.Forward;
double angle = Math.Acos(a/b);
double thresh = 0.1;
if(angle >= -thresh && angle <= thresh)
{
return Direction.Forward;
}
else if (angle > 0 && angle < Math.PI)
{
return Direction.Right;
}
else
{
return Direction.Left;
}
}
Я не уверен, что проблема есть, но я думаю, что это может быть, что это скажет мне угол ABC вместо угла BC относительно AB.
В ситуации с левым поворотом я получаю около 1,1 радиан для угла, который является неправильным. Он должен быть не менее> 3,14 радиан или -1,1 радианов.
Что может быть неправильным?
Эти 3: вершин,
//x,y,z (z is unused)
v1 = new Vertex(0.0f, 0.0f, 0.0f,"");
v2 = new Vertex(0.0f, -10.0f, 0.0f, "");
v3 = new Vertex(5.0f, -10.0f, 0.0f, "");
дают угол 0,46 радиан, когда на самом деле это должно быть 4,71238898 рад, потому что с точки зрения AB, BC образует угол 270 градусов.
Благодаря
Пример
Если есть моменты, которые выглядят следующим образом:
A
B C
Это должно дать 270 градусов или 4.7rad, потому что если мы ходим от А к В, мы превратим слева, чтобы добраться до C.
Я не уверен, как использовать Атана в этом случае, не могли бы вы привести мне пример? – jmasterx
вам нужно использовать atan2, а не atan – Seb
@Seb Я не уверен, какие параметры Y и X будут в этом случае. Это были бы переменные a и b? – jmasterx