จะตรวจสอบว่า 4 คะแนนเป็นสี่เหลี่ยมได้อย่างไร?


36

สมมติว่าฉันมี 4 คะแนน (เป็น 2 มิติ) ซึ่งแตกต่างจากกันและฉันต้องการทราบว่าพวกเขาเป็นรูปสี่เหลี่ยมจัตุรัสหรือไม่ ทำอย่างไร? (ให้กระบวนการง่ายที่สุดเท่าที่จะทำได้)


3
ฉันคิดว่าคุณจำเป็นต้องคำนึงถึงสี่เหลี่ยมหมุน
Martijn Pieters

คุณมีข้อมูลเกี่ยวกับลำดับของคะแนนทั้งหมดหรือไม่? คือคุณบอกได้ไหมว่าจุดสองจุดติดกันหรือก่อตัวเป็นแนวทแยง (ข้อมูลนี้สามารถใช้เพื่อลดความซับซ้อนของกระบวนการ)
Daniel B

1
@DanielB ไม่มีข้อมูลอื่น ๆ มันเหมือนกับว่าฉันมีกระดาษสีขาวและวาด 4 คะแนนแบบสุ่ม จากนั้นฉันอยากรู้ว่าพวกมันเป็นรูปสี่เหลี่ยมจัตุรัสหรือไม่
MarshalSHI

5
โดยเฉพาะอย่างยิ่งหากคะแนนถูกแสดงเป็นตัวเลขจุดลอยตัวมันจะมีประโยชน์ที่จะรวมถึงความรู้สึกของ "ความอดทน" ในการเปรียบเทียบใด ๆ ที่แนะนำด้านล่าง การตรวจสอบความเท่าเทียมกันที่แน่นอนสามารถล้มเหลวสำหรับผลลัพธ์ของการดำเนินการจุดลอยตัวแม้เมื่อมนุษย์เราจะพิจารณาว่า
เตฟานเอ. แตร์เร

กลิ่นนี้เหมือนคำถามการบ้าน ไม่ใช่ว่ามีอะไรผิดปกติกับสิ่งนั้น : / whathaveyoutried.com
Jim G.

คำตอบ:


64

สมมติว่าสี่เหลี่ยมจัตุรัสของคุณอาจหมุนกับระบบพิกัดใดก็ตามที่คุณมีอยู่คุณไม่สามารถวางใจได้ว่าจะมีการทำซ้ำค่า X และ Y ในจุดสี่จุดของคุณ

สิ่งที่คุณสามารถทำได้คือคำนวณระยะทางระหว่างจุดสี่จุดแต่ละจุด หากคุณพบว่าสิ่งต่อไปนี้เป็นจริงคุณมีตารางดังนี้

  1. มีสองจุดคือพูด A และ C ซึ่งเป็นระยะทางxจากกันและกันและอีกสองจุดพูดว่า B และ D ซึ่งเป็นระยะทางxจากกันและกัน

  2. แต่ละจุด {A, B, C, D} เป็นระยะทางเท่ากันจากจุดสองจุดที่ไม่ได้xออกไป เช่น: ถ้าเป็นxห่างจาก C แล้วมันจะเป็นZห่างจากทั้ง B และ D

อนึ่งระยะทางzจะต้องเป็น SQRT (( x ^ 2) / 2) แต่คุณไม่จำเป็นต้องยืนยันสิ่งนี้ หากเงื่อนไขที่ 1 และ 2 เป็นจริงคุณจะมีกำลังสอง หมายเหตุ:บางคนมีความกังวลเกี่ยวกับความไร้ประสิทธิภาพของรากที่สอง ฉันไม่ได้บอกว่าคุณควรทำการคำนวณนี้ฉันแค่บอกว่าถ้าคุณทำคุณจะได้ผลลัพธ์ที่คาดเดาได้!

ภาพประกอบของกฎสแควร์

งานขั้นต่ำสุดที่คุณต้องทำคือเลือกจุดพูด A และคำนวณระยะห่างจากจุดสามจุดอื่น ๆ หากคุณพบว่า A คือxจากจุดหนึ่งและzจากอีกสองจุดคุณจะต้องตรวจสอบจุดสองจุดต่อกัน หากพวกเขาเป็นxจากกันและกันคุณก็จะได้สี่เหลี่ยม เช่น:

  • AB = z
  • AC = x
  • AD = z

ตั้งแต่ AB = AD ให้ตรวจสอบ BD:

  • BD = x

เพียงเพื่อให้แน่ใจว่าคุณจะต้องตรวจสอบด้านอื่น ๆ : BC และ CD

  • BC = z
  • CD = z

เนื่องจาก AC = BD และตั้งแต่ AB = AD = BC = CD นี่จึงเป็นรูปสี่เหลี่ยมจัตุรัส

ตลอดทางหากคุณพบว่ามีระยะห่างจากขอบที่แตกต่างกันมากกว่าสองระยะภาพจะไม่สามารถเป็นรูปสี่เหลี่ยมได้ดังนั้นคุณสามารถหยุดมองได้


ตัวอย่างการใช้งานจริง

ฉันได้สร้างตัวอย่างการทำงานบน jsfiddle (ดูที่นี่ ) ในคำอธิบายอัลกอริทึมของฉันฉันใช้คะแนนตามอำเภอใจ A, B, C และ D จุดใด ๆ ที่เกิดขึ้นนั้นอยู่ในลำดับที่แน่นอนเพื่อประโยชน์ในการเดินผ่านตัวอย่าง ขั้นตอนวิธีการทำงานแม้ว่าคะแนนอยู่ในลำดับที่แตกต่างอย่างไรตัวอย่างเช่นไม่จำเป็นต้องทำงานถ้าจุดเหล่านั้นอยู่ในลำดับที่แตกต่าง


ขอบคุณ: meshuai, Blrfl, MSalters และ Bart van Ingen Schenau สำหรับความคิดเห็นที่เป็นประโยชน์เพื่อปรับปรุงคำตอบนี้


17
คุณสามารถลัดวงจรกระบวนการนี้และไม่ต้องกังวลกับวิธีการสั่งซื้อคะแนนโดยการวัดระยะทางระหว่างพวกเขาและติดตามจำนวนระยะทางที่ไม่ซ้ำกันที่คุณพบ เมื่อคุณเกินสอง (Joel's xและz ) ตัวเลขจะไม่เป็นรูปสี่เหลี่ยมจัตุรัส
Blrfl

1
นาทีเปลือยฉันไม่คิดว่ามันทำงานได้ ในที่สุดคุณพูดว่า "ไม่สำคัญว่าจะเลือก BC หรือ CD แบบใด" แต่ถ้าฉันตรวจสอบหนึ่งในนั้นอาจเป็นรูปสี่เหลี่ยมด้านขนานพิเศษ
MarshalSHI

2
การปรับให้เหมาะสมอีกประการหนึ่งคือการเปรียบเทียบระยะทางกำลังสองแทนที่จะเป็นระยะทาง
vaughandroid

3
@Blrfl: การทดสอบของคุณไม่ทำงาน ให้ ABCD เป็นเพชรที่มี AB = BC = CD = DA = 1, AC = 1 ด้วย (เส้นทแยงมุมสั้น) จากนั้น AD ~ 1.7 (เส้นทแยงมุมยาว) / คุณมีความยาวเพียงสองตัวคือ x และ z แต่รูปร่างไม่ได้เป็นรูปสี่เหลี่ยมจัตุรัส .
MSalters

2
@JoelBrown: มันเป็นไปได้ที่จะสร้างรูปทรงสี่เหลี่ยมคางหมูที่มีเส้นทแยงมุม AC = BD = x, ด้าน AB = BC = AD = z และซีดีด้านสุดท้าย = y! = z
Bart van Ingen Schenau

23

เลือกสามในสี่คะแนน

ลองหาว่ามันคือสามเหลี่ยมหน้าจั่วใช่ไหมโดยตรวจสอบว่าหนึ่งในสามเวกเตอร์ระหว่างจุดเท่ากับอีกอันหนึ่งที่หมุนด้วย 90 องศา

ถ้าเป็นเช่นนั้นให้คำนวณจุดที่สี่ด้วยการเพิ่มเวกเตอร์และเปรียบเทียบกับจุดที่สี่ที่กำหนด

โปรดทราบว่าสิ่งนี้ไม่จำเป็นต้องใช้รากที่สองที่มีราคาแพงไม่ใช่แม้แต่การคูณ


หนึ่งในสองคำตอบที่ดี อย่าใช้sqrtนอกเสียจากว่าจะสำคัญ! คุณไม่จำเป็นต้องลดการคำนวณจำนวนเต็มเป็น FP ... ไม่ต้องพูดถึงความแม่นยำของการคำนวณ FP ยิ่งแย่ลง
K.Steff

ขอบคุณ. ที่ดีอย่างหนึ่ง
MarshalSHI

ตอนนี้เป็นวิธีที่ถูกต้องที่จะทำ การคูณไม่จำเป็นที่นี่แน่นอน
จาก

คุณจะพบได้อย่างไรว่า 2 เวกเตอร์ตั้งฉากกับแต่ละอื่น ๆ โดยไม่ต้องมีจุดของผลิตภัณฑ์ที่เกี่ยวข้องกับการคูณ?
Pavan Manjunath

(x, y) ที่หมุนด้วยมุมฉากคือ (-y, x) หรือ (y, -x) ขึ้นอยู่กับว่าคุณหมุนในทิศทางบวกหรือลบตามลำดับ
starblue

15

ฉันคิดว่าวิธีที่ง่ายที่สุดคือ:

  • ขั้นแรกให้คำนวณจุดศูนย์กลางของ 4 คะแนน: center = (A + B + C + D)/4

  • A - centerแล้วคำนวณเวกเตอร์ ปล่อยให้เรื่องนี้เป็นv := (x,y)

  • อนุญาตv2เป็นเวกเตอร์vหมุน 90 องศา:v2 := (-y, x)

  • ตอนนี้จุดอื่น ๆ ที่ควรจะเป็นcenter - v, และcenter + v2center - v2

ข้อดีของการแก้ปัญหานี้คือคุณไม่ต้องใช้รากที่สองเลย


2
ใช่. นี่เป็นวิธีที่เข้าใจได้ง่ายและง่ายที่สุดในการนำมาใช้เช่นกัน
Eric G

ดูเหมือนความเท่าเทียมกันของเวกเตอร์ของส่วนต่างๆ ทุกคนได้โปรดอธิบายเพิ่มเติมหรือพิสูจน์ว่าทำไมมันจึงใช้งานได้
vCillusion

มันล้มเหลวเป็นพิเศษสำหรับกรณี (0,0), (2,1), (3, -1), (1, -2) - สี่เหลี่ยมไม่ตรงกับแกน
vCillusion

1
มันใช้งานได้สำหรับกรณีนี้ จุดกึ่งกลางคือ (1.5, -0.5), จุดแรกคือ (0, 0) และอีกสามจุดคือ (1.5, -0.5) + (1.5, -0.5) = (3, -1); (1.5, -0.5) + (0.5, 1.5) = (2, 1) และ (1.5, -0.5) - (0.5, 1.5) = (1, -2) ซึ่งหมายความว่ามันเป็นรูปสี่เหลี่ยมจัตุรัส หลักฐานคือ .. สมมาตรเหรอ?
aragaer

5

ฉันขอโทษ แต่คำตอบบางอย่างใช้ไม่ได้

สำหรับกรณีที่คุณวัดขนาด 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 เป็นจุดที่ใหญ่ที่สุดและสิ่งอื่น ๆ ที่เท่ากัน) คุณมีหนึ่งในภาพด้านบน


ไม่อัลกอริธึมของเขากล่าวว่าระยะทาง 2 ขอบ x ไม่แบ่งปันจุด แต่คุณเพิ่งแชร์ C ดังนั้นสมมติว่า AC คือ x ดังนั้น BD ควรเป็นอีก x แทนที่จะเป็น BC ของคุณ
MarshalSHI

3

ให้ทั้งสี่จุดประสานเวกเตอร์ 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 ให้สร้างจตุรัสที่มุ่งเน้น


1
ฉันคิดว่าสี่เหลี่ยมผืนผ้าสามารถสนองเงื่อนไขของคุณได้เช่นกัน
MarshalSHI

ไม่, เงื่อนไขแรกไม่พบโดย orthogonal, แต่ไม่ใช่เวกเตอร์ที่มีความยาวเท่ากัน
Mark Salzer

1
ใช่ฉันเพิ่งพลาดคนแรก แต่ไม่ได้สั่ง 4 คะแนน ดังนั้นเราต้องการขั้นตอนเพิ่มเติมฉันคิดว่าเพื่อยืนยัน
MarshalSHI

ใช่ ... หากไม่มีแนวคิดที่ฉลาดเกิดขึ้นสิ่งหนึ่งที่จำเป็นต้องวนซ้ำ ฉันคิดว่าเราต้องการวงนอกเพื่อคำนวณ w, x, y, z จากการเรียงลำดับที่เป็นไปได้ของ a, b, c, d และหนึ่งวงในสำหรับการเรียงลำดับที่เป็นไปได้ของ w, x, y, z tuple
Mark Salzer

2

คล้ายกับคำตอบโดยstarblue

เลือกสามในสี่คะแนน

มองหาจุดยอดมุมฉากในหมู่พวกมันโดยตรวจสอบว่าผลคูณของจุดของสองเวกเตอร์สามตัวนั้นเป็นศูนย์หรือไม่ หากไม่พบไม่ใช่สแควร์

ตรวจสอบว่าจุดยอดที่อยู่ติดกับมุมนี้มีมุมฉากด้วยหรือไม่ ถ้าไม่ได้ไม่ใช่รูปสี่เหลี่ยมจัตุรัส

ตรวจสอบว่าเส้นทแยงมุมตั้งฉากกันหรือไม่: หากผลคูณของจุดของเวกเตอร์ระหว่างจุดยอดที่หนึ่งและสี่และจุดยอดสองจุด (เส้นทแยงมุม) อีกศูนย์เป็นศูนย์หรือไม่


เป็นความคิดที่ดี แต่คุณยังต้องตรวจสอบว่าจุดสุดยอดที่ 4 อยู่ในระยะที่ถูกต้องจากจุดอื่น ๆ คุณตรวจสอบว่ามันอยู่ในแนวทแยง
starblue

@ starblue ใช่แล้ว! ไม่อย่างนั้นมันจะกลายเป็นว่าว Updated
สูงสุด

2

ป้อนคำอธิบายรูปภาพที่นี่

มีคำตอบที่ดีที่นี่ แต่คำถามถามหาวิธีที่ง่ายที่สุด ฉันคิดอย่างรวดเร็วและนี่เป็นวิธีที่ฉันจะทำ

คุณสามารถบอกได้ว่าจุดสี่จุดแสดงถึงรูปสี่เหลี่ยม (แม้ว่าจะหมุน) แต่การหาค่าเฉลี่ยของจุดทั้งสี่นั้น

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 ไม่ข้าม (เช่นเดียวกับลำดับการไขลานที่ถูกต้อง)


1

นี่ไม่ใช่คำตอบตามมาตรฐานที่ตั้งไว้ แต่ฉันหวังว่าสิ่งนี้จะช่วยได้:

[คัดลอกมาจากลิงก์ด้านล่างเพื่อให้คุณไม่ต้องเปิดลิงก์] 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 คะแนนจากรูปสี่เหลี่ยมหรือไม่

ถ้าคุณชอบคำตอบฉันพูดว่าใช้เวลาสักครู่เพื่อขอบคุณบุคคลนั้นหรือโหวตคำตอบของเขาในหน้านั้น


1
คุณสามารถสรุปอัลกอริทึมได้ที่นี่ คุณกำลังเชื่อมโยงไปยังไซต์ SE อื่นซึ่งดีกว่าการชี้ไปที่ไซต์อื่นเล็กน้อย แต่เราต้องการคำตอบให้อยู่ในหน้านี้ซึ่งเป็นคำถามที่ถูกถาม ตอนนี้ผู้คนต้องคลิกอีกครั้งเพื่อเรียนรู้สิ่งที่อาจเป็นคำตอบ
Martijn Pieters

1

ฉันคิดว่าคุณสามารถทำได้ด้วยการบวกและการลบอย่างง่ายและการค้นหาขั้นต่ำ / สูงสุด ข้อกำหนด (ตรงกับแผนภาพของคนอื่น):

  • ชี้ด้วยค่า y สูงสุด => A
  • สูงสุด x => B
  • ต่ำสุด y => C
  • ต่ำสุด x => D

หาก 4 คะแนนใช้ร่วมกันเฉพาะค่า 2 x และค่า 2y เท่านั้นคุณจะได้ค่าสี่เหลี่ยมจัตุรัส

มิฉะนั้นคุณจะมีสี่เหลี่ยมจัตุรัสหากคะแนนของคุณเป็นไปตาม:

  • Ax + Cx = Bx + Dx
  • Ay + Cy = โดย + Dy
  • Ay - Cy = Bx - Dx

คำอธิบาย: ส่วนของเส้นตรง AC และ BD ควรตรงตามจุดกึ่งกลาง ดังนั้น (Ax + Cx) / 2 คือจุดกึ่งกลางของ AC และ (Bx + Dx) / 2 คือจุดกึ่งกลางของ BD คูณแต่ละข้างของสมการนี้ด้วย 2 เพื่อให้ได้สมการแรกของฉัน สมการที่สองนั้นเหมือนกันสำหรับค่า Y รูปทรงเพชร (rhomboids) จะตอบสนองคุณสมบัติเหล่านี้ดังนั้นคุณต้องตรวจสอบว่าคุณมีด้านเท่ากัน - ความกว้างนั้นเท่ากับความสูง นั่นคือสมการที่สาม


-3

วิธีแก้ปัญหาคล้ายกับสื่อการคิด

ขั้นแรก:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.