2010-03-28 44 views
6

Tôi có mảnh sau pseudo-C/Java/C# mã:Làm thế nào để tính toán sản phẩm chéo?

int a[]= { 30, 20 }; 
int b[] = { 40, 50 }; 
int c[] = {12, 12}; 

Làm thế nào để tính toán chéo sản phẩm ABxAC?

+1

Từ câu hỏi trước của bạn - "Làm cách nào để tính toán sản phẩm chấm/sản phẩm chéo theo chương trình?" Có lẽ dấu hiệu là dấu hiệu của bất kỳ kết quả của tính toán đó, vì vậy tôi sẽ nói điều này là adupe. –

+0

Tại sao tiêu đề là dot-product nhưng thẻ là sản phẩm chéo? – kennytm

+0

@KennyTM: Đã sửa lỗi. Đó là bởi vì anh ấy nghĩ rằng sản phẩm chéo và chấm đầu tiên giống nhau. –

Trả lời

6

Giải pháp được đưa ra cho bạn trong câu hỏi cuối cùng về cơ bản sẽ thêm Z = 0 cho tất cả các điểm của bạn. Trong các vectơ mở rộng như vậy, bạn tính sản phẩm chéo của mình. Hình học sản phẩm chéo tạo ra một vector trực giao với hai vec-tơ được sử dụng để tính toán, vì cả hai vectơ của bạn nằm trong mặt phẳng XY kết quả sẽ chỉ có một thành phần Z. Dấu hiệu của thành phần z đó biểu thị rằng véc tơ đang nhìn lên hoặc xuống trên mặt phẳng XY. Dấu hiệu đó phụ thuộc vào AB theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ từ nhau. Điều đó có nghĩa là dấu hiệu của thành phần z hiển thị cho bạn nếu điểm bạn đang nhìn nằm ở bên trái hoặc bên phải của dòng nằm trên AB.

Vì vậy, với sự tích vectơ của hai vectơ A và B là vector

AxB = (AyBz − AzBy, AzBx − AxBz, AxBy − AyBx) 

với Az và BZ là zero bạn là trái với các thành phần thứ ba của vector

AxBy - AyBx 

rằng Với Là vector từ điểm a đến b và B là vectơ từ điểm a đến c nghĩa là

Ax = (b[x]-a[x]) 
Ay = (b[y]-a[y]) 
Bx = (c[x]-a[x]) 
By = (c[y]-a[y]) 

cho

AxBy - AyBx = (b[x]-a[x])*(c[y]-a[y])-(b[y]-a[y])*(c[x]-a[x]) 

mà là một đại lượng vô hướng, dấu hiệu của vô hướng sẽ cho bạn biết thời tiết điểm c nằm bên trái hoặc bên phải của vector ab

Aternatively bạn có thể nhìn vào stack overflow hoặc gamedev

+0

@Harald Scheirich: cảm ơn lời giải thích chi tiết và liên kết tuyệt vời. Bạn có nghĩa là * "với Az và Bz là số không ..." *? (Tôi không dám chỉnh sửa câu trả lời của bạn) – SyntaxT3rr0r

+0

@ Harald Scheirich: không phải chính xác mã này giống như mã tzaman đã đưa ra? (Tôi không biết ai đã bỏ phiếu cho anh ta) – SyntaxT3rr0r

+0

@Wizard Vâng, đó là tính toán tương tự, việc bỏ phiếu có thể đã bắt đầu với tiêu đề và chủ đề của câu hỏi này đang được thay đổi (dunoo đã làm điều đó) –

2

cross product là một vectơ, nó không có "dấu".

Bạn có ý là scalar (dot) product không? Nếu bạn làm như vậy, sau đó được tính như một cặp vectơ [a, b, c] • [d, e, f] dưới dạng quảng cáo + là + cf, do đó, dấu hiệu của biểu thức đó là dấu hiệu của sản phẩm chấm.

Tìm ra dấu hiệu mà không thực hiện phép nhân và bổ sung có thể không nhanh hơn chỉ thực hiện chúng.

+0

@unwind: xấu của tôi, tôi nghĩ rằng "sản phẩm" và sản phẩm chéo giống nhau nhưng, vâng, thực sự tôi là sau "sản phẩm chấm", cũng là "vô hướng" sản phẩm ": http://en.wikipedia.org/wiki/Dot_product – SyntaxT3rr0r

+0

Không bạn đã ở ngay nơi đầu tiên, bạn không tìm kiếm sản phẩm chấm, nó sẽ không cung cấp cho bạn cho dù điểm của bạn là bên trái hay bên phải của dòng của bạn. –

2

Vì cả ba điểm đều chỉ có hai thành phần, tôi giả định rằng thành phần z cho cả ba là bằng không. Điều đó có nghĩa rằng các vectơ AB và BC nằm trong mặt phẳng xy, vì vậy sản phẩm chéo là một vectơ trỏ theo hướng z, với các thành phần x và y bằng 0.

Nếu bằng "ký hiệu", bạn có nghĩa là liệu nó trỏ theo hướng z dương hay âm, thì tính toán sẽ cho bạn biết điều đó.

Trong trường hợp của bạn, hai vectơ là AB = (10, 30, 0) và AC = (-18, -8, 0). Nếu tôi lấy sản phẩm chéo của hai loại đó, tôi nhận được vector AB X AC = (0, 0, 460). Bạn có nghĩa là để nói rằng điều này có một dấu hiệu tích cực vì thành phần z là tích cực? Nếu có, đó là câu trả lời của bạn.

UPDATE: Nếu đó là sản phẩm vô hướng bạn muốn, đó là tiêu cực trong trường hợp này:

AB dot AC = -180 -240 + 0 = -420.

+0

Câu trả lời đúng .. Đáng tiếc là anh ấy đã thay đổi câu hỏi :). – svens

+0

Đó là nội dung cập nhật của tôi. Tôi có cả hai bảo hiểm. – duffymo

1

Từ đọc câu hỏi bạn đã liên kết, có vẻ như bạn muốn có dấu hiệu của thành phần z của sản phẩm chéo (giả sử 0 giá trị z cho AB và AC); để chỉ ra cạnh của đường AB điểm C.
Giả sử đó là trường hợp, tất cả những gì bạn cần là dấu hiệu của yếu tố quyết định của ma trận với AB và AC là các hàng của nó.

xAB = b[0] - a[0] 
yAB = b[1] - a[1] 
xAC = c[0] - a[0] 
yAC = c[1] - a[1] 
detABxAC = (xAB * yAC) - (yAB * xAC) 
if (detABxAC < 0) 
    // sign is negative 
elif (detABxAC > 0) 
    // sign is positive 
else 
    // sign is 0, i.e. C is collinear with A, B 
+0

@tzaman: +1 cho tất cả, cảm ơn – SyntaxT3rr0r

+0

@Donal: không, đó là trường hợp cho một sản phẩm chấm (mà điều này không phải là). @WizardOfOdds: Bạn được chào đón. Lưu ý rằng nếu đây là những gì bạn muốn, nó không thực sự là sản phẩm chấm bạn đang theo dõi, mà là dấu hiệu của một thành phần của sản phẩm chéo. – tzaman

+0

Tôi hiểu sai những gì bạn đã viết và giả định rằng đó là câu trả lời cho câu hỏi. Hóa ra người hỏi ban đầu không biết sự khác biệt giữa dấu chấm và các sản phẩm chéo, điều đó có phần quan trọng, nhưng vào thời điểm tôi đọc câu hỏi nó đã được sửa chữa/làm rõ. Đó là tất cả chỉ là một hỗn hợp. –

4

Giả sử bạn đang hỏi liệu góc giữa ABAC là cấp tính hoặc gây hiểu lầm, bạn muốn điều này:

int a[]= { 30, 20 }; 
int b[] = { 40, 50 }; 
int c[] = {12, 12}; 

int ab_x = b[0] - a[0]; 
int ab_y = b[1] - a[1]; 
int ac_x = c[0] - a[0]; 
int ac_x = c[1] - a[1]; 

int dot = ab_x*ac_x + ab_y*ac_y; 
boolean signABxAC = dot > 0; // pick your preferred comparison here 
Các vấn đề liên quan