Это простая задача, связанная с 2D векторами. Синус угла между двумя векторами связан с перекрестным произведением между двумя векторами. И «выше» или «ниже» определяется знаком вектора, который получается перекрестным произведением: если вы пересечете два вектора A и B, и полученный перекрестный продукт будет положительным, то A будет «ниже» B; если оно отрицательное, A «выше» B. Подробнее см. Mathworld .
Вот как я могу написать код на Java:
package cruft;
import java.text.DecimalFormat;
import java.text.NumberFormat;
/**
* VectorUtils
* User: Michael
* Date: Apr 18, 2010
* Time: 4:12:45 PM
*/
public class VectorUtils
{
private static final int DEFAULT_DIMENSIONS = 3;
private static final NumberFormat DEFAULT_FORMAT = new DecimalFormat("0.###");
public static void main(String[] args)
{
double [] a = { 1.0, 0.0, 0.0 };
double [] b = { 0.0, 1.0, 0.0 };
double [] c = VectorUtils.crossProduct(a, b);
System.out.println(VectorUtils.toString(c));
}
public static double [] crossProduct(double [] a, double [] b)
{
assert ((a != null) && (a.length >= DEFAULT_DIMENSIONS ) && (b != null) && (b.length >= DEFAULT_DIMENSIONS));
double [] c = new double[DEFAULT_DIMENSIONS];
c[0] = +a[1]*b[2] - a[2]*b[1];
c[1] = +a[2]*b[0] - a[0]*b[2];
c[2] = +a[0]*b[1] - a[1]*b[0];
return c;
}
public static String toString(double [] a)
{
StringBuilder builder = new StringBuilder(128);
builder.append("{ ");
for (double c : a)
{
builder.append(DEFAULT_FORMAT.format(c)).append(' ');
}
builder.append("}");
return builder.toString();
}
}
Проверьте знак 3-го компонента. Если оно положительное, то A «ниже» B; если оно отрицательное, A «выше» B - до тех пор, пока два вектора находятся в двух квадрантах справа от оси Y. Очевидно, что если они оба находятся в двух квадрантах слева от оси Y, верно обратное.
Вам нужно подумать о своих интуитивных понятиях «выше» и «ниже». Что если A находится в первом квадранте (0 <= & theta; <= 90) и B находится во втором квадранте (90 <= & theta; <= 180)? «Выше» и «ниже» теряют свое значение. </p>
Затем линия вращается от своего
стартовая позиция, и мне нужно
рассчитать угол от его начала
позиция в текущую позицию. Например, если
он вращался по часовой стрелке, это
положительное вращение; если
против часовой стрелки, затем отрицательно. (Или же
наоборот.)
Это именно то, для чего нужен перекрестный продукт. Знак 3-го компонента положителен для против часовой стрелки и отрицателен для по часовой стрелке (если смотреть вниз на плоскость вращения).