Tôi có cần một điểm và một đối tượng Vector không? Hoặc chỉ cần sử dụng một đối tượng Vector để thể hiện một Điểm là ok?


18

Cấu trúc các thành phần của một công cụ mà tôi đang phát triển cùng với một người bạn (mục đích học tập), tôi đã nghi ngờ điều này.

Ban đầu chúng tôi có một hàm tạo điểm, như sau:

var Point = function( x, y ) {
    this.x = x;
    this.y = y;
};

Nhưng họ đã bắt đầu thêm một số phép toán Vector vào nó và họ quyết định đổi tên nó thành Vector2d.

Nhưng bây giờ, một số phương pháp hơi khó hiểu (ít nhất là theo ý kiến ​​của tôi), chẳng hạn như sau, được sử dụng để tạo một dòng:

//before the renaming of Point to Vector2, the parameters were startingPoint and endingPoint
Geometry.Line = function( startingVector, endingVector ) {
    //...
};

Tôi nên tạo một hàm tạo cụ thể cho đối tượng Point, hoặc không có vấn đề gì trong việc xác định một điểm là một vectơ?

Tôi biết một vectơ có độ lớn và hướng, nhưng tôi thấy rất nhiều người sử dụng một vectơ để chỉ đại diện cho vị trí của một vật thể.


1
Vì vị trí chỉ là một vectơ từ (0,0 {, 0}), nên sử dụng một vectơ là tốt.

Câu trả lời:


8

Sẽ không có bất kỳ vấn đề nào khi kết hợp các định nghĩa và xử lý các điểm dưới dạng vectơ - nhưng hãy cẩn thận một chút, vì một số API có lớp 'Điểm' mà bạn có thể cần sử dụng (ví dụ: đại diện cho các đa giác) và nếu bạn xác định lớp của riêng bạn, bạn sẽ muốn có thể chuyển chúng qua lại.

Mặc dù vậy, những gì tôi sẽ làm là đối xử với chúng tương đương trong mã của bạn; nếu bạn sử dụng vectơ và điểm có thể hoán đổi cho nhau, thì không có lý do gì mà việc khai báo của bạn cho hàm Line () nên nói về 'startVector' và 'endVector'. Tôi rất khuyến khích quay trở lại

Geometry.Line = function( Vector startingPoint, Vector endingPoint ) {
    //...
};

Điểm là những gì các tham số đó thể hiện, ngay cả khi chúng đang sử dụng lớp Vector để làm như vậy.


Tôi sẽ tiến thêm một bước và có một typedef Vector Pointnơi nào đó trong tiêu đề xác định điểm. Theo cách đó, nó trông giống như một Point, không ai được gãi đầu khi sử dụng nó tại sao nó được gọi Vectornhưng về phía bên trong, nó chỉ là một cơ sở mã.
tpg2114

4

Chỉ cần sử dụng đối tượng Vector. Ngay cả khi bạn cảm thấy điều này đã / được sử dụng không chính xác trong quá khứ, đó là những gì mọi người mong đợi. Thêm vào đó, không nhất thiết không đúng khi sử dụng vectơ làm điểm. Và sẽ khó thực hiện ngoài cuộc thảo luận vì cả hai cấu trúc dữ liệu đều yêu cầu các kiểu nguyên thủy giống nhau. Sự khác biệt duy nhất sẽ là các hàm thành viên, và thật dễ dàng để đặt chúng vào cùng một lớp, vì không có nhiều cách thức xung đột giữa hai phương thức.

Vì bạn đang học, thật tốt khi biết rằng làm những gì mọi người mong đợi thường là cách tốt nhất để làm mọi việc (đối với những lựa chọn tầm thường như cách trình bày).


Các hàm thành viên không phải là sự khác biệt duy nhất giữa các điểm và vectơ; như vậy là wthành phần, đó là rất quan trọng.
kevintodisco

3

Điểm là vị trí trong không gian. Khi bạn có một hệ tọa độ, bạn có thể mô tả các điểm đó như một khoảng cách và hướng từ gốc (một vectơ). Vì vậy, hoàn toàn hợp lý khi sử dụng vectơ để mô tả điểm bắt đầu và điểm kết thúc của một dòng.

Chỉ cần lưu ý rằng tất cả các điểm có thể được biểu diễn dưới dạng vectơ, nhưng vectơ không phải là điểm. Hầu hết các vectơ, ví dụ như vận tốc, bình thường, v.v., không có bất kỳ ý nghĩa nào về vị trí.

Hãy nghĩ về gió, bạn có thể nói về hướng của nó và sức mạnh của nó, nhưng bạn không thể nói về vị trí hoặc vị trí của nó. Đây là cách bạn nên nghĩ về vectơ khi chúng KHÔNG được sử dụng để mô tả các điểm trong không gian.


2

Để xác định một điểm, bạn chỉ cần một vectơ. Để xác định một dòng, bạn cần hai. Thông thường, bạn có hai điểm nằm trên đường thẳng hoặc một vectơ đại diện cho một điểm nằm trên đường thẳng và vectơ khác biểu thị hướng của đường thẳng.

Không có vấn đề xác định một điểm là một vectơ, bởi vì một điểm là một vectơ có hướng bằng tọa độ và độ lớn của nó bằng khoảng cách của nó từ 0,0.

Vì vậy, bạn không cần hai lớp riêng biệt để biểu diễn một Điểm và "Vector2d", mặc dù một Điểm có thể là một lớp con của Vector2d với các hàm thành viên khác nhau liên quan trực tiếp đến bản vẽ hoặc xử lý của bạn, trong khi Vector2d chỉ có thể thực hiện các hàm toán học vectơ nghiêm ngặt như sản phẩm chấm.


2

Có, bạn có thể sử dụng một Vectorlớp duy nhất để xác định cả điểm và vectơ, miễn là bạn đảm bảo rằng wthành phần của vectơ là0 .

Sự khác biệt chính giữa một điểm và một vectơ là một điểm đại diện cho một vị trí vật lý trong không gian, bù lại từ điểm gốc, trong khi một vectơ đại diện cho một hướng . Một điểm có thể được dịch, một vectơ không thể . Thành wphần của lớp 2 hoặc 3 chiều Vectorlà thứ cho phép thành phần dịch của ma trận biến đổi có hiệu lực. Nếu w1, sau đó dịch và xoay sẽ được áp dụng; nếu có 0, thì chỉ xoay được áp dụng.

Không có wthành phần của một bộ vector 0có thể quay lại cắn bạn; nó dẫn đến các lỗi khá khó theo dõi. Để an toàn, bạn có thể tạo ra một Pointlớp kế thừa từ các Vectorlớp và rõ ràng đặt wđể 1, nơi mà các Vectorgiá trị mặc định lớp wđể 0.


2
Nhiều lớp vectơ không sử dụng thành phần w một cách rõ ràng; khá nhiều người coi nó như là một yếu tố tiềm ẩn hoặc có số tiền cho lớp 'ProjectiveVector' thực hiện nó, nhưng rất nhiều mã của một công cụ (về cơ bản là kết xuất) sử dụng vectơ 3 'cổ điển' mang theo thành phần aw là hoàn toàn thừa. Đây là một chi tiết thực hiện, không phải là một phần thiết yếu của vectơ hoặc điểm.
Steven Stadnicki

@StevenStadnicki Điều đó đúng, nhưng để có một lớp đại diện cho cả một điểm và một vectơ, wthành phần phải có mặt, nếu không thì không có cách nào để xác định cách sử dụng đối tượng.
kevintodisco

1
@ktodisco Tôi nghĩ cách để xác định nên sử dụng nó như thế nào, là xem bối cảnh nào nó được sử dụng.
JCM

1
Đã hết thời gian để chỉnh sửa nhận xét :(. Sẽ nói rằng nếu các phần của công cụ sử dụng lớp xác định bối cảnh sẽ sử dụng thì nó sẽ hoạt động.
kevintodisco

2

Điểm và vectơ có thể được coi là cùng một điều. Nếu nó có ý nghĩa với bạn, bạn có thể nghĩ về các vectơ đại diện cho vị trí theo cách này, và sau đó việc sử dụng một Vector2lớp ở mọi nơi mà bạn sẽ sử dụng một Pointlớp là điều hợp lý .

Trong toán học, vectơ đôi khi được sử dụng để thể hiện vị trí. Khi được sử dụng theo nghĩa này, vectơ biểu thị vị trí của một số thực thể so với điểm gốc. Ví dụ: giả sử bạn đang thực hiện sh'mup và bạn muốn theo dõi nơi tàu của người chơi đang ở trong khu vực chơi. Nếu bạn coi góc dưới bên trái của khu vực chơi là (0, 0), thì bạn có thể đại diện cho vị trí của người chơi bằng Vector:

   * Player (3,3)
  /
 /
. (0,0)

Ý nghĩa của vectơ trong trường hợp này là con tàu có 3 đơn vị ở bên phải và 3 đơn vị phía trên điểm xuất phát. (Lưu ý rằng bạn cũng có thể sử dụng một vectơ cho tốc độ của người chơi, trong trường hợp đó, người chơi sẽ di chuyển 3 đơn vị sang phải và 3 đơn vị mỗi giây hoặc khung. Cả hai vị trí và tốc độ sẽ được biểu thị bằng cùng một lớp vectơ, nhưng vectơ của họ được xử lý khác nhau trong kịch bản của người chơi.)

Để sử dụng ví dụ dòng của bạn, vectơ vị trí biểu thị nơi "điểm" bắt đầu và "điểm" kết thúc được đặt tương đối so với điểm gốc. Nếu nguồn gốc của bạn là trung tâm của khu vực chơi, bạn có thể xác định một dòng như thế này:

             * (8, 2)
             |
     . (0,0) |
             |
             * (8, -2)

Vì vậy, một đầu của dòng là 8 đơn vị ở bên phải và 2 đơn vị phía trên trung tâm của sân chơi, và một đơn vị khác là 8 đơn vị bên phải và 2 đơn vị xuống.

Nói rõ hơn, điều này không có nghĩa là bạn phải sử dụng một Vectorlớp thay vì một Pointlớp. Đây chỉ là một cách nghĩ về tình huống này có thể giúp bạn dễ dàng quyết định cách thực hiện những ý tưởng đó.


Vectơ như là một điểm bù cho một điểm khác trong không gian vẫn phải được coi là một điểm trong tọa độ tương đối. Gọi nó là một vectơ là sai, khi có liên quan đến một công cụ trò chơi.
kevintodisco

0

Nó phụ thuộc vào việc thực hiện. Nếu bạn phải có các phương thức trên Vector2d thay vì nguyên mẫu của nó, thì sẽ phải trả giá cho điều đó, với số điểm bạn cần trong một trò chơi, một điểm chính. Đó chỉ là cách JavaScript hoạt động. Trong tình huống đó, tốt hơn là tạo một lớp Point2d không có tất cả các chức năng không cần thiết.


Các phương thức đang được thêm vào nguyên mẫu, vì vậy đây không phải là vấn đề.
JCM
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.