อัลกอริทึมการสร้างเส้น
เส้นเชื่อมต่อสองจุด มันเป็นองค์ประกอบพื้นฐานในกราฟิก ในการลากเส้นคุณต้องมีจุดสองจุดเพื่อลากเส้น ในสามอัลกอริทึมต่อไปนี้เราอ้างถึงจุดหนึ่งของบรรทัดเป็น $ X_ {0}, Y_ {0} $ และจุดที่สองของบรรทัดเป็น $ X_ {1}, Y_ {1} $
อัลกอริทึม DDA
อัลกอริทึม Digital Differential Analyzer (DDA) เป็นอัลกอริธึมการสร้างเส้นอย่างง่ายซึ่งอธิบายทีละขั้นตอนที่นี่
Step 1 - รับอินพุตของจุดสิ้นสุดสองจุด $ (X_ {0}, Y_ {0}) $ และ $ (X_ {1}, Y_ {1}) $
Step 2 - คำนวณความแตกต่างระหว่างสองจุดสิ้นสุด
dx = X1 - X0
dy = Y1 - Y0
Step 3- จากความแตกต่างที่คำนวณได้ในขั้นตอนที่ 2 คุณต้องระบุจำนวนขั้นตอนในการใส่พิกเซล ถ้า dx> dy คุณต้องมีขั้นตอนเพิ่มเติมในพิกัด x มิฉะนั้นในพิกัด y
if (absolute(dx) > absolute(dy))
Steps = absolute(dx);
else
Steps = absolute(dy);
Step 4 - คำนวณการเพิ่มขึ้นของพิกัด x และพิกัด y
Xincrement = dx / (float) steps;
Yincrement = dy / (float) steps;
Step 5 - ใส่พิกเซลโดยเพิ่มพิกัด x และ y ให้สำเร็จตามลำดับและวาดเส้นให้เสร็จสมบูรณ์
for(int v=0; v < Steps; v++)
{
x = x + Xincrement;
y = y + Yincrement;
putpixel(Round(x), Round(y));
}
Line Generation ของ Bresenham
อัลกอริทึม Bresenham เป็นอีกหนึ่งอัลกอริทึมการแปลงการสแกนที่เพิ่มขึ้น ข้อได้เปรียบที่สำคัญของอัลกอริทึมนี้คือใช้การคำนวณจำนวนเต็มเท่านั้น การเคลื่อนที่ข้ามแกน x ในช่วงเวลาของหน่วยและในแต่ละขั้นตอนให้เลือกระหว่างพิกัด y สองพิกัดที่ต่างกัน
ตัวอย่างเช่นดังที่แสดงในภาพประกอบต่อไปนี้จากตำแหน่ง (2, 3) คุณต้องเลือกระหว่าง (3, 3) และ (3, 4) คุณต้องการจุดที่ใกล้กับเส้นเดิมมากขึ้น
ที่ตำแหน่งตัวอย่าง $ X_ {k} + 1 $ การแยกแนวตั้งจากเส้นคณิตศาสตร์จะมีข้อความกำกับว่า $ d_ {upper} $ และ $ d_ {lower} $
จากภาพประกอบด้านบนพิกัด y บนเส้นคณิตศาสตร์ที่ $ x_ {k} + 1 $ คือ -
Y = m ($ X_ {k} $ + 1) + b
ดังนั้น $ d_ {upper} $ และ $ d_ {lower} $ จะได้รับดังนี้ -
$$ d_ {lower} = y-y_ {k} $$
$$ = m (X_ {k} + 1) + b - Y_ {k} $$
และ
$$ d_ {upper} = (y_ {k} + 1) - y $$
$ = Y_ {k} + 1 - ม. (X_ {k} + 1) - b $
คุณสามารถใช้สิ่งเหล่านี้เพื่อตัดสินใจง่ายๆว่าพิกเซลใดอยู่ใกล้เส้นคณิตศาสตร์มากขึ้น การตัดสินใจง่ายๆนี้ขึ้นอยู่กับความแตกต่างระหว่างตำแหน่งพิกเซลทั้งสอง
$$ d_ {lower} - d_ {upper} = 2m (x_ {k} + 1) - 2y_ {k} + 2b - 1 $$
ให้เราแทนที่mด้วยdy / dxโดยที่dxและdyคือความแตกต่างระหว่างจุดสิ้นสุด
$$ dx (d_ {lower} - d_ {upper}) = dx (2 \ frac {\ mathrm {d} y} {\ mathrm {d} x} (x_ {k} + 1) - 2y_ {k} + 2b - 1) $$
$$ = 2dy.x_ {k} - 2dx.y_ {k} + 2dy + 2dx (2b-1) $$
$$ = 2dy.x_ {k} - 2dx.y_ {k} + C $$
ดังนั้นพารามิเตอร์การตัดสินใจ $ P_ {k} $ สำหรับขั้นตอนที่kตามบรรทัดจะถูกกำหนดโดย -
$$ p_ {k} = dx (d_ {lower} - d_ {upper}) $$
$$ = 2dy.x_ {k} - 2dx.y_ {k} + C $$
เครื่องหมายของพารามิเตอร์การตัดสินใจ $ P_ {k} $ เหมือนกับของ $ d_ {lower} - d_ {upper} $
หาก $ p_ {k} $ เป็นค่าลบให้เลือกพิกเซลที่ต่ำกว่าหรือเลือกพิกเซลบน
โปรดจำไว้ว่าการเปลี่ยนแปลงพิกัดเกิดขึ้นตามแกน x ในหน่วยขั้นตอนดังนั้นคุณสามารถทำทุกอย่างได้ด้วยการคำนวณจำนวนเต็ม ในขั้นตอนที่ k + 1 พารามิเตอร์การตัดสินใจถูกกำหนดเป็น -
$$ p_ {k +1} = 2dy.x_ {k + 1} - 2dx.y_ {k + 1} + C $$
ลบ $ p_ {k} $ จากสิ่งนี้เราได้ -
$$ p_ {k + 1} - p_ {k} = 2dy (x_ {k + 1} - x_ {k}) - 2dx (y_ {k + 1} - y_ {k}) $$
แต่ $ x_ {k + 1} $ เหมือนกับ $ (xk) + 1 $ ดังนั้น -
$$ p_ {k + 1} = p_ {k} + 2dy - 2dx (y_ {k + 1} - y_ {k}) $$
โดยที่ $ Y_ {k + 1} - Y_ {k} $ เป็น 0 หรือ 1 ขึ้นอยู่กับเครื่องหมายของ $ P_ {k} $
พารามิเตอร์การตัดสินใจแรก $ p_ {0} $ ได้รับการประเมินที่ $ (x_ {0}, y_ {0}) $ ได้รับเป็น -
$$ p_ {0} = 2dy - dx $$
ตอนนี้โปรดทราบถึงประเด็นข้างต้นและการคำนวณทั้งหมดนี่คืออัลกอริทึม Bresenham สำหรับความชัน m <1 -
Step 1 - ป้อนจุดสิ้นสุดสองจุดของบรรทัดโดยจัดเก็บจุดปลายด้านซ้ายใน $ (x_ {0}, y_ {0}) $
Step 2 - พล็อตจุด $ (x_ {0}, y_ {0}) $
Step 3 - คำนวณค่าคงที่ dx, dy, 2dy และ (2dy - 2dx) และรับค่าแรกสำหรับพารามิเตอร์การตัดสินใจเป็น -
$$ p_ {0} = 2dy - dx $$
Step 4 - ในแต่ละ $ X_ {k} $ ตลอดแนวเริ่มต้นที่ k = 0 ให้ทำการทดสอบต่อไปนี้ -
ถ้า $ p_ {k} $ <0 จุดต่อไปที่จะลงจุดคือ $ (x_ {k} +1, y_ {k}) $ และ
$$ p_ {k + 1} = p_ {k} + 2dy $$ มิฉะนั้น
$$ (x_ {k}, y_ {k} +1) $$
$$ p_ {k + 1} = p_ {k} + 2dy - 2dx $$
Step 5 - ทำซ้ำขั้นตอนที่ 4 (dx - 1) ครั้ง
สำหรับ m> 1 ให้ค้นหาว่าคุณต้องเพิ่ม x ในขณะที่เพิ่ม y ทุกครั้งหรือไม่
หลังจากแก้แล้วสมการสำหรับพารามิเตอร์การตัดสินใจ $ P_ {k} $ จะใกล้เคียงกันมากเพียงแค่ x และ y ในสมการได้รับการแลกเปลี่ยนกัน
อัลกอริทึมจุดกึ่งกลาง
อัลกอริทึมจุดกึ่งกลางเกิดจาก Bresenham ซึ่งแก้ไขโดย Pitteway และ Van Aken สมมติว่าคุณได้ใส่จุด P ไว้ที่พิกัด (x, y) แล้วและความชันของเส้นคือ 0 ≤ k ≤ 1 ดังแสดงในภาพประกอบต่อไปนี้
ตอนนี้คุณต้องตัดสินใจว่าจะวางจุดต่อไปที่ E หรือ N ซึ่งสามารถเลือกได้โดยระบุจุดตัดกัน Q ใกล้กับจุด N หรือ E มากที่สุดหากจุดตัดกัน Q อยู่ใกล้กับจุด N มากที่สุดดังนั้น N จะถือว่าเป็น จุดต่อไป; มิฉะนั้น E.
ก่อนอื่นให้คำนวณจุดกลาง M (x + 1, y + ½) หากจุดตัดกัน Q ของเส้นที่มีเส้นแนวตั้งเชื่อมต่อ E และ N อยู่ต่ำกว่า M ให้ใช้ E เป็นจุดถัดไป มิฉะนั้นจะใช้ N เป็นจุดถัดไป
ในการตรวจสอบสิ่งนี้เราต้องพิจารณาสมการนัย -
F (x, y) = mx + b - y
สำหรับม. บวกที่ X ที่กำหนด
- ถ้า y อยู่บนเส้นแล้ว F (x, y) = 0
- ถ้า y อยู่เหนือเส้นแล้ว F (x, y) <0
- ถ้า y อยู่ต่ำกว่าเส้นแล้ว F (x, y)> 0