2012-01-30 13 views
7

यदि मेरे पास उदा। 20 अंक, मैं यह देखने के लिए कैसे जांच सकता हूं कि ये अंक मंडली के लिए तैयार हैं या नहीं? यह एक आदर्श सर्कल होना नहीं है।क्या सर्कल के लिए कई अंक बनते हैं?

उदाहरण के लिए यदि मैं अपने माउस के निर्देशांक को हर 200ms (जैसे उपयोगकर्ता माउस ले जाता है) स्टोर करता हूं, तो मैं देखना चाहता हूं कि उपयोगकर्ता सर्कल इशारा करता है या नहीं। और मैं उम्मीद नहीं कर सकता कि उपयोगकर्ता एक आदर्श सर्कल बनाने के लिए।

+0

क्या आप कृपया जो कुछ हासिल करने की कोशिश कर रहे हैं उसमें अधिक विशिष्ट हो सकते हैं? – Alexandros

+0

एक अपूर्ण सर्कल क्या है? –

+0

अब के बारे में कैसे ?? – Afra

उत्तर

9

मैं तो निम्न कार्य करें चाहते हैं;

  • कंप्यूट एक best fit circle through the points
  • की गणना प्रत्येक बिंदु के लिए एक अवशिष्ट (बिंदु शून्य से सबसे अच्छा फिट वृत्त की त्रिज्या के लिए केंद्र से शामिल होने दूरी)
  • परिणाम स्वीकार करता है, तो बच का एक बड़ा पर्याप्त प्रतिशत थे सर्वोत्तम फिट त्रिज्या के एक छोटे प्रतिशत के रूप में परिभाषित एक निश्चित मूल्य के नीचे। ये पैरामीटर उपयोगकर्ता निश्चित स्वीकृति मानदंड होंगे।
+0

यह शायद सबसे सही तरीका है, लेकिन ऐसा लगता है कि यह कोड में इसे लागू करने के लिए एक उपक्रम होगा। यह अभी भी अंक की संख्या के आधार पर रीयल-टाइम इशारा पहचान के लिए पर्याप्त तेज़ दौड़ जाएगा। –

+1

शायद यह L_1 फिटिंग का उपयोग करने के लिए सबसे अच्छा होगा, क्योंकि यह सिंगल आउटलाइजर्स से कम संवेदनशील है। एक अन्य संभावना है L_∞ (न्यूनतम annulus) फिट, जहां परीक्षण annulus चौड़ाई के अनुपात त्रिज्या के अनुपात पर आधारित हो सकता है। कोड और अन्य संसाधनों के लिंक के साथ, [सर्कल फिटिंग एल्गोरिदम यहां] का एक अच्छा सर्वेक्षण है (http://valis.cs.uiuc.edu/~sariel/papers/05/l1_fitting/l1_fit_slides.pdf)। _L1 सर्कल फिटिंग_ के लिए एक वेब खोज L_1 और L_∞ एल्गोरिदम दोनों के लिए बहुत सारे संसाधनों को बदल देती है। –

+0

@Ted, लिंक के लिए बहुत धन्यवाद, बहुत उपयोगी है। मेरे पास अतीत में एकमात्र बाहरी समस्या है। –

3

अपडेट: @LastCoder से सुझाव के साथ पिछले अंक के करीब लगातार अंक छोड़ने के लिए (मैंने 10 की दूरी पर थ्रेसहोल्ड सेट किया है, शायद इसे बढ़ाया जा सकता है) और सहनशीलता स्तर 0.25 पर सेट किया गया है (यानी विसंगति औसत बिंदु से केंद्र बिंदु तक 25% स्वीकार्य है), मैंने जो ऐप बनाया है, वह आधे मामलों में मेरे "मंडल" को पहचानता है, और अब वर्गों द्वारा धोखा नहीं है। तो आखिरकार, बुरा विचार नहीं हो सकता है।


मैं अंकों की दिए गए सेट के लिए centroid मिल जाए, और जाँच करेगा अगर प्रत्येक बिंदु को केन्द्रक से दूरी है कि आप चक्र पूरा का एक अनुमान उम्मीद ही नहीं, एक और अधिक या कम एक ही (यह मानते हुए है चाप)।

यह माउस के साथ किए गए सर्कल इशारे का पता लगाने की समस्या के लिए अभ्यास में मेरे लिए काम करता है; देख an example in C# (VS2010, केवल मुख्य रूप है, एप्लिकेशन के बाकी स्वचालित बॉयलरप्लेट है, ideone में त्रुटियों को अनदेखा) और इसके लिए एक स्क्रीनशॉट यहाँ:

Certainly I am bad at drawing circles with laptop's touch-stick

+0

+1। बस याद रखें कि रेडियल विचलन त्रिज्या के आनुपातिक होना चाहिए, या आप एक सर्कल के रूप में एक गैर-आंदोलन का पता लगाना समाप्त कर देते हैं। इस एल्गोरिदम को ऑनलाइन एल्गोरिदम के रूप में कुशलतापूर्वक कार्यान्वित किया जा सकता है, जहां नए नमूने आने के रूप में परिपत्र स्कोर का पुनर्मूल्यांकन किया जाता है। – cyborg

+3

यदि ब्रेक सर्कल के वास्तविक केंद्र से दूरसंचार को खींचकर पूरे सर्कल के चारों ओर समान रूप से फैला नहीं जाता है तो यह टूट जाएगा। –

+1

@ राफलडॉगर्ड और अन्य: मैं सहमत हूं, लेकिन माउस इशारा पहचान की समस्या के लिए कोई भी अंक समान रूप से फैलाने की उम्मीद कर सकता है; और यह प्रयोग के साथ पुष्टि की गई है (अद्यतन उत्तर देखें) :) –

2

यहां एक आसान तरीका है, एक कार्यान्वयन कार्यान्वयन के साथ मैंने एक साथ फेंक दिया।

http://jsfiddle.net/kBsdW/29/

बिंदुओं के माध्यम से
  • लूप
  • पहले
  • रिकार्ड से अधिकतम दूरी दूरी
  • के साथ एक दूसरे बिंदु का पता लगाएं एक बार जब आप अधिकतम दूरी के सभी उनका औसत और गणना त्रुटि सहनशीलता
  • अपनी त्रुटि सहनशीलता के खिलाफ अपनी सभी रिकॉर्ड की गई दूरीों की जांच करें

यह माउस इनपुट या टच सेंसर से उपयोगकर्ता इनपुट के लिए बहुत अच्छा काम करता है। यह एल्गोरिदम ओ (एन^2) है और द्रव्यमान के केंद्र को खोजने और त्रिज्या दूरी की जांच के विपरीत डेल्टा अधिकतम दूरी का उपयोग करता है।

यह "सर्वोत्तम" फिट-सर्कल विधि से अधिक कुशल लगता है जिसे 3 अंक के प्रत्येक संयोजन पर गणना करना है।

यह हैक ~ अलगो इस तथ्य का लाभ उठाता है कि सर्कल पर दो बिंदुओं के बीच अधिकतम दूरी सर्कल का व्यास है।

function isCircle(points, error) { 
    if(points.length <= 2) return true; 
    var weights = []; 
    var maxDistance = 0; 
    var sumDistance = 0; 
    var avgDistance = 0; 
    var errorConstraint = 0; 
    for(var i=0; i<points.length; i++) { 
     var distance = 0; 
     for(var j=0; j<points.length; j++) { 
      var d = getDistance(points[i], points[j]); 
      if(d > distance) { 
       distance = d; 
      } 
     } 
     if(distance > 0) { 
      if(distance > maxDistance) maxDistance = distance; 
      sumDistance += distance; 
      weights.push(distance); 
     } 
    } 
    avgDistance = sumDistance/weights.length; 
    errorConstraint = error * avgDistance; 
    for(var i=0; i<weights.length; i++) { 
     if(Math.abs(avgDistance - weights[i]) > errorConstraint) { 
      return false; 
     } 
    } 
    return true; 
} 
+0

+1। लेकिन 'Math.abs (avgDistance - भार [i])> त्रुटि कॉन्स्ट्रेन' बहुत सरल है। बस उस व्यक्ति के बारे में सोचें जो सर्कल के बीच में शुरू होता है। आपको इसे सत्यापित करने वाले अधिकांश बिंदुओं की आवश्यकता है। तो 2 पैरामीटर। – UmNyobe

+0

@UmNyobe - यही कारण है कि यह उन मामलों में झूठी वापसी करता है और केवल "सच्चाई" सहिष्णुता के भीतर ही सच हो जाता है। आप वजन सरणी में कुछ अतिरिक्त प्रसंस्करण भी कर सकते हैं और आउटलाइजर्स को हटा सकते हैं, लेकिन मैंने इसे सरल उदाहरण jsfiddle में नहीं किया। –

+0

मैंने आपके कार्यान्वयन के साथ थोड़ा सा खेला। सहिष्णुता स्तर 0.15 पर भी सेट होने के साथ, यह एक सर्कल के रूप में एक वर्ग और यहां तक ​​कि त्रिकोण (यदि समतुल्य के करीब) पर विचार कर सकता है :) –

संबंधित मुद्दे