Bresenham
ในสมัยก่อนเมื่อผู้คนยังคงเขียนกิจวัตรวิดีโอขั้นพื้นฐานของตนเองเพื่อวาดเส้นและวงกลมมันก็ไม่แปลกที่จะใช้อัลกอริธึมบรรทัด Bresenham สำหรับสิ่งนั้น
Bresenham แก้ปัญหานี้ได้: คุณต้องการวาดเส้นบนหน้าจอที่เคลื่อนย้ายdx
พิกเซลในทิศทางแนวนอนในขณะเดียวกันก็ขยายdy
พิกเซลในแนวตั้ง มีอักขระ "floaty" อยู่ในบรรทัด แม้ว่าคุณจะมีจำนวนเต็มพิกเซล แต่คุณก็มีความเอนเอียงอย่างมีเหตุผล
อัลกอริทึมจะต้องรวดเร็วแม้ว่าซึ่งหมายความว่ามันสามารถใช้เลขคณิตเลขจำนวนเต็มเท่านั้น และมันก็จะหายไปโดยไม่มีการคูณหรือการหารเพียงแค่การบวกและการลบ
คุณสามารถปรับใช้สำหรับกรณีของคุณ:
- "ทิศทาง x" ของคุณ (ในแง่ของอัลกอริทึม Bresenham) คือนาฬิกาของคุณ
- "ทิศทาง y" ของคุณคือค่าที่คุณต้องการเพิ่มขึ้น (เช่นตำแหน่งของตัวละครของคุณ - ระวังนี่ไม่ใช่ "y" ของเทพดาของคุณหรืออะไรก็ตามบนหน้าจอมากกว่าค่านามธรรม)
"x / y" ที่นี่ไม่ใช่ตำแหน่งบนหน้าจอ แต่เป็นค่าของมิติใดมิติหนึ่งของคุณในเวลา เห็นได้ชัดว่าถ้าผีสางของคุณกำลังวิ่งไปในทิศทางใดก็ได้บนหน้าจอคุณจะมี Bresenhams หลายตัววิ่งแยกกัน 2 สำหรับ 2D และ 3 สำหรับ 3D
ตัวอย่าง
สมมติว่าคุณต้องการที่จะย้ายตัวละครของคุณในการเคลื่อนไหวที่เรียบง่ายจาก 0 ถึง 25 พร้อมหนึ่งในแกนของคุณ เมื่อมันเคลื่อนที่ด้วยความเร็ว 2.5 มันจะไปอยู่ที่เฟรม 10
สิ่งนี้เหมือนกับ "การวาดเส้น" จาก (0,0) ถึง (10,25) คว้า algoritm ของ Bresenham และปล่อยให้มันวิ่ง ถ้าคุณทำถูกต้อง (และเมื่อคุณศึกษามันจะชัดเจนอย่างรวดเร็วว่าคุณทำถูก) แล้วมันจะสร้าง 11 "คะแนน" สำหรับคุณ (0,0), (1,2), (2, 5), (3,7), (4,10) ... (10,25)
คำแนะนำในการปรับตัว
หากคุณ google อัลกอริทึมนั้นและค้นหารหัส (Wikipedia มีสนธิสัญญาที่ค่อนข้างใหญ่) มีบางสิ่งที่คุณต้องระวัง:
- มันเห็นได้ชัดว่าการทำงานสำหรับทุกชนิดและ
dx
dy
คุณสนใจในกรณีใดกรณีหนึ่งโดยเฉพาะ (เช่นคุณจะไม่มีวันdx=0
)
- การดำเนินงานตามปกติจะมีกรณีที่แตกต่างกันหลายแนวทางบนหน้าจอขึ้นอยู่กับว่า
dx
และdy
มีบวกลบและยังว่าabs(dx)>abs(dy)
หรือไม่ แน่นอนว่าคุณเลือกสิ่งที่คุณต้องการที่นี่ คุณต้องทำให้แน่ใจเป็นพิเศษว่าทิศทางที่เพิ่มขึ้น1
ทุก ๆ เห็บนั้นเป็นทิศทาง "นาฬิกา" ของคุณเสมอ
หากคุณใช้การทำให้เข้าใจง่ายเหล่านี้ผลลัพธ์จะง่ายมากแน่นอนและกำจัด reals ใด ๆ โดยสิ้นเชิง