Mathematica, 166 137 ไบต์
l:={i,j};s=Sign;f[p_,q_,h_,w_]:=Grid@Table[(1-Max[s[p-l]s[q-l],0])Boole[Abs@Mean[s@Det@{p-l+#,p-q}&/@Tuples[.5{1,-1},2]]<.6],{i,h},{j,w}]
รุ่นที่อ่านเพิ่มเติมได้:
l := {i, j}; s = Sign;
f[p_, q_, h_, w_] :=
Grid@Table[(1 - Max[s[p - l] s[q - l], 0]) Boole[
Abs@Mean[
s@Det@{p - l + #, p - q} & /@
Tuples[.5 {1, -1}, 2]] < .6], {i, h}, {j, w}]
f
นี้กำหนดฟังก์ชั่นที่เรียกว่า ฉันตีความข้อกำหนดอินพุตและเอาต์พุตอย่างเป็นอิสระ ฟังก์ชั่นf
รับอินพุตในรูปแบบf[{x0, y0}, {x1, y1}, height, width]
และกริดเป็น 1 ดัชนีเริ่มต้นที่ด้านซ้ายบน ผลลัพธ์มีลักษณะดังนี้
ด้วยบรรทัดที่แสดงเป็น1
s และพื้นหลังเป็น0
s (แสดงที่นี่เพื่อf[{2, 6}, {4, 2}, 5, 7]
) ภารกิจของการเปลี่ยนเมทริกซ์ Mathematica ของ1
s และ0
s เป็นสตริงของ#
s และ.
s ได้รับการตีกอล์ฟในความท้าทายอื่น ๆ อีกมากมายมาก่อนดังนั้นฉันสามารถใช้วิธีมาตรฐาน แต่ฉันไม่คิดว่าจะเพิ่มสิ่งที่น่าสนใจ
คำอธิบาย:
แนวคิดทั่วไปคือถ้าเส้นผ่านพิกเซลบางอย่างแล้วอย่างน้อยหนึ่งในสี่มุมของพิกเซลอยู่เหนือเส้นและอย่างน้อยหนึ่งอยู่ด้านล่าง เราตรวจสอบว่ามุมหนึ่งอยู่เหนือหรือใต้เส้นโดยตรวจสอบมุมระหว่างเวกเตอร์ ( {x0,y0}
กับมุม) และ ( {x0,y0}
ถึง{x1,y1}
): ถ้ามุมนี้เป็นบวกมุมจะอยู่เหนือและถ้ามุมนั้นเป็นลบมุมจะอยู่ด้านล่าง
ถ้าเรามีสองเวกเตอร์{a1,b1}
และเราสามารถตรวจสอบว่ามุมระหว่างพวกเขาเป็นบวกหรือลบโดยการหาสัญญาณของปัจจัยของเมทริกซ์ที่{a2,b2}
{{a1,b1},{a2,b2}}
(วิธีการเก่าของฉันในการทำสิ่งนี้ใช้เลขคณิตของจำนวนเชิงซ้อนซึ่งเป็นวิธีที่เกินไป…ดีซับซ้อน)
วิธีการทำงานในรหัสมีดังนี้:
{p-l+#,p-q}&/@Tuples[.5{1,-1},2]
ได้รับสี่พาหะจาก{x0,y0}
และมุมทั้งสี่ของพิกเซล (กับl:={i,j}
พิกัดของพิกเซลที่กำหนดไว้ก่อนหน้านี้) และยังเวกเตอร์ระหว่างและ{x0,y0}
{x1,y1}
s@Det@...
ค้นหาสัญญาณของมุมระหว่างเส้นและมุมทั้งสี่ (โดยใช้s=Sign
) สิ่งเหล่านี้จะเท่ากับ -1, 0 หรือ 1
Abs@Mean[...]<.6
ตรวจสอบว่ามุมบางมุมเป็นบวกและลบ 4 อันดับของสัญญาณที่มีคุณสมบัติทั้งหมดนี้มีวิธีการระหว่าง -0.5 และ 0.5 (รวม) เพื่อให้เราเปรียบเทียบกับ 0.6 เพื่อประหยัดไบต์โดยใช้แทน<
<=
ยังคงมีปัญหา: รหัสนี้อนุมานว่าบรรทัดที่ขยายไปตลอดกาลในทั้งสองทิศทาง เราจำเป็นต้องครอบตัดบรรทัดโดยการคูณด้วย1-Max[s[p-l]s[q-l],0]
(พบโดยการลองผิดลองถูก) ซึ่งอยู่1
ภายในสี่เหลี่ยมที่กำหนดโดยจุดสิ้นสุดของเส้นและ0
นอก
ส่วนที่เหลือของรหัสทำให้ตารางของพิกเซลเหล่านี้
(เป็นโบนัสนี่เป็นความพยายามก่อนหน้านี้ด้วยวิธีที่แตกต่างอย่างสิ้นเชิงสำหรับ 181 ไบต์ :)
Quiet@Grid@Table[(1-Max[Sign[{i,j}-#3]Sign[{i,j}-#4],0])Boole[#3==#4=={i,j}||2Abs@Tr[Cross@@Thread@{{i,j},#3,#4}]/Norm[d=#3-#4]<2^.5Cos@Abs[Pi/4-Mod[ArcTan@@d,Pi/2]]],{i,#},{j,#2}]&