4 puanın bir kare oluşturup oluşturmadığı nasıl kontrol edilir?


36

Birbirlerinden farklı olan 4 noktaya (2 boyutlu) sahip olduğumu ve bir kare oluşturup oluşturmadıklarını bilmek istiyorum. Nasıl yapılır? (işlemin mümkün olduğunca basit olmasına izin verin.)


3
Döndürülmüş kareleri hesaba katmanız gerekebilir mi?
Martijn Pieters

Puanların sırası hakkında bilginiz var mı? Yani iki noktanın bitişik olup olmadığını ya da köşegen oluşturduğunu söyleyebilir misiniz? (Bu bilgi süreci kolaylaştırmak için kullanılabilir)
Daniel B

1
@DanielB Başka bilgi yok. Tıpkı beyaz bir kağıdım ve rastgele 4 puan çizdiğim gibi. Sonra onların bir kare oluşturup oluşturmadıklarını bilmek istiyorum.
MareşalSHI

5
Özellikle noktalar kayan nokta sayıları olarak temsil edilirse, aşağıda önerilen karşılaştırmaların herhangi birine bir "tolerans" duygusu dahil etmek yararlıdır. Kesin eşitlik kontrolleri, kayan nokta işlemlerinin sonuçları için başarısız olabilir, biz insanlar onları "yeterince yakın" olarak görse bile.
Stephan A. Terre

Bu bir ev ödevi sorusu gibi kokuyor. Bunda yanlış olan bir şey yok. : / whathaveyoutried.com
Jim G.

Yanıtlar:


64

Karenizin, sahip olduğunuz sistemi koordine eden herhangi bir şeye karşı döndürülebileceğini varsayarsak, dört noktanızda X ve Y değerlerinin tekrarı olduğuna güvenemezsiniz.

Yapabileceğiniz şey, dört noktanın her biri arasındaki mesafeleri hesaplamak. Aşağıdakileri doğru bulursanız, bir kare var:

  1. Mesafe olan iki noktası, A ve C demek var X birbirlerinden ve diğer iki noktası, aynı zamanda mesafe vardır B ve D'ye x birbirinden.

  2. Her {A, B, C, D} noktası, x olmayan iki noktadan eşit bir mesafedir . yani: Eğer A, C'den x uzakta ise, o zaman hem B hem de D'den z olacaktır .

Bu arada, z mesafesi SQRT (( x ^ 2) / 2) olmalıdır, ancak bunu onaylamanız gerekmez. Koşullar 1 ve 2 doğruysa, o zaman bir kare var. NOT: Bazı insanlar karekök verimsizliğinden endişe duyuyorlar. Bu hesaplamayı yapman gerektiğini söylemedim, sadece yaptıysan tahmin edilebilir bir sonuç alacağını söylemiştim!

Kare Kurallarının Gösterimi

Yapmanız gereken asgari çalışma, bir nokta seçmek, A demek ve diğer üç noktaya olan mesafeyi hesaplamak olacaktır. Eğer A'nın bir noktadan x ve diğer iki noktadan z olduğunu tespit ederseniz, o zaman diğer iki noktayı birbirine karşı kontrol etmeniz gerekir. Onlar da birbirlerinden x ise , o zaman bir kare var. yani:

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

AB = AD’den beri BD’yi kontrol edin:

  • BD = x

Sadece emin olmak için diğer tarafları da kontrol etmeniz gerekiyor: BC ve CD.

  • BC = z
  • CD = z

AC = BD ve AB = AD = BC = CD olduğundan, bu nedenle bu bir karedir.

Yol boyunca, ikiden fazla farklı kenar mesafesi bulursanız, rakam bir kare olamaz, böylece bakmayı durdurabilirsiniz.


Çalışma Örneği Uygulaması

Jsfiddle'da çalışan bir örnek yarattım ( buraya bakın ). Algoritma açıklamamda, A, B, C ve D gibi rasgele noktalar kullanıyorum. Bu rasgele noktalar, örneğin içinden geçmek adına belirli bir sırada bulunuyor. Algoritma noktaları, farklı bir sırada olan ancak, olsa bile çalışır örneği bu noktalar farklı bir sırada ise mutlaka çalışmaz.


Teşekkürler: meshuai, Blrfl, MSalters ve Bart van Ingen Schenau bu cevabı geliştirmek için faydalı yorumlar için.


17
Bu işlemi kısa devre yapabilir ve aralarındaki mesafeyi ölçerek ve bulduğunuz benzersiz mesafelerin sayısını takip ederek noktaların nasıl sıralanacağı konusunda endişelenmeyebilirsiniz. İkiyi geçtiğinizde (Joel'in x ve z ), rakam bir kare değildir.
Blrfl

1
Çıplak Min, işe yaradığını sanmıyorum. Sonunda “hangisi, BC veya CD olduğu önemli değil” diyorsunuz. Ama onlardan birini kontrol edersem, rakam belki de bir Paralelkenar.
MareşalSHI

2
Diğer bir optimizasyon, mesafeler yerine kare mesafeleri karşılaştırmak olacaktır.
vaughandroid

3
@ Blrfl: Testiniz çalışmıyor. ABCD'nin AB = BC = CD = DA = 1, AC = 1 de (kısa diyagonal), sonra da AD ~ 1.7 (uzun diyagonal) olan bir elmas olmasına izin verin / x Sadece iki uzunluğunuz var, ancak şekil kare değil .
MSalters

2
@JoelBrown: AC = BD = x, AB = BC = AD = z ve son taraf CD = y! = Z.
Bart van Ingen Schenau

23

Dört noktadan üçünü seçin.

Noktalar arasındaki üç vektörden birinin 90 derece döndürülerek diğerine eşit olup olmadığını kontrol ederek bir doğru ikizkenar üçgen olup olmadığını anlayın.

Eğer öyleyse, dördüncü noktayı vektör toplama ile hesaplayın ve verilen dördüncü nokta ile karşılaştırın.

Bunun pahalı karekök gerektirmediğine dikkat edin, çarpım bile değil.


İki iyi cevaptan biri. Çok sqrtönemli olmadıkça kullanmayın ! Tamsayılı hesaplamaları FP'ye indirmenize gerek yok ... FP hesaplamasının kesinliğini daha da kötüleştirmekten bahsetmeyin.
K.Steff,

Teşekkürler. iyiydi.
MareşalSHI

Şimdi bunu yapmanın doğru yolu. Çarpma gerçekten burada gerekli değildir.
GELMEKTEDİR

2 vektörün çarpım içeren nokta ürünleri olmadan birbirlerine dik olup olmadığını nasıl bulursunuz?
Pavan Manjunath

Dik açıyla döndürülen (x, y), sırasıyla pozitif mi yoksa negatif yönde mi döndüğünüze bağlı olarak (-y, x) veya (y, -x) 'dir.
starblue

15

Bence en kolay çözüm şudur:

  • İlk önce, 4 noktanın merkezini hesaplayın: center = (A + B + C + D)/4

  • Sonra vektörü hesapla A - center. Bu olsunv := (x,y)

  • v2Vektör v90 derece döndürülmüş olsun :v2 := (-y, x)

  • Şimdi diğer noktalar olmalıdır center - v, center + v2ve center - v2.

Bu çözümün avantajı, hiç kare kök kullanmanıza gerek kalmamasıdır.


2
Evet. Bu en anlaşılır ve muhtemelen uygulanması en kolay olanıdır.
Eric G

Segmentlerin vektör eşitliği gibi görünüyor. Birisi lütfen neden işe yarayıp yaramadığını ispatlayabilir mi?
vCillusion

Özellikle (0,0), (2,1), (3, -1), (1, -2) - kareye eksene hizalanmamış kare için başarısız olur
vCillusion

1
Bu durum için çalışıyor. Merkez noktası (1.5, -0.5), birinci nokta (0, 0) ve diğer üç nokta (1.5, -0.5) + (1.5, -0.5) = (3, -1); (1.5, -0.5) + (0.5, 1.5) = (2, 1) ve (1.5, -0.5) - (0.5, 1.5) = (1, -2) bir kare olduğu anlamına gelir. Kanıt .. simetridir?
aragaer

5

Üzgünüm ama bazı cevaplar geçerli değil.

Bu durumda, ikisi aynı boyutta (diyelim ki AC ve AD diyelim) ve biri daha büyükse (AB diyelim) bulmak için 3 kenarı ölçelim (AB, AC ve AD diyelim). Sonra aynı boyutta AB olup olmadığını görmek için CD'yi ölçersiniz ve öyle olduğunu görürsünüz. Kare yerine, aşağıdaki resme sahip olabilirsiniz ve bu yanlış bir çözümdür.

Kare değil ...

Daha sonra başka bir çözüm deneyin: tüm mesafeleri en az bir kere ölçün: AB, AC, AD, BC, BD, CD. O zaman, o zaman 4 tanesinin eşit olduğunu, diğer 2 tanesinin de kendi aralarında eşit olduğunu görüyorsunuz. Ancak aşağıdaki gibi bir fotoğrafınız olabilir:

Ve o da bir kare değil ...

Dolayısıyla, alınan cevapların yüksek olmasına rağmen, bu cevaplar doğru değil.

Bir olası çözüm: eğer iki eşit önlem aynı noktayı birleştirmiyorsa. Öyleyse: AB ve CD aynı uzunluktaysa, diğer tüm kombinasyonlar (AC, AD, BC, BD) de eşittir, bir kareniz var. En büyük uzunluğu yapan aynı noktaya sahipseniz (AB ve AC en büyüğüdür ve diğerleri eşittir), yukarıdaki resimlerden birine sahipsiniz.


hayır, algoritması x'in 2 kenarının bir noktayı paylaşmadığını söyledi. fakat siz sadece C paylaşıyorsunuz. Öyleyse, AC'nin x olduğunu varsayalım, o zaman BD, BC'niz yerine başka bir x olmalıdır.
MareşalSHI

3

Dört noktanın a, b, c, d vektörlerini koordine etmesine izin verin.

Öyleyse aralarındaki farklılıkları arayalım w = (ad), x = (ba), y = (cb), z = (dc).

Sonra w, bir dikine göre 90 derecelik bir döndürmeyle w oluşturabilirsiniz. Matematiksel olarak 2-uzayda 90-derece-dönme matrisi ((0, -1), (1, 0)). Böylece, w'nin 90 derece döndürülmüş olması koşulu, sonuçta

(w_1 == -x_2 ve w_2 == x_1)

Bu durumda, o zaman w == -y ve x == -z, veya

((w_1 == -y_1 ve w_2 == -y_2) ve (x_1 == -z_1 ve x_2 == -z_2))

Bu üç ilişki devam ederse, a, b, c, d odaklı bir kare yapar.


1
Bence dikdörtgen sizin koşullarınızı da karşılayabilir.
MareşalSHI

Hayır, ilk koşul ortogonal tarafından karşılanmadı, fakat eşit derecede eğik vektörler değil.
Mark Salzer

1
evet, sadece birincisini özledim. Ancak 4 puan sipariş edilmedi. Dolayısıyla, onaylamak için daha fazla adıma ihtiyacımız var.
MareşalSHI

Evet ... eğer daha akıllıca bir fikir ortaya çıkmazsa, döngüde bulunması gereken bir kişi. Sanırım, her olası a, b, c, d sırasından w, x, y, z 'yi hesaplamak için bir dış döngü ve w, x, y, z bağının her olası sıralaması için bir iç döngü gerekli olduğunu düşünüyorum.
Mark Salzer

2

Starblue tarafından cevap benzer

Dört noktadan üçünü seçin.

Aralarında dik açılı bir köşe arayın : Üç vektörden herhangi birinin nokta ürününün sıfır olup olmadığını kontrol ederek. Bulunamadıysa, bir kare değil.

Bu açıya bitişik köşelerin de dik açılı olup olmadığını kontrol edin. Değilse, bir kare değil.

Köşegenlerin dik olup olmadığını kontrol edin : Vektörlerin birinci ve dördüncü tepe noktası ile diğer iki köşe (köşegen) arasındaki nokta ürünü sıfır ise, o zaman bir kare.


İyi fikir, ancak 4. tepe noktasının diğer noktalardan doğru mesafede olup olmadığını kontrol etmeniz gerekiyor. Sadece köşegen olup olmadığını kontrol edin.
starblue

@starblue Sağ! Aksi takdirde bir uçurtma oluşturabilir. Güncellenmiş.
Max

2

görüntü tanımını buraya girin

Burada bazı iyi cevaplar var, fakat soru en basit yaklaşımı istedi. Buna hızlıca bir düşünce verdim ve bunu nasıl yapacağım.

Dört noktanın bir kareyi temsil edip etmediğini (döndürülmüş olsa bile) söyleyebilirsiniz, ancak dört noktanın ortalamasını bulabilirsiniz.

R = (A+B+C+D)/4

Ortalamaya sahip olduğunuzda, her nokta ile ortalama arasındaki mesafe, dört noktanın tümü için aynı olmalıdır.

if(dist(R,A) == dist(R,B) == dist(R,C) == dist(R,D) then
   print "Is Square"
else
   print "Is Not Square"

DÜZENLE:

Benim hatam. Bu, yalnızca form noktaları bir dairede olsaydı size söylerdi. Ayrıca noktalar arasındaki mesafeyi de kontrol ederseniz, o zaman bir kare olmalıdır.

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"

Bu, A, B, C, D noktalarının (geçerli bir sarma düzeninde olduğu gibi) geçmediğini varsayar.


1

bu, belirlenen standartlara göre bir cevap değil, ancak bunun yardımcı olacağını umuyorum:

[Aşağıdaki bağlantıdan kopyalandı, bu yüzden bağlantıyı açmak zorunda değilsiniz] Python 76 karakter

def S(A):c=sum(A)/4.0;return set(A)==set((A[0]-c)*1j**i+c for i in range(4))

S işlevi girişi (A) olarak karmaşık sayıların bir listesini alır. Hem karenin merkezini hem de bir köşesini biliyorsak, köşeyi merkez noktasının (c) etrafında 90, 180 ve 270 derece döndürerek kareyi yeniden yapılandırabiliriz. Kompleks düzlemde başlangıç ​​noktası 90 derece döndürülerek nokta i ile çarpılarak yapılır. Orijinal şeklimiz ve yeniden oluşturulmuş karemiz aynı noktalara sahipse, o zaman bir kare olmalı.

Bu, şunlardan alınmıştır: 4 puanın bir kare oluşturduğunu belirleyin.

Cevabı beğenirseniz, kişiye teşekkür etmek için biraz zaman ayırın veya cevabını o sayfada oylayın.


1
Algoritmayı burada özetleyebilirsiniz. Başka bir siteye link vermekten biraz daha iyi olan başka bir SE sitesine bağlanıyorsunuz, ancak cevabın sorulan yerin bu sayfada olmasını istiyoruz . Şimdi insanlar cevabın ne olabileceğini öğrenmek için tekrar tıklamak zorunda.
Martijn Pieters

1

Bunu basit toplama ve çıkarma ve min / maks bulma ile yapabileceğinizi düşünüyorum. Terimler (diğer kişilerin şemasına uygun):

  • Y değerinin en yüksek olduğu nokta => A
  • en yüksek x => B
  • en düşük y => C
  • en düşük x => D

Eğer 4 puan sadece 2 x ve 2 y değerlerini paylaşıyorsa, bir kare karedir.

Aksi halde puanlarınız aşağıdakileri karşılarsa bir kareniz vardır:

  • Ax + Cx = Bx + Dx
  • Ay + Cy = By + Dy
  • Ay - Cy = Bx - Dx

Açıklama: AC ve BD çizgi segmentleri orta noktalarında buluşmalıdır. Böylece (Ax + Cx) / 2, AC'nin orta noktası ve (Bx + Dx) / 2, BD'nin orta noktasıdır. İlk denklemimi almak için bu denklemin her tarafını 2 ile çarpın. İkinci denklem, Y değerleri için aynı şeydir. Elmas şekiller (eşkenar dörtgenler) bu özellikleri karşılayacaktır, bu nedenle eşit kenarlara sahip olduğunuzu kontrol etmeniz gerekir - genişliğin yükseklikle aynı olup olmadığını kontrol etmeniz gerekir. Bu üçüncü denklem.


-3

Çözüm, düşünme ortamına benzer.

İlk adım:

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

Bu özelliği döngüsel olduğu için kare izler. Şimdi bu özelliği takip etmek için bir daire. yani, şimdi kontrol et

if(A.B==B.C==C.D==D.A==0)
  f=1
else 
  f=0

if (f==1)
  square
else 
  not square

Burada AB, A ve B'nin nokta çarpımı anlamına gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.