Tính toán sản phẩm chéo của vectơ 2D


85

Từ wikipedia:

tích chéo là một phép toán nhị phân trên hai vectơ trong không gian Euclide ba chiều dẫn đến một vectơ khác vuông góc với mặt phẳng chứa hai vectơ đầu vào.

Cho rằng định nghĩa chỉ được xác định theo ba ( hoặc bảy, một và không ) chiều, làm thế nào để tính tích chéo của hai vectơ 2d?

Tôi đã thấy hai cách triển khai. Một trả về một vectơ mới (nhưng chỉ chấp nhận một vectơ duy nhất), cái kia trả về một đại lượng vô hướng (nhưng là phép tính giữa hai vectơ).

Triển khai 1 (trả về một đại lượng vô hướng):

float CrossProduct(const Vector2D & v1, const Vector2D & v2) const
{
    return (v1.X*v2.Y) - (v1.Y*v2.X);
}

Triển khai 2 (trả về một vectơ):

Vector2D CrossProduct(const Vector2D & v) const
{
    return Vector2D(v.Y, -v.X);
}

Tại sao các triển khai khác nhau? Tôi sẽ sử dụng triển khai vô hướng để làm gì? Tôi sẽ sử dụng triển khai vectơ để làm gì?

Lý do tôi hỏi là vì tôi đang tự viết một lớp Vector2D và không biết sử dụng phương thức nào.


10
Thực hiện 2 là sai. Bạn cần hai vectơ để tạo thành một tích chéo.
bobobobo

7
Thực hiện 2 xoay vector cho v bằng -90 độ. Thay thế -90 trong x' = x cos θ - y sin θy' = x sin θ + y cos θ. Một biến thể khác của cách triển khai này sẽ return Vector2D(-v.Y, v.X);là xoay v x +90 độ.
Legends2k

3
@ Legends2k: Cần lưu ý rằng triển khai 2 là một phần mở rộng của việc sử dụng yếu tố quyết định để đánh giá sản phẩm chéo : chỉ cần loại bỏ hàng và cột cuối cùng. Phần mở rộng như vậy luôn có N-1toán hạng cho các thứ Nnguyên.
Tim Čas

4
Thực hiện 1 tính toán độ lớn của Sản phẩm chéo.
Mateen Ulhaq

@MateenUlhaq loại, đó là " cường độ"
Moritz Mahringer

Câu trả lời:


100

Việc triển khai 1 trả về độ lớn của vectơ sẽ là kết quả của tích chéo 3D thông thường của các vectơ đầu vào, nhận các giá trị Z của chúng một cách ngầm định là 0 (tức là coi không gian 2D như một mặt phẳng trong không gian 3D). Tích 3D sẽ vuông góc với mặt phẳng đó và do đó có 0 thành phần X & Y (do đó giá trị vô hướng trả về là giá trị Z của vector tích chéo 3D).

Lưu ý rằng độ lớn của vectơ thu được từ tích 3D cũng bằng diện tích của hình bình hành giữa hai vectơ, điều này mang lại cho Việc thực hiện 1 một mục đích khác. Ngoài ra, khu vực này được ký hiệu và có thể được sử dụng để xác định xem quay từ V1 đến V2 chuyển động theo hướng ngược chiều kim đồng hồ hay chiều kim đồng hồ. Cũng cần lưu ý rằng thực hiện 1 là định thức của ma trận 2x2 được xây dựng từ hai vectơ này.

Thực hiện 2 trả về một vectơ vuông góc với vectơ đầu vào vẫn nằm trong cùng một mặt phẳng 2D. Không phải là một tích chéo theo nghĩa cổ điển mà nhất quán theo nghĩa "cho tôi một vectơ vuông góc".

Lưu ý rằng không gian euclide 3D được đóng theo phép toán tích chéo - nghĩa là tích chéo của hai vectơ 3D trả về một vectơ 3D khác. Cả hai cách triển khai 2D trên đều không phù hợp với điều đó theo cách này hay cách khác.

Hi vọng điêu nay co ich...


6
Trên thực tế, thực hiện 2 là tích chéo của v và vectơ đơn vị hướng lên theo hướng z.
mattiast 28/10/08

@mattiast: Đúng. Đó chính xác là cách hoạt động 2D 'perp' được mô tả trong 3D.
Drew Hall

@mattiast: Việc triển khai 2 có thể được coi là một phần mở rộng của việc sử dụng một yếu tố quyết định để tính tích chéo --- chỉ cần xóa hàng & cột cuối cùng. Cần lưu ý rằng cách triển khai 1 tương đương với:, DotProduct(a, CrossProduct(b))điều này (rất thanh lịch!) Phù hợp với khái niệm "tích điểm vuông góc" (đó là cách triển khai 1 cũng [và có lẽ chính xác hơn] được gọi là!).
Tim Čas

Trong đoạn đầu tiên của bạn, độ lớn là giá trị tuyệt đối của những gì được trả về. Nó không hoàn toàn giống với thành phần Z. Như bạn đã chỉ ra trong đoạn thứ 2, bạn có thể sử dụng dấu thánh giá để đẩy lùi ma cà rồng ... ờ, ý tôi là để phát hiện khi một vectơ đang rời đi so với việc đi vào đường viền của một đa giác chẳng hạn.
Peter Cordes

68

Tóm lại: Đó là một ký hiệu viết tắt cho một vụ hack toán học.

Giải thích dài dòng:

Bạn không thể tạo một sản phẩm chéo với các vectơ trong không gian 2D. Hoạt động không được xác định ở đó.

Tuy nhiên, thường rất thú vị khi đánh giá tích chéo của hai vectơ với giả định rằng các vectơ 2D được mở rộng sang 3D bằng cách đặt tọa độ z của chúng bằng không. Điều này cũng giống như làm việc với vectơ 3D trên mặt phẳng xy.

Nếu bạn mở rộng các vectơ theo cách đó và tính tích chéo của một cặp vectơ mở rộng như vậy, bạn sẽ nhận thấy rằng chỉ thành phần z có giá trị có nghĩa: x và y sẽ luôn bằng 0.

Đó là lý do tại sao thành phần z của kết quả thường được trả về đơn giản là một đại lượng vô hướng. Ví dụ, vô hướng này có thể được sử dụng để tìm sự uốn lượn của ba điểm trong không gian 2D.

Từ quan điểm toán học thuần túy, sản phẩm chéo trong không gian 2D không tồn tại, phiên bản vô hướng là bản hack và sản phẩm chéo 2D trả về vectơ 2D không có ý nghĩa gì cả.


"ví dụ: được sử dụng để tìm sự uốn lượn của ba điểm trong không gian 2D" @Nils Pipenbrinck, bạn có nghĩa là gì khi uốn lượn trong ngữ cảnh này?
Nader Belal

1
@NaderBelal Tôi cho rằng quanh co ở đây có nghĩa là - nếu chúng ta đi từ điểm a đến b đến c, chúng ta sẽ đi theo chiều kim đồng hồ hay ngược chiều kim đồng hồ, xét về góc độ mà chúng ta vừa kéo dài.
Amit Tomar,

12

Một tính chất hữu ích khác của tích chéo là độ lớn của nó liên quan đến sin của góc giữa hai vectơ:

| axb | = | a | . | b | . sin (theta)

hoặc là

sine (theta) = | axb | / (| a |. | b |)

Vì vậy, trong cách thực hiện 1 ở trên, nếu abđược biết trước là vectơ đơn vị thì kết quả của hàm đó chính xác là giá trị sin () đó.


1
... mà cũng gấp đôi diện tích của tam giác giữa vectơ a và vectơ b.
Tim Lovell-Smith

5

Thực hiện 1 là tích perp của hai vectơ. Tài liệu tham khảo tốt nhất mà tôi biết về đồ họa 2D là loạt Graphics Gems tuyệt vời . Nếu bạn đang làm công việc 2D đầu tiên, điều thực sự quan trọng là phải có những cuốn sách này. Tập IV có một bài báo tên là "Niềm vui của các sản phẩm Perp Dot" đề cập đến rất nhiều công dụng của nó.

Một công dụng chính của sản phẩm perp dot là lấy tỷ lệ sincủa góc giữa hai vectơ, giống như sản phẩm dot trả về tỷ lệ coscủa góc. Tất nhiên, bạn có thể sử dụng sản phẩm dotperp dot cùng nhau để xác định góc giữa hai vectơ.

Đây là một bài về nó và đây là bài báo về Thế giới Toán học Wolfram.


3

Tôi đang sử dụng tích chéo 2d trong tính toán của mình để tìm chuyển động quay chính xác mới cho một vật thể đang được tác động bởi vectơ lực tại một điểm tùy ý so với khối tâm của nó. (Z một trong vô hướng.)


3

Một phép toán vectơ 2D hữu ích là một tích chéo trả về một đại lượng vô hướng. Tôi sử dụng nó để xem liệu hai cạnh liên tiếp trong một đa giác uốn cong sang trái hay phải.

Từ nguồn Chipmunk2D :

/// 2D vector cross product analog.
/// The cross product of 2D vectors results in a 3D vector with only a z component.
/// This function returns the magnitude of the z value.
static inline cpFloat cpvcross(const cpVect v1, const cpVect v2)
{
        return v1.x*v2.y - v1.y*v2.x;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.