ฉันต้องการวัตถุจุดและเวกเตอร์หรือไม่ หรือเพียงแค่ใช้วัตถุ Vector เพื่อแสดงว่าเป็นจุดหรือไม่


18

การสร้างส่วนประกอบของเครื่องยนต์ที่ฉันกำลังพัฒนาพร้อมกับเพื่อน (จุดประสงค์การเรียนรู้) ฉันมาถึงข้อสงสัยนี้

ตอนแรกเรามีตัวสร้าง Point ดังต่อไปนี้:

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

แต่พวกเขาเราเริ่มเพิ่มคณิตศาสตร์เวกเตอร์ลงไปและพวกเขาตัดสินใจเปลี่ยนชื่อเป็น Vector2d

แต่ตอนนี้วิธีการบางอย่างค่อนข้างสับสน (อย่างน้อยในความคิดของฉัน) เช่นต่อไปนี้ซึ่งใช้ในการสร้างบรรทัด:

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

ฉันควรสร้างนวกรรมิกเฉพาะสำหรับวัตถุ Point หรือไม่มีปัญหาในการกำหนดจุดเป็นเวกเตอร์หรือไม่?

ฉันรู้ว่าเวกเตอร์มีขนาดและทิศทาง แต่ฉันเห็นผู้คนมากมายที่ใช้เวกเตอร์เพื่อแสดงตำแหน่งของวัตถุ


1
เนื่องจาก position เป็นเพียงเวกเตอร์จาก (0,0 {, 0}) เวกเตอร์จึงใช้ได้ดี

คำตอบ:


8

ไม่น่าเป็นไปได้ที่จะมีปัญหาใด ๆ กับการทำให้คำจำกัดความและการรักษาจุดเป็นเวกเตอร์ - แต่ควรระวังเล็กน้อยเนื่องจาก API บางตัวมีคลาส 'จุด' ที่คุณอาจต้องใช้ (สำหรับการแทนเช่นจุดยอดของรูปหลายเหลี่ยม) และถ้า คุณกำหนดชั้นเรียนของคุณเองคุณจะต้องสามารถย้ายพวกเขาไปมา

อย่างไรก็ตามสิ่งที่ฉันจะทำคือปฏิบัติต่อพวกเขาอย่างเท่าเทียมกันในรหัสของคุณ หากคุณใช้เวกเตอร์และจุดแทนกันแล้วก็ไม่มีเหตุผลที่การประกาศของคุณสำหรับฟังก์ชั่น Line () ควรจะพูดถึง 'StartingVector' และ 'endingVector' ฉันขอแนะนำให้กลับไปที่

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

คะแนนเป็นสิ่งที่พารามิเตอร์เหล่านั้นเป็นตัวแทนถึงแม้ว่าพวกเขากำลังใช้ Vector Vector ในการทำเช่นนั้น


ฉันจะไปอีกขั้นหนึ่งและมีtypedef Vector Pointที่ไหนสักแห่งในส่วนหัวที่กำหนดคะแนน ด้วยวิธีการที่ดูเหมือนและให้ความรู้สึกเหมือนPointไม่มีใครถูกเกาหัวของพวกเขาเมื่อใช้มันทำไมมันเรียกว่าVectorแต่ในด้านภายในเป็นฐานรหัสเดียวเท่านั้น
tpg2114

4

เพียงแค่ใช้วัตถุเวกเตอร์ แม้ว่าคุณจะรู้สึกว่านี่ / ถูกใช้อย่างไม่ถูกต้องในอดีตมันเป็นสิ่งที่คนคาดหวัง นอกจากนี้ไม่จำเป็นต้องใช้เวกเตอร์เป็นจุด และคงเป็นการยากที่จะทำนอกการอภิปรายเนื่องจากโครงสร้างข้อมูลทั้งสองต้องการชนิดดั้งเดิม ความแตกต่างเพียงอย่างเดียวคือฟังก์ชั่นสมาชิกและมันง่ายพอที่จะทำให้พวกมันอยู่ในคลาสเดียวกันเนื่องจากไม่มีวิธีการขัดแย้งกันระหว่างทั้งสองมากนัก

เนื่องจากคุณกำลังเรียนรู้มันเป็นการดีที่จะเรียนรู้ว่าการทำสิ่งที่คนคาดหวังมักจะเป็นวิธีที่ดีที่สุดในการทำสิ่งต่าง ๆ


ฟังก์ชั่นสมาชิกไม่ได้เป็นเพียงความแตกต่างระหว่างคะแนนและเวกเตอร์เท่านั้น ดังนั้นwองค์ประกอบซึ่งเป็นสิ่งสำคัญ
kevintodisco

3

คะแนนเป็นสถานที่ในอวกาศ เมื่อคุณมีระบบพิกัดคุณสามารถอธิบายว่าจุดเหล่านั้นเป็นระยะทางและทิศทางจากจุดกำเนิด (เวกเตอร์) ดังนั้นจึงเหมาะสมอย่างยิ่งที่จะใช้เวกเตอร์เพื่ออธิบายจุดเริ่มต้นและจุดสิ้นสุดของเส้น

โปรดระวังว่าคะแนนทั้งหมดสามารถแสดงเป็นเวกเตอร์ได้ แต่เวกเตอร์ไม่ใช่คะแนน เวกเตอร์ส่วนใหญ่เช่นความเร็วปกติ ฯลฯ ไม่มีความรู้สึกถึงสถานที่ใด ๆ

ลองนึกถึงสายลมคุณสามารถพูดคุยเกี่ยวกับทิศทางและความแข็งแกร่งของมัน แต่คุณไม่สามารถพูดคุยเกี่ยวกับตำแหน่งหรือตำแหน่งของมัน นี่คือวิธีที่คุณควรคิดถึงเวกเตอร์เมื่อไม่ใช้เพื่ออธิบายจุดในอวกาศ


2

ในการกำหนดจุดคุณต้องการเพียงเวกเตอร์เดียว ในการกำหนดบรรทัดคุณต้องมีสองบรรทัด โดยทั่วไปคุณมีสองจุดที่วางอยู่บนเส้นหรือเวกเตอร์หนึ่งอันแทนจุดที่อยู่บนเส้นนั้นและอีกเวกเตอร์หนึ่งที่แทนทิศทางของเส้น

ไม่มีปัญหาในการกำหนดจุดเป็นเวกเตอร์เนื่องจากจุด IS เป็นเวกเตอร์ที่มีทิศทางเท่ากับพิกัดและขนาดเท่ากับระยะห่างจาก 0,0

ดังนั้นคุณไม่จำเป็นต้องมีสองคลาสแยกเพื่อแสดงจุดและ "Vector2d" แม้ว่าจุดนั้นน่าจะเป็น subclass ของ Vector2d ที่มีฟังก์ชั่นสมาชิกที่แตกต่างกันที่เกี่ยวข้องโดยตรงกับรูปวาดหรือการประมวลผลของคุณในขณะที่ Vector2d อาจทำหน้าที่ ผลิตภัณฑ์ดอท


2

ใช่มันเป็นความตกลงที่จะใช้เดี่ยวVectorชั้นเรียนเพื่อกำหนดทั้งคะแนนและเวกเตอร์ตราบเท่าที่คุณมั่นใจได้ว่าw0ส่วนประกอบของเวกเตอร์คือ

สำคัญแตกต่างระหว่างจุดและเวกเตอร์คือจุดที่แสดงให้เห็นถึงสถานที่ตั้งทางกายภาพในพื้นที่ชดเชยจากแหล่งกำเนิดในขณะที่เวกเตอร์แสดงให้เห็นถึงทิศทาง จุดที่สามารถแปล, เวกเตอร์ไม่สามารถ wองค์ประกอบของ 2 หรือ 3 มิติVectorระดับเป็นสิ่งที่ช่วยให้องค์ประกอบการแปลของเมทริกซ์การเปลี่ยนแปลงที่จะมีผลใน ถ้าwเป็น1เช่นนั้นการแปลและการหมุนจะถูกนำไปใช้; ถ้าเป็น0เช่นนั้นจะใช้เฉพาะการหมุน

การไม่มีwส่วนประกอบของชุดเวกเตอร์0สามารถกลับมากัดคุณได้ มันนำไปสู่ข้อบกพร่องที่ค่อนข้างยากที่จะติดตาม เพื่อความปลอดภัยคุณสามารถสร้างPointคลาสที่สืบทอดจากVectorชั้นเรียนและชัดเจนชุดwไป1ที่Vectorค่าเริ่มต้นของระดับที่จะw0


2
คลาสเวกเตอร์จำนวนมากไม่ใช้คอมโพเนนต์ w อย่างชัดเจน ค่อนข้างน้อยถือว่าเป็นองค์ประกอบโดยปริยายหรือมีจำนวนเท่าใดในคลาส 'ProjectiveVector' ที่นำไปใช้ แต่รหัสของเครื่องยนต์ (ทุกอย่างภายนอกการเรนเดอร์) ใช้ 'คลาสสิก' เวกเตอร์ 'ที่ประกอบไปด้วยส่วนประกอบ aw ฟุ่มเฟือยทั้งหมด นี่คือรายละเอียดการนำไปใช้ไม่ใช่ส่วนสำคัญของเวกเตอร์หรือจุด
Steven Stadnicki

@StevenStadnicki นั่นเป็นเรื่องจริง แต่เพื่อให้คลาสเป็นตัวแทนของทั้งจุดและเวกเตอร์wส่วนประกอบนั้นจะต้องมีอยู่มิฉะนั้นจะไม่มีวิธีที่จะกำหนดว่าควรใช้วัตถุอย่างไร
kevintodisco

1
@ktodisco ฉันคิดว่าวิธีการกำหนดวิธีการใช้ควรดูที่บริบทจะถูกใช้
JCM

1
หมดเวลาในการแก้ไขความคิดเห็น :( เป็นไปได้ที่จะบอกว่าถ้าส่วนของเครื่องยนต์ที่ใช้ชั้นเรียนกำหนดบริบทที่จะใช้มันก็ใช้งานได้
kevintodisco

2

คะแนนและเวกเตอร์สามารถคิดได้ในสิ่งเดียวกัน ถ้ามันสมเหตุสมผลกับคุณคุณสามารถคิดถึงเวกเตอร์ที่แสดงถึงตำแหน่งด้วยวิธีนี้และจากนั้นมันก็สมเหตุสมผลที่จะใช้Vector2คลาสในทุก ๆ ที่ที่คุณจะต้องใช้Pointคลาส

ในคณิตศาสตร์บางครั้งเวกเตอร์ใช้เพื่อแสดงตำแหน่ง เมื่อใช้ในแง่นี้เวกเตอร์จะแสดงตำแหน่งที่เอนทิตีบางแห่งสัมพันธ์กับจุดกำเนิด ตัวอย่างเช่นสมมติว่าคุณกำลังทำ sh'mup และคุณต้องการติดตามตำแหน่งที่เรือของผู้เล่นอยู่ในพื้นที่เล่น หากคุณปฏิบัติต่อมุมซ้ายล่างของพื้นที่เล่นเป็น (0, 0) คุณสามารถแสดงตำแหน่งของผู้เล่นด้วยVector:

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

ความหมายของเวกเตอร์ในกรณีนี้คือเรือเป็น 3 หน่วยทางด้านขวาของและ 3 หน่วยเหนือแหล่งกำเนิด (โปรดทราบว่าคุณยังสามารถใช้เวกเตอร์สำหรับความเร็วของผู้เล่นซึ่งในกรณีนี้ผู้เล่นจะเลื่อนไปทางขวา 3 หน่วยและ 3 หน่วยขึ้นทุกวินาทีหรือเฟรมตำแหน่งและความเร็วจะถูกแทนด้วยคลาสเวกเตอร์เดียวกัน ถูกประมวลผลแตกต่างกันในสคริปต์ของผู้เล่น)

ในการใช้ตัวอย่างบรรทัดของคุณเวกเตอร์ตำแหน่งจะแสดงตำแหน่งที่ "จุด" เริ่มต้นและจุดสิ้นสุด "จุด" สัมพันธ์กับจุดเริ่มต้น หากต้นกำเนิดของคุณเป็นศูนย์กลางของพื้นที่เล่นคุณสามารถกำหนดบรรทัดดังนี้:

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

ดังนั้นปลายด้านหนึ่งของเส้นคือ 8 หน่วยทางด้านขวาของและ 2 หน่วยเหนือศูนย์กลางของสนามเด็กเล่นและอีกปลายหนึ่งคือ 8 หน่วยด้านขวาและ 2 หน่วยลง

เพื่อให้ชัดเจนนี่ไม่ได้หมายความว่าคุณจะต้องใช้VectorคลาสแทนPointคลาส นี่เป็นเพียงวิธีหนึ่งในการคิดเกี่ยวกับสถานการณ์นี้ซึ่งจะทำให้ง่ายต่อการตัดสินใจว่าจะนำความคิดเหล่านั้นไปใช้อย่างไร


เวกเตอร์เป็นออฟเซ็ตไปยังจุดอื่นในอวกาศยังคงต้องคำนึงถึงเป็นจุดในพิกัดสัมพัทธ์ การเรียกมันว่าเวกเตอร์เป็นสิ่งที่ผิด
kevintodisco

0

มันขึ้นอยู่กับการใช้งาน หากคุณต้องมีวิธีการใน Vector2d แทนที่จะเป็นต้นแบบมันมีค่าใช้จ่ายสำหรับสิ่งนั้นโดยกำหนดจำนวนคะแนนที่คุณต้องการในเกม มันเป็นเพียงการทำงานของจาวาสคริปต์ ในสถานการณ์นั้นดีกว่าที่จะสร้างคลาส Point2d ที่ไม่มีฟังก์ชั่นที่ไม่จำเป็นทั้งหมด


มีการเพิ่มวิธีการลงในต้นแบบดังนั้นจึงไม่ใช่ปัญหา
JCM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.