मान लें कि मेरे 4 अंक हैं (वे 2-आयाम हैं), जो एक दूसरे से अलग हैं, और मैं जानना चाहता हूं कि क्या वे एक वर्ग बनाते हैं। यह कैसे करना है? (प्रक्रिया को यथासंभव सरल होने दें।)
मान लें कि मेरे 4 अंक हैं (वे 2-आयाम हैं), जो एक दूसरे से अलग हैं, और मैं जानना चाहता हूं कि क्या वे एक वर्ग बनाते हैं। यह कैसे करना है? (प्रक्रिया को यथासंभव सरल होने दें।)
जवाबों:
यह मानते हुए कि आपके पास जो भी निर्देशांक प्रणाली है, उसके विरुद्ध आपका वर्ग घुमाया जा सकता है, आप अपने चार बिंदुओं में X और Y मानों की पुनरावृत्ति होने पर भरोसा नहीं कर सकते।
आप क्या कर सकते हैं चार अंकों में से प्रत्येक के बीच की दूरी की गणना करें। यदि आपको निम्नलिखित सही लगता है, तो आपके पास एक वर्ग है:
A और C, दो बिंदु हैं, जो दूरी पर हैं एक दूसरे से x , और दो अन्य बिंदु हैं, B और D कहते हैं जो एक दूसरे से दूरी x भी हैं ।
प्रत्येक बिंदु {ए, बी, सी, डी} दो बिंदुओं से एक समान दूरी है जो x दूर नहीं हैं । अर्थात: यदि A x है सी से दूर है, तो यह हो जाएगा जेड दोनों बी और डी से दूर
संयोग से, दूरी z को SQRT (( x ^ 2) / 2) होना चाहिए, लेकिन आपको इसकी पुष्टि करने की आवश्यकता नहीं है। यदि परिस्थितियां 1 और 2 सत्य हैं तो आपके पास एक वर्ग है। नोट: कुछ लोग वर्गमूल की अक्षमता के बारे में चिंतित हैं। मैंने ऐसा नहीं कहा यह गणना करनी चाहिए , मैंने सिर्फ इतना कहा कि अगर आपने किया तो आपको एक पूर्वानुमानित परिणाम मिलेगा!
काम के नंगे न्यूनतम जो आपको करने की आवश्यकता होगी वह एक बिंदु चुनने के लिए होगा, ए कहें और अन्य तीन बिंदुओं में से प्रत्येक के लिए दूरी की गणना करें। यदि आप पा सकते हैं कि A एक बिंदु और z से x है दो अन्य बिंदुओं से है, तो आपको बस उन दो अन्य बिंदुओं को एक दूसरे के खिलाफ जांचने की आवश्यकता है। यदि वे एक दूसरे से x भी हैं तो आपके पास एक वर्ग है। अर्थात:
AB = AD के बाद से, BD जांचें:
बस सुनिश्चित करने के लिए, आपको अन्य पक्षों की जांच करने की आवश्यकता है: बीसी और सीडी।
चूंकि AC = BD और चूंकि AB = AD = BC = CD है, इसलिए यह एक वर्ग है।
रास्ते में, यदि आपको दो से अधिक अलग-अलग किनारे मिलते हैं, तो आकृति चौकोर नहीं हो सकती है, इसलिए आप देखना बंद कर सकते हैं।
कार्य उदाहरण कार्यान्वयन
मैंने jsfiddle ( यहां देखें ) पर एक काम करने का उदाहरण बनाया है । एल्गोरिथ्म की मेरी व्याख्या में, मैं ए, बी, सी और डी का उपयोग करता हूं। वे मनमाने अंक उदाहरण के माध्यम से चलने के लिए एक निश्चित क्रम में होते हैं। एल्गोरिथ्म अंक, एक अलग क्रम में हैं फिर भी, यहां तक कि अगर काम करता है उदाहरण जरूरी उन बिंदुओं एक अलग क्रम में हैं, तो काम नहीं करता।
धन्यवाद: इस जवाब को बेहतर बनाने के लिए उपयोगी टिप्पणियों के लिए मेशुई, ब्लरफ्ल, एमएसलेटर्स और बार्ट वैन इनगेन शेनौ।
चार में से तीन अंक उठाओ।
अगर अंक के बीच तीन वैक्टरों में से एक 90 डिग्री से घुमाए गए एक के बराबर है, तो यह जांच कर कि क्या यह सही समद्विबाहु त्रिभुज है।
यदि हां, तो वेक्टर के अलावा चौथे बिंदु की गणना करें और दिए गए चौथे बिंदु से तुलना करें।
ध्यान दें कि इसके लिए महंगी वर्ग जड़ों की आवश्यकता नहीं है, गुणा भी नहीं।
sqrt
जब तक महत्वपूर्ण उपयोग न करें ! आपको पूर्णांक गणनाओं को एफपी से नीचा दिखाने की जरूरत नहीं है ... एफपी गणना की सटीकता को खराब करने के लिए नहीं।
मुझे लगता है कि सबसे आसान समाधान निम्नलिखित है:
सबसे पहले, 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, AC, AD, BC, BD, CD। तब आप पाते हैं कि 4 तो बराबर हैं, और अन्य 2 भी आपस में बराबर हैं। लेकिन आपके पास नीचे की तरह एक तस्वीर हो सकती है:
इसलिए, वे उत्तर सही नहीं हैं, जो उन्हें प्राप्त उच्च उठाव के बावजूद हैं।
एक संभव समाधान: यदि दो समान उपाय समान बिंदु को नहीं जोड़ते हैं। तो: यदि AB और CD समान हैं, तो अन्य सभी संयोजन (AC, AD, BC, BD) भी समान हैं, आपके पास एक वर्ग है। यदि आपके पास एक ही बिंदु है जो सबसे बड़ी लंबाई बना रहा है (एबी और एसी सबसे बड़ा है, और सभी अन्य समान हैं), आपके पास ऊपर दी गई तस्वीरों में से एक है।
बता दें कि चार बिंदुओं में वैक्टर, बी, सी, डी का समन्वय है।
फिर उनके अंतरों को w = (ad), x = (ba), y = (cb), z = (dc) कहते हैं।
यदि आप 90-डिग्री-रोटेशन से w बना सकते हैं तो w ऑर्थोगोनल है। गणितीय रूप से 2-स्पेस में 90-डिग्री-रोटेशन-मैट्रिक्स है ((0, -1), (1, 0))। इस प्रकार, शर्त यह है कि क्या डब्ल्यू 90-डिग्री-घुमाया गया है, जिसके परिणामस्वरूप
(w_1 == -x_2 और w_2 == x_1)
यदि यह धारण करता है, तो आपको उस w == -y और x == -z, या की जाँच करनी होगी
((w_1 == -y_1 और w_2 == -_2) और (x_1 == -z_1 और x_2 == -z_2)
यदि वे तीन संबंध धारण करते हैं, तो, बी, सी, डी एक उन्मुख वर्ग बनाते हैं।
स्टारब्ले द्वारा उत्तर के समान
चार में से कोई भी तीन अंक चुनें।
उनके बीच एक समकोण वर्कटेक्स की तलाश करें : यह जाँच कर कि क्या तीन वैक्टरों में से किसी दो का डॉट उत्पाद शून्य है। अगर नहीं मिला, तो वर्ग नहीं।
जांचें कि क्या इस कोण से सटे कोने सही कोण पर भी हैं। यदि नहीं, तो एक वर्ग नहीं।
जांचें कि क्या विकर्ण लंबवत हैं : यदि पहले और चौथे वर्टेक्स के बीच वैक्टर का डॉट उत्पाद और अन्य दो कोने (विकर्ण) शून्य हैं, तो इसका एक वर्ग है।
मुझे लगता है कि आप इसे सरल जोड़ और घटाव और न्यूनतम / अधिकतम ज्ञात कर सकते हैं। शर्तें (अन्य लोगों के आरेख से मेल खाती हैं):
यदि 4 अंक केवल 2 x मान और 2 y मान साझा करते हैं, तो आपके पास एक स्तर वर्ग है।
अन्यथा, आपके पास एक वर्ग है यदि आपके बिंदु निम्नलिखित को संतुष्ट करते हैं:
स्पष्टीकरण: लाइन सेगमेंट AC और BD को उनके मध्य बिंदु पर मिलना चाहिए। इस प्रकार (Ax + Cx) / 2 AC का मध्यबिंदु है और (Bx + Dx) / 2 BD का मध्यबिंदु है। मेरा पहला समीकरण पाने के लिए इस समीकरण के प्रत्येक पक्ष को 2 से गुणा करें। दूसरा समीकरण Y- मानों के लिए समान है। डायमंड-शेप्स (rhomboids) इन गुणों को संतुष्ट करेंगे, इसलिए आपको यह जांचने की आवश्यकता है कि आपके पास समान भुजाएँ हैं - कि चौड़ाई ऊँचाई के समान हो। वह तीसरा समीकरण है।
यहाँ कुछ अच्छे उत्तर हैं, लेकिन सबसे सरल दृष्टिकोण के लिए पूछा गया प्रश्न। मैंने इसे कुछ जल्दी सोचा और यह है कि मैं इसे कैसे करूंगा।
आप यह बता सकते हैं कि चार बिंदु एक वर्ग का प्रतिनिधित्व करते हैं (भले ही घुमाया गया हो), लेकिन चार बिंदुओं का औसत ज्ञात करना।
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"
यह मानता है कि ए, बी, सी, डी को पार नहीं करता है (जैसा कि एक वैध घुमावदार आदेश है)।
यह निर्धारित मानकों के अनुसार उत्तर नहीं है, लेकिन मुझे आशा है कि इससे मदद मिलेगी:
[नीचे दिए गए लिंक से कॉपी किया गया ताकि आपको लिंक खोलने की जरूरत न पड़े] पायथन 76 अक्षर
def S(A):c=sum(A)/4.0;return set(A)==set((A[0]-c)*1j**i+c for i in range(4))
फंक्शन एस अपने इनपुट (ए) के रूप में जटिल संख्याओं की एक सूची लेता है। यदि हम केंद्र के दोनों और एक वर्ग के एक कोने को जानते हैं, तो हम केंद्र बिंदु (c) के चारों ओर कोने 90,180 और 270 डिग्री को घुमाकर वर्ग का पुनर्निर्माण कर सकते हैं। उत्पत्ति के बारे में 90 डिग्री से जटिल विमान के रोटेशन पर बिंदु को i से गुणा करके किया जाता है। यदि हमारे मूल आकार और पुनर्निर्मित वर्ग में समान बिंदु हैं तो यह एक वर्ग होना चाहिए था।
इससे लिया गया था: यह निर्धारित करें कि 4 अंक एक वर्ग बनाते हैं
यदि आपको उत्तर पसंद है, तो मैं कहता हूं, उस व्यक्ति को धन्यवाद देने के लिए कुछ क्षण निकाल लें, या उस पृष्ठ पर उसका उत्तर दें।
मूल विचार (यह इस सवाल का जवाब देता है कि क्या मैं कुछ नया योगदान दे रहा था, जिसे मैंने जवाब देने के लिए क्लिक करने पर बॉट से पूछा था:
आर में मेरा समाधान नीचे प्रस्तुत किया गया है। मैं देखते हैं कि यह सोचते हैं रहा हूँ वास्तव में चार अंक और कहा कि, समस्या बयान के अनुसार, यह पहले से ही निर्धारित किया गया है अंक अद्वितीय हैं।
sumsq <- function(x) sum(x^2)
quadrances.xy <- function(xy) vapply(
as.data.frame(t(diff(xy)), optional=T), sumsq, 1)
नॉर्मन वाइल्डबर्गर के कार्यों को देखें, विशेष रूप से उनके यूट्यूब वीडियो ( वास्तविक मछली, वास्तविक संख्या, वास्तविक नौकरियां एट seq।) और उनकी पुस्तक "क्वाडरेन्स" की चर्चा के लिए उनकी दिव्य अनुपात ।
xy
मैट्रिक्स का एक प्रकार आर के द्वारा स्वीकार करने के लिए संदर्भित करता है plot
, points
और lines
काम करता है।
as.data.frame
आर-कॉलम चीजों को कॉलम-वार करने के लिए एक ट्रिक का अनुप्रयोग है ।
optional=T
खंड के नाम है, जो वैसे भी उपयोग नहीं किया जाता, दूर करता है।
quadrances.xy..i2. <- function(xy, i2) vapply(
as.data.frame(i2, optional=T),
function(k) quadrances.xy(m[k,]),
1)
यह निर्दिष्ट बिंदुओं के बीच चतुर्भुज की गणना करने के लिए एक फ़ंक्शन है, जहां i2
तर्क द्वारा बिंदुओं के जोड़े निर्दिष्ट किए जाते हैं। i2
प्रतीक एक सूचकांक मैट्रिक्स जो सूचकांक प्रति एक स्तंभ है, और है को संदर्भित करता है 2 प्रति स्तंभ तत्वों (मैट्रिक्स के एक ही तरह से वापस लौटे combn
समारोह)।
quadrance.every.xy <- function(xy, .which=combn(nrow(xy), 2))
quadrances.xy..i2.(xy, .which)
.which
के रूप में एक तर्क केवल इसे करने के लिए बेनकाब करने के लिए प्रस्तुत किया है formals
और क्या चल रहा है संवाद करने के लिए प्रयास करने के लिए।
is.square.xy <- function(xy) {
qq <- sort(quadrance.every.xy(xy))
all(qq[2:4] == qq[1]) && # ALL SIDES (SHORT QUADRANCES) EQUAL
qq[5] == qq[6] # ALL DIAGONALS (LONG QUADRANCES) EQUAL
}
मैंने कहा "सरल" में कोई बहुस्तरीय कार्य शामिल नहीं था। आपको इस दो-लाइन फ़ंक्शन को बहाना होगा।
xy <- t(matrix(c(3,0, 7,3, 4,7, 0,4), ncol=4))
xy
# [,1] [,2]
# [1,] 3 0
# [2,] 7 3
# [3,] 4 7
# [4,] 0 4
is.square.xy(xy)
# [1] TRUE
ध्यान दें कि पहले चार कार्य अपने आप में उपयोगी हैं, इसके अलावा चार बिंदुओं के बारे में सवाल।
चार अंक A = (ax, ay), B = (bx, by), C = (cx, cy), D = (dx, dy) मान लें, और वे एंटी-क्लॉकवाइज ऑर्डर में एक वर्ग के बिंदु बनाते हैं। हम बिंदुओं को स्थानांतरित करते हैं ताकि ए, बीएक्स, सीएक्स, और डीएक्स से कुल्हाड़ी को घटाकर और एआई द्वारा घटाकर, साइबर, और डाई को सेट करके, एक्स = एआई = 0 से घटाकर ए (0, 0) हो।
यदि अंक बिल्कुल एंटी-क्लॉकवाइज ऑर्डर में एक वर्ग के कोने हैं, तो ए और बी दिया जाता है, हम गणना कर सकते हैं कि सी और डी कहां हैं: हमें होना चाहिए (सीएक्स, साइबर) = (बीएक्स - बाय, बीएक्स + बाय) और (डीएक्स, डाई) = (-बी, बीएक्स)। इसलिए हम सी और डी जहां हैं, जहां उन्हें होना चाहिए, से वर्ग दूरी की गणना करते हैं: इरेक = (सीएक्स - बीएक्स + बाय) ^ 2 + (साइबर - बीएक्स - बाय) ^ 2, और आईरडी = (डीएक्स + बाय) ^ 2 + (डाई - बीएक्स) ^ 2। हम इन्हें जोड़ते हैं, और (= x + 2 को ^ 2) से विभाजित करते हैं, इरेट = (इरसी + इरेड) / (बीएक्स ^ 2 + बाय ^ 2) देते हैं।
परिणामी त्रुटि 0 होगी यदि एक पूर्ण वर्ग, या एक छोटी संख्या यदि लगभग एक वर्ग है, और संख्या गोल घूमने की त्रुटियों को छोड़कर अपरिवर्तित रहेगी यदि हम अनुवाद करते हैं, स्केल करते हैं, या वर्ग के बिंदुओं को घुमाते हैं। इसलिए हम यह तय करने के लिए उपयोग कर सकते हैं कि हमारे पास कितना अच्छा वर्ग है।
लेकिन हमें अंकों के क्रम का पता नहीं है। बी और डी ए से समान दूरी पर होना चाहिए; यदि हम इसे 2 के वर्गमूल से गुणा करते हैं, तो A से C तक की दूरी होनी चाहिए। हम इसका उपयोग यह पता लगाने के लिए करते हैं कि कौन सा बिंदु C है: distB = bx ^ 2 + को ^ 2, distD = dx ^ 2 + डाई से गणना करें ^ 2। यदि डिस्टीडी B 1.5 डिस्टर्ब है, तो हम सी और डी स्वैप करते हैं; अगर distB C 1.5 distD है तो हम C और B को स्वैप करते हैं। अब C सही है।
हम यह भी पता लगा सकते हैं कि कौन से बिंदु बी और डी हैं: यदि हमने गलत अनुमान लगाया कि कौन सा बी है और कौन सा डी है, तो हमारी गणना डी को पूरी तरह से गलत जगह में डालती है, जहां से यह विपरीत है। इसलिए यदि इरेड if (bx ^ 2 + by ^ 2), तो हम B और D को स्वैप करते हैं।
यह बी, सी और डी को सही ढंग से व्यवस्थित करेगा यदि हमारे पास वास्तव में एक वर्ग है या कम से कम लगभग एक वर्ग है। लेकिन अगर हमारे पास एक वर्ग भी नहीं है, तो हमें पता है कि अंत में त्रुटि गणना यह दिखाएगी।
सारांश:
यदि हम अंकों के क्रम को जानते हैं, तो यह स्पष्ट रूप से सरल हो सकता है।
समाधान सोच मीडिया के समान है।
पहला कदम:
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 का डॉट प्रोडक्ट है