การวาดเส้นที่ตัดกันอย่างรวดเร็ว


11

อัลกอริธึมไลน์ของ Bresenham เป็นวิธีการวาดเส้นตรงโดยใช้การดำเนินการจำนวนเต็มอย่างรวดเร็วเท่านั้น (การบวกการลบและการคูณด้วย 2) อย่างไรก็ตามมันสร้างสายนามแฝง มีวิธีที่รวดเร็วในการวาดเส้นที่ตัดกันหรือไม่?


1
คำถามสองข้อ ... คุณใช้ตรรกะการวาดภาพบน CPU หรือ GPU หรือไม่? นอกจากนี้คุณกำลังมองหาอัลกอริทึมตามจำนวนเต็มหรือทศนิยม?
Alan Wolfe

5
@AlanWolfe อัลกอริทึมจำนวนเต็มบน CPU - สภาพแวดล้อมเดียวกับอัลกอริทึมของ Bresenham ได้รับการออกแบบมาสำหรับ
ทำเครื่องหมาย

3
en.wikipedia.org/wiki/Xiaolin_Wu%27s_line_algorithmเป็นแบบคลาสสิกแม้ว่าหน้าวิกิพีเดียนั้นค่อนข้างอ่อนหัดและฉันไม่สามารถเข้าถึงกระดาษได้ นี่ให้ความรู้สึกเหมือนเป็นคำถามที่ขี้เกียจเพราะมันค่อนข้างง่ายที่จะหาสิ่งนี้ได้ด้วยการทำ googling พื้นฐาน
yuriks

2
เพียงแค่คิดออกมาดัง ๆ ฉันคิดว่ามันควรง่ายที่จะปรับ Bresenham สำหรับการวาดเส้นที่มีความหนาหลายพิกเซล จากนั้นคุณสามารถทำการลดรอยหยักโดยการคำนวณระยะทางของจุดศูนย์กลางพิกเซลแต่ละจุดจากเส้นในอุดมคติทางคณิตศาสตร์และใช้ฟังก์ชัน falloff บางอย่าง
นาธานรีด

2
อย่างไรก็ตามฉันไม่สามารถทำเครื่องหมายความคิดเห็นว่าถูกต้องได้
ทำเครื่องหมาย

คำตอบ:


9

มีวิธีที่รวดเร็วในการวาดเส้นที่ตัดกันหรือไม่?

ไม่เพราะตามคำจำกัดความบรรทัดที่ต่อต้านนามแฝงจะมีจำนวนพิกเซลเพิ่มขึ้น ขั้นตอนวิธีดังกล่าวจะช้าลง


ใน rasterizer ซอฟต์แวร์วิธีที่แพร่หลายเพื่อวาดเส้นป้องกัน aliased เป็นอัลกอริทึมบรรทัด Xiaolin วู การใช้งานไม่ยากและมี pseudocode คุณภาพสูงที่ลิงก์นั้นผิดปกติ

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

ใน raytracer มีตัวเลือกมากมาย เป็นมูลค่าการคิดเกี่ยวกับวิธีที่คุณต้องการวาดวัตถุ 1D อาจจะเป็นรูปทรงกระบอก (แสวงหาเงา!) โปรดทราบว่าสิ่งนี้จะนำเสนอปัญหามุมมอง / การย่อส่วนซึ่งอาจ (หรืออาจไม่) เป็นสิ่งที่คุณต้องการ ไม่มีลักษณะทั่วไปที่ชัดเจน จากนั้นไม่ว่าคุณจะทำอะไรคุณแค่ยกตัวอย่าง


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

@ Octopus [แสดงความสงสัยที่คลุมเครือโดยเฉพาะอย่างยิ่งบิตที่เร็วขึ้น แต่ไม่มีบริบทในการปฏิเสธหรือยืนยัน - ถ้าเป็นเช่นนั้นแหล่งที่มาการแก้ไขและการแก้ไขจะได้รับการต้อนรับแน่นอน]
imallett

ขึ้นอยู่กับสิ่งที่คุณนับ หากคุณดึงจากทั้งสองด้านเข้าด้านในอัลกอริธึมของ Wu จะคำนวณครึ่งหนึ่ง แต่สองเท่าของจำนวนพิกเซลที่เขียน ดูตารางที่ 1 ในเอกสารของ Wu เชื่อมโยงกับ Wikipedia ดังนั้นหากการเขียนพิกเซลมีราคาแพงเช่นในกรณีที่เขียนไปยัง TFT บนการเชื่อมต่อแบบอนุกรมอัลกอริทึมของ Wu จะแพงกว่าของ Bresenham (ฉันต้องยอมรับว่าฉันไม่เห็นว่าทำไมอัลกอริธึมของ Bresenham จึงไม่สามารถใช้สมมาตรได้เช่นกัน)
Jan-Åke Larsson

1
แต่ฉันเห็นด้วยกับ @Octopus ถึงแม้จะยอมรับ "การดึงจากปลายด้านหนึ่งไปยังอีกด้าน" pseudocode เป็นอัลกอริธึมของวูก็ต่อเมื่อมีการใช้เลขคณิตจำนวนเต็มตลอด รหัสที่ฉันเห็นทางออนไลน์นั้นใช้เลขคณิตทศนิยมซึ่งเป็นการเปลี่ยนแปลงที่สำคัญ ในกระดาษของ Wu อัลกอริทึมใช้เลขจำนวนเต็มเท่านั้น (หรือเลขคณิตจุดคงที่)
Jan-Åke Larsson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.