Tôi xin lỗi nếu tôi hiểu nhầm thuật ngữ 'vectơ đơn vị' hoặc áp dụng sai nó trong khái niệm, nhưng tôi nghĩ đó là thuật ngữ cho tiêu đề của một đối tượng khi được biểu thị là [x, y]
khi x
và y
là một giá trị giữa -1 và 1; vì vậy nếu một vật thể di chuyển 'nam' trên màn hình máy tính, nó sẽ có một vectơ đơn vị là
[0, 1]
...đúng?
Dù sao, tôi đã sử dụng khái niệm này để di chuyển các đối tượng của mình và xoay hình ảnh của chúng (khi cần), nhưng tôi nghĩ toán học mà tôi đang sử dụng để xác định vectơ đơn vị là ... tối ưu.
def set_heading(self, goal):
"""Uses a 'goal' (x, y) to set the object's heading.
Returns list of 0s and 1s for 'straight' headings.
Diagonal headings are + and/or - math.sqrt(2)/2.
"""
vals = [a - b for a, b in zip(goal, self.pos)]
self.heading = [i / abs(i) if i != 0 else 0 for i in vals]
if 0 not in self.heading:
self.heading = [i * (sqrt(2)/2) for i in self.heading]
(Nếu bạn không quen với cú pháp tạm thời của Python, dòng thứ hai chứa i / abs(i) if i != 0 else 0
cách nói của Python x if Condition else y
trái ngược với Condition? x : else y
cú pháp thông thường trong các ngôn ngữ khác. Về cơ bản, tôi chỉ đang cố gắng tránh chia cho số 0!)
Vì vậy, như bạn có thể thấy, phương pháp thực hiện loại 'khóa' đối tượng này thành tám hướng; nếu 0 không có trong tiêu đề, phương thức giả định rằng chúng ta đang di chuyển theo đường chéo và nhân các giá trị đó sqrt(2) / 2
để đảm bảo rằng đối tượng không di chuyển nhanh hơn so với khi di chuyển theo đường chéo. Theo cách này, tôi có thể di chuyển đối tượng bằng cách thêm kết quả của vectơ đơn vị nhân với tốc độ của nó vào tọa độ x và y hiện tại của nó.
def move(self):
"""Moves the object by changing self.pos."""
self.pos = [a + (b * self.speed) for a, b in zip(self.pos, self.heading)]
Tôi không thể không cảm thấy như phương pháp để lấy vectơ đơn vị (nếu đó là cách gọi chính xác) là ngụy biện. Đặc biệt là vì nó bị khóa thành tám hướng - hiện tại nó rất tốt cho dự án nhỏ mà tôi đang làm việc, nhưng tôi không chắc phương pháp phù hợp để có được một vectơ đơn vị chính xác hơn. Phương pháp chính xác để làm như vậy là gì - và nó có hiệu quả hơn hay ít hơn so với sự kỳ lạ mà tôi đã đưa ra một cách độc lập?