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.)
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.)
Yanıtlar:
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:
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.
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!
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 = AD’den beri BD’yi kontrol edin:
Sadece emin olmak için diğer tarafları da kontrol etmeniz gerekiyor: BC ve CD.
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.
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.
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.
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)
v2
Vektör v
90 derece döndürülmüş olsun :v2 := (-y, x)
Şimdi diğer noktalar olmalıdır center - v
, center + v2
ve center - v2
.
Bu çözümün avantajı, hiç kare kök kullanmanıza gerek kalmamasıdır.
Ü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.
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:
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.
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.
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.
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.
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.
Bunu basit toplama ve çıkarma ve min / maks bulma ile yapabileceğinizi düşünüyorum. Terimler (diğer kişilerin şemasına uygun):
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:
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.
Çö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.