สมมติว่าฉันมี 4 คะแนน (เป็น 2 มิติ) ซึ่งแตกต่างจากกันและฉันต้องการทราบว่าพวกเขาเป็นรูปสี่เหลี่ยมจัตุรัสหรือไม่ ทำอย่างไร? (ให้กระบวนการง่ายที่สุดเท่าที่จะทำได้)
สมมติว่าฉันมี 4 คะแนน (เป็น 2 มิติ) ซึ่งแตกต่างจากกันและฉันต้องการทราบว่าพวกเขาเป็นรูปสี่เหลี่ยมจัตุรัสหรือไม่ ทำอย่างไร? (ให้กระบวนการง่ายที่สุดเท่าที่จะทำได้)
คำตอบ:
สมมติว่าสี่เหลี่ยมจัตุรัสของคุณอาจหมุนกับระบบพิกัดใดก็ตามที่คุณมีอยู่คุณไม่สามารถวางใจได้ว่าจะมีการทำซ้ำค่า X และ Y ในจุดสี่จุดของคุณ
สิ่งที่คุณสามารถทำได้คือคำนวณระยะทางระหว่างจุดสี่จุดแต่ละจุด หากคุณพบว่าสิ่งต่อไปนี้เป็นจริงคุณมีตารางดังนี้
มีสองจุดคือพูด A และ C ซึ่งเป็นระยะทางxจากกันและกันและอีกสองจุดพูดว่า B และ D ซึ่งเป็นระยะทางxจากกันและกัน
แต่ละจุด {A, B, C, D} เป็นระยะทางเท่ากันจากจุดสองจุดที่ไม่ได้xออกไป เช่น: ถ้าเป็นxห่างจาก C แล้วมันจะเป็นZห่างจากทั้ง B และ D
อนึ่งระยะทางzจะต้องเป็น SQRT (( x ^ 2) / 2) แต่คุณไม่จำเป็นต้องยืนยันสิ่งนี้ หากเงื่อนไขที่ 1 และ 2 เป็นจริงคุณจะมีกำลังสอง หมายเหตุ:บางคนมีความกังวลเกี่ยวกับความไร้ประสิทธิภาพของรากที่สอง ฉันไม่ได้บอกว่าคุณควรทำการคำนวณนี้ฉันแค่บอกว่าถ้าคุณทำคุณจะได้ผลลัพธ์ที่คาดเดาได้!
งานขั้นต่ำสุดที่คุณต้องทำคือเลือกจุดพูด A และคำนวณระยะห่างจากจุดสามจุดอื่น ๆ หากคุณพบว่า A คือxจากจุดหนึ่งและzจากอีกสองจุดคุณจะต้องตรวจสอบจุดสองจุดต่อกัน หากพวกเขาเป็นxจากกันและกันคุณก็จะได้สี่เหลี่ยม เช่น:
ตั้งแต่ AB = AD ให้ตรวจสอบ BD:
เพียงเพื่อให้แน่ใจว่าคุณจะต้องตรวจสอบด้านอื่น ๆ : BC และ CD
เนื่องจาก AC = BD และตั้งแต่ AB = AD = BC = CD นี่จึงเป็นรูปสี่เหลี่ยมจัตุรัส
ตลอดทางหากคุณพบว่ามีระยะห่างจากขอบที่แตกต่างกันมากกว่าสองระยะภาพจะไม่สามารถเป็นรูปสี่เหลี่ยมได้ดังนั้นคุณสามารถหยุดมองได้
ตัวอย่างการใช้งานจริง
ฉันได้สร้างตัวอย่างการทำงานบน jsfiddle (ดูที่นี่ ) ในคำอธิบายอัลกอริทึมของฉันฉันใช้คะแนนตามอำเภอใจ A, B, C และ D จุดใด ๆ ที่เกิดขึ้นนั้นอยู่ในลำดับที่แน่นอนเพื่อประโยชน์ในการเดินผ่านตัวอย่าง ขั้นตอนวิธีการทำงานแม้ว่าคะแนนอยู่ในลำดับที่แตกต่างอย่างไรตัวอย่างเช่นไม่จำเป็นต้องทำงานถ้าจุดเหล่านั้นอยู่ในลำดับที่แตกต่าง
ขอบคุณ: meshuai, Blrfl, MSalters และ Bart van Ingen Schenau สำหรับความคิดเห็นที่เป็นประโยชน์เพื่อปรับปรุงคำตอบนี้
เลือกสามในสี่คะแนน
ลองหาว่ามันคือสามเหลี่ยมหน้าจั่วใช่ไหมโดยตรวจสอบว่าหนึ่งในสามเวกเตอร์ระหว่างจุดเท่ากับอีกอันหนึ่งที่หมุนด้วย 90 องศา
ถ้าเป็นเช่นนั้นให้คำนวณจุดที่สี่ด้วยการเพิ่มเวกเตอร์และเปรียบเทียบกับจุดที่สี่ที่กำหนด
โปรดทราบว่าสิ่งนี้ไม่จำเป็นต้องใช้รากที่สองที่มีราคาแพงไม่ใช่แม้แต่การคูณ
sqrt
นอกเสียจากว่าจะสำคัญ! คุณไม่จำเป็นต้องลดการคำนวณจำนวนเต็มเป็น FP ... ไม่ต้องพูดถึงความแม่นยำของการคำนวณ FP ยิ่งแย่ลง
ฉันคิดว่าวิธีที่ง่ายที่สุดคือ:
ขั้นแรกให้คำนวณจุดศูนย์กลางของ 4 คะแนน: center = (A + B + C + D)/4
A - center
แล้วคำนวณเวกเตอร์ ปล่อยให้เรื่องนี้เป็นv := (x,y)
อนุญาตv2
เป็นเวกเตอร์v
หมุน 90 องศา:v2 := (-y, x)
ตอนนี้จุดอื่น ๆ ที่ควรจะเป็นcenter - v
, และcenter + v2
center - v2
ข้อดีของการแก้ปัญหานี้คือคุณไม่ต้องใช้รากที่สองเลย
ฉันขอโทษ แต่คำตอบบางอย่างใช้ไม่ได้
สำหรับกรณีที่คุณวัดขนาด 3 ขอบ (สมมติว่า AB, AC และ AD) เพื่อหาว่าทั้งสองมีขนาดเท่ากัน (สมมุติว่า AC และ AD) และหนึ่งมีขนาดใหญ่กว่า (สมมติว่า AB) จากนั้นคุณจะวัดซีดีเพื่อดูว่ามีขนาดเท่ากันของ AB หรือไม่และคุณพบว่าเป็น แทนที่จะเป็นสี่เหลี่ยมจัตุรัสคุณสามารถมีรูปภาพด้านล่างและนั่นทำให้มันเป็นทางออกที่ผิด
จากนั้นคุณลองวิธีแก้ปัญหาอื่น ๆ : วัดระยะทางทั้งหมดอย่างน้อยหนึ่งครั้ง: AB, AC, AD, BC, BD, CD จากนั้นคุณจะพบว่า 4 ในจำนวนนั้นเท่ากันและอีก 2 อันนั้นเท่ากัน แต่คุณสามารถมีภาพด้านล่าง:
ดังนั้นคำตอบเหล่านั้นไม่ถูกต้องแม้จะมี upvotes สูงที่พวกเขาได้รับ
วิธีแก้ปัญหาหนึ่งที่เป็นไปได้: หากมาตรการที่เท่าเทียมกันทั้งสองไม่เชื่อมต่อจุดเดียวกัน ดังนั้น: ถ้า AB และ CD มีความยาวเท่ากันชุดค่าผสมอื่น ๆ ทั้งหมด (AC, AD, BC, BD) ก็เท่ากันคุณก็จะมีกำลังสอง หากคุณมีจุดเดียวกันที่ทำให้ความยาวที่ใหญ่ที่สุด (AB และ AC เป็นจุดที่ใหญ่ที่สุดและสิ่งอื่น ๆ ที่เท่ากัน) คุณมีหนึ่งในภาพด้านบน
ให้ทั้งสี่จุดประสานเวกเตอร์ a, b, c, d
จากนั้นให้เรียกความแตกต่างของพวกเขาว่า w = (ad), x = (ba), y = (cb), z = (dc)
จากนั้น w คือ orthogonal ถึง a หากคุณสามารถสร้าง w จาก a โดยการหมุน 90 องศา คณิตศาสตร์ 90 องศาการหมุนเมทริกซ์ใน 2 สเปซคือ (0, -1), (1, 0) ดังนั้นเงื่อนไขว่า w เป็นผลลัพธ์ที่หมุนได้ 90 องศาหรือไม่
(w_1 == -x_2 และ w_2 == x_1)
หากสิ่งนี้มีอยู่คุณต้องตรวจสอบว่า w == -y และ x == -z หรือ
((w_1 == -y_1 และ w_2 == -y_2) และ (x_1 == -z_1 และ x_2 == -z_2))
หากความสัมพันธ์ทั้งสามนี้ดำรงอยู่ a, b, c, d ให้สร้างจตุรัสที่มุ่งเน้น
คล้ายกับคำตอบโดยstarblue
เลือกสามในสี่คะแนน
มองหาจุดยอดมุมฉากในหมู่พวกมันโดยตรวจสอบว่าผลคูณของจุดของสองเวกเตอร์สามตัวนั้นเป็นศูนย์หรือไม่ หากไม่พบไม่ใช่สแควร์
ตรวจสอบว่าจุดยอดที่อยู่ติดกับมุมนี้มีมุมฉากด้วยหรือไม่ ถ้าไม่ได้ไม่ใช่รูปสี่เหลี่ยมจัตุรัส
ตรวจสอบว่าเส้นทแยงมุมตั้งฉากกันหรือไม่: หากผลคูณของจุดของเวกเตอร์ระหว่างจุดยอดที่หนึ่งและสี่และจุดยอดสองจุด (เส้นทแยงมุม) อีกศูนย์เป็นศูนย์หรือไม่
มีคำตอบที่ดีที่นี่ แต่คำถามถามหาวิธีที่ง่ายที่สุด ฉันคิดอย่างรวดเร็วและนี่เป็นวิธีที่ฉันจะทำ
คุณสามารถบอกได้ว่าจุดสี่จุดแสดงถึงรูปสี่เหลี่ยม (แม้ว่าจะหมุน) แต่การหาค่าเฉลี่ยของจุดทั้งสี่นั้น
R = (A+B+C+D)/4
เมื่อคุณมีค่าเฉลี่ยระยะห่างระหว่างแต่ละจุดและค่าเฉลี่ยจะต้องเท่ากันสำหรับทั้งสี่จุด
if(dist(R,A) == dist(R,B) == dist(R,C) == dist(R,D) then
print "Is Square"
else
print "Is Not Square"
แก้ไข:
ความผิดพลาดของฉัน. นั่นจะบอกคุณว่าแบบฟอร์มนั้นอยู่ในวงกลมหรือไม่ หากคุณตรวจสอบระยะห่างระหว่างจุดด้วยมันจะต้องเป็นสี่เหลี่ยมจัตุรัส
if(dist(R,A) == dist(R,B) == dist(R,C) == dist(R,D) AND
(dist(A,B) == dist(B,C) == dist(C,D) == dist(A,D) then
print "Is Square"
else
print "Is Not Square"
สิ่งนี้จะถือว่าจุด A, B, C, D ไม่ข้าม (เช่นเดียวกับลำดับการไขลานที่ถูกต้อง)
นี่ไม่ใช่คำตอบตามมาตรฐานที่ตั้งไว้ แต่ฉันหวังว่าสิ่งนี้จะช่วยได้:
[คัดลอกมาจากลิงก์ด้านล่างเพื่อให้คุณไม่ต้องเปิดลิงก์] Python 76 ตัวอักษร
def S(A):c=sum(A)/4.0;return set(A)==set((A[0]-c)*1j**i+c for i in range(4))
ฟังก์ชัน S รับรายการตัวเลขที่ซับซ้อนเป็นอินพุต (A) หากเรารู้ทั้งจุดศูนย์กลางและมุมหนึ่งมุมของสี่เหลี่ยมเราสามารถสร้างตารางใหม่ได้โดยหมุนมุม 90,180 และ 270 องศารอบจุดศูนย์กลาง (c) ในการหมุนระนาบที่ซับซ้อน 90 องศาเกี่ยวกับจุดกำเนิดจะกระทำโดยการคูณจุดด้วย i หากรูปร่างดั้งเดิมของเราและจตุรัสที่สร้างใหม่มีจุดเท่ากันก็จะต้องเป็นสี่เหลี่ยมจัตุรัส
สิ่งนี้นำมาจาก: พิจารณาว่า 4 คะแนนจากรูปสี่เหลี่ยมหรือไม่
ถ้าคุณชอบคำตอบฉันพูดว่าใช้เวลาสักครู่เพื่อขอบคุณบุคคลนั้นหรือโหวตคำตอบของเขาในหน้านั้น
ฉันคิดว่าคุณสามารถทำได้ด้วยการบวกและการลบอย่างง่ายและการค้นหาขั้นต่ำ / สูงสุด ข้อกำหนด (ตรงกับแผนภาพของคนอื่น):
หาก 4 คะแนนใช้ร่วมกันเฉพาะค่า 2 x และค่า 2y เท่านั้นคุณจะได้ค่าสี่เหลี่ยมจัตุรัส
มิฉะนั้นคุณจะมีสี่เหลี่ยมจัตุรัสหากคะแนนของคุณเป็นไปตาม:
คำอธิบาย: ส่วนของเส้นตรง AC และ BD ควรตรงตามจุดกึ่งกลาง ดังนั้น (Ax + Cx) / 2 คือจุดกึ่งกลางของ AC และ (Bx + Dx) / 2 คือจุดกึ่งกลางของ BD คูณแต่ละข้างของสมการนี้ด้วย 2 เพื่อให้ได้สมการแรกของฉัน สมการที่สองนั้นเหมือนกันสำหรับค่า Y รูปทรงเพชร (rhomboids) จะตอบสนองคุณสมบัติเหล่านี้ดังนั้นคุณต้องตรวจสอบว่าคุณมีด้านเท่ากัน - ความกว้างนั้นเท่ากับความสูง นั่นคือสมการที่สาม
วิธีแก้ปัญหาคล้ายกับสื่อการคิด
ขั้นแรก:
x = (A+B+C+D)/4
f=0
if(dist(x,A) == dist(x,B) == dist(x,C) == dist(x,D)
f=1
else
f=0
คุณสมบัตินี้ตามด้วยสี่เหลี่ยมจัตุรัสเนื่องจากเป็นวงกลม ตอนนี้เป็นวงกลมเพื่อติดตามคุณสมบัตินี้ ดังนั้นตอนนี้เพียงตรวจสอบ
if(A.B==B.C==C.D==D.A==0)
f=1
else
f=0
if (f==1)
square
else
not square
ที่นี่ AB หมายถึงดอทโปรดัคของ A และ B