Đây là một vấn đề dễ dàng liên quan đến vectơ 2D. Sin của góc giữa hai vectơ liên quan đến sản phẩm chéo giữa hai vectơ. Và "ở trên" hoặc "bên dưới" được xác định bằng dấu hiệu của vectơ do sản phẩm chéo tạo ra: nếu bạn vượt qua hai vectơ A và B, và sản phẩm chéo được tạo là dương, thì A là "dưới" B; nếu nó âm, A là "ở trên" B. Xem Mathworld để biết chi tiết.
Đây là cách tôi có thể mã nó trong 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();
}
}
Kiểm tra dấu hiệu của thành phần thứ 3. Nếu nó dương, A là "dưới" B; nếu nó âm, A là "trên" B - miễn là hai vectơ nằm trong hai góc phần tư ở bên phải của trục y. Rõ ràng, nếu chúng ở cả hai góc phần tư bên trái trục y thì ngược lại là đúng.
Bạn cần suy nghĩ về khái niệm trực quan của mình về "ở trên" và "bên dưới". Điều gì sẽ xảy ra nếu A ở góc phần tư đầu tiên (0 < = θ < = 90) và B ở góc phần tư thứ hai (90 < = θ < = 180)? "Trên" và "bên dưới" mất ý nghĩa của chúng.
Dòng sau đó xoay từ vị trí bắt đầu của nó, và tôi cần phải tính toán góc từ khi bắt đầu của nó vị trí đến vị trí hiện tại. Ví dụ: nếu nó đã xoay theo chiều kim đồng hồ, nó là vòng quay dương; nếu ngược chiều kim đồng hồ, sau đó âm. (Hoặc ngược lại.)
Đây chính xác là sản phẩm chéo. Dấu hiệu của thành phần thứ 3 là dương cho ngược chiều kim đồng hồ và âm cho chiều kim đồng hồ (khi bạn nhìn xuống mặt phẳng quay).
Cho hai đoạn đường giao nhau tùy ý, thật khó để xác định đoạn nào là 'trên' đoạn kia và thậm chí là góc nào để đo, vì chúng thường tạo thành hình dạng 'X'. Bạn có lẽ luôn luôn sử dụng hai dòng với một điểm khởi đầu chung? Điều đó làm cho nó thẳng tiến hơn rất nhiều. – swestrup
Xin lỗi, tôi đã làm rõ. Tôi đang thực sự nói về một dòng duy nhất và vòng quay của nó liên quan đến vị trí bắt đầu của nó. – Jaanus
Bạn muốn phạm vi nào? Bạn có muốn toàn bộ -pi thành pi hoặc bạn có hài lòng với chỉ -pi/2 đến pi/2 tức là bạn có quan tâm đến hướng của đường thẳng hay không? – Troubadour