Làm thế nào tôi có thể tìm được đường vuông góc với một vectơ 2D?


20

Tôi đang tạo một trò chơi từ trên xuống, nơi người chơi di chuyển về phía trước vị trí của con trỏ chuột. Là một phần của mã chuyển động của người chơi, tôi cần xác định một vectơ vuông góc với vectơ đối diện hiện tại của người chơi (để thực hiện hành vi oanh tạc).

Làm thế nào tôi có thể tính toán vectơ vuông góc của một vectơ 2D đã cho?

Câu trả lời:


41

Để có được vectơ 2D vuông góc với một vectơ 2D khác, chỉ cần hoán đổi các thành phần XYthành phần, phủ định Ythành phần mới . Vì vậy, { x, y }trở thành { y, -x }.


10
Lưu ý rằng có hai khả năng, và khả năng này sẽ giúp bạn có được vectơ vuông góc bên trái. (-y | x) là vectơ bên phải.
TravisG

1
Bạn nên phủ định trục y để có vòng xoay CCW theo quy ước truyền thống.
RandyGaul

@TravisG Tôi nghĩ bạn đã trộn lẫn trái và phải? (-y, x) là vectơ vuông góc bên trái và (y, -x) là RHS từ tính toán của tôi.
PeteUK

12

Tôi luôn quên làm thế nào để làm điều này khi tôi cần vì vậy tôi đã viết một vài phương pháp mở rộng.

    public static Vector2 PerpendicularClockwise(this Vector2 vector2)
    {
        return new Vector2(vector2.Y, -vector2.X);
    }

    public static Vector2 PerpendicularCounterClockwise(this Vector2 vector2)
    {
        return new Vector2(-vector2.Y, vector2.X);
    }

Và một bài kiểm tra đơn vị

    [Test]
    public void Vector2_Perpendicular_Test()
    {
        var a = new Vector2(5, -10);
        var b = a.PerpendicularClockwise();
        var c = a.PerpendicularCounterClockwise();

        Assert.AreEqual(new Vector2(-10, -5), b);
        Assert.AreEqual(new Vector2(10, 5), c);
    }

đường thẳng vuông góc


Nếu bạn có một vectơ (5, -10) thì nó sẽ ở góc phần tư 4, phải không? Nếu sau đó bạn xoay nó theo chiều kim đồng hồ, nó sẽ không nằm trong góc phần tư 3 tức là cả hai thành phần âm? Bạn đã có chức năng của bạn trộn lẫn?
PeteUK

Họ là cách khác xung quanh. PerpendicularCorerClockwise sẽ trả về (10,5) và PerpendicularClockwise sẽ trả về (-10, -5).
opetroch

2
Ôi trời .. chuyện này đã sai 3 năm rồi. Tôi xin lỗi bất cứ ai sử dụng nó. Bây giờ tôi đã sửa câu trả lời và vẽ sơ đồ để chứng minh rằng lần này nó có ý nghĩa. Cảm ơn @opetroch và PeteUK đã chỉ ra điều này. Xin lỗi nó mất quá nhiều thời gian để sửa nó.
craftworkgames

4

Nếu (rìu, ay), thì a-perp thu được bằng cách quay ngược chiều kim đồng hồ 90 độ, nghĩa là,(-ay, rìu)

Xem liên kết này :)

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.