दिलचस्प पोस्ट
समूहों की चर संख्या के साथ नियमित अभिव्यक्ति? Php के strtotime () के जावास्क्रिप्ट समकक्ष? कोई डुप्लिकेट के साथ यादृच्छिक संख्या बनाना क्यों नहीं logcat मेरे Android में कुछ भी दिखता है? PHP में दिए गए कुंजी के मान द्वारा एसोसिएटिव एरे की एक सरणी कैसे सॉर्ट करनी है? कैसे एक पूरी जार फ़ाइल decompile करने के लिए? दिनांक निर्माता IE में एनएएन देता है, लेकिन फ़ायरफ़ॉक्स और क्रोम में काम करता है एएसपी.नेट वेब एपीआई में मॉडलस्टेट मान्यकरण को संभालना वीबीए मैक्रो के साथ कार्यपुस्तिका के भीतर एक एक्सेल टेबल पर एसक्यूएल प्रश्नों को निष्पादित करना अजगर में उपयोगी कब है? फोन: पाठ इनपुट के लिए संख्यात्मक कीबोर्ड java.lang.NoClassDefFound त्रुटि: javax.activation.DataHandler एंड्रॉइड अनुरोध डेटा खोए बिना ASP.NET MVC में रीडायरेक्ट टाईएक्शन कैसे करें इकाई फ़्रेमवर्क कोर में संग्रहीत कार्यविधियाँ कैसे चलाने के लिए? एनएसबीएलऑनपरेशन और कतारों के साथ NSURL सत्र

परीक्षण के लिए समीकरण यदि कोई बिंदु एक वृत्त के अंदर है

यदि आपके पास केंद्र (center_x, center_y) और त्रिज्या radius साथ एक मंडल है, तो आप कैसे जांच करते हैं कि निर्देशांक (x, y) साथ दिए गए बिंदु सर्कल के अंदर है?

वेब के समाधान से एकत्रित समाधान "परीक्षण के लिए समीकरण यदि कोई बिंदु एक वृत्त के अंदर है"

सामान्य में, x और y को संतुष्ट करना चाहिए (x - center_x)^2 + (y - center_y)^2 < radius^2

कृपया ध्यान दें कि जो अंक नीचे दिए गए समीकरण को < space by == साथ संतुष्ट करते हैं वे चक्र पर अंक मानते हैं, और उन बिंदुओं को जो सर्कल के बाहर समझा जाता है।

गणितीय रूप से, पाइथागोरस संभवतः एक सरल तरीका है जैसा कि पहले ही उल्लेख किया है।

 (x-center_x)^2 + (y - center_y)^2 < radius^2 

कम्प्यूटेशनल रूप से, तेज तरीके हैं निर्धारित करें:

 dx = abs(x-center_x) dy = abs(y-center_y) R = radius 

यदि एक बिंदु इस मंडली से बाहर होने की अधिक संभावना है तो उसके चारों ओर खींचा एक वर्ग की कल्पना करें कि यह पक्ष इस चक्र के स्पर्शरेखा हैं:

 if dx>R then return false. if dy>R then return false. 

अब इस वृत्त के अंदर खींचा एक वर्ग के हीरे की कल्पना करें, कि यह वृक्ष को इस चक्र को छूएं:

 if dx + dy <= R then return true. 

अब हमने अपनी अधिकांश जगह को कवर किया है और इस चक्र का केवल एक छोटा क्षेत्र परीक्षण के लिए हमारे वर्ग और हीरे के बीच रहता है। यहाँ हम इसके बाद के संस्करण के रूप में पायथागोरस में लौट आए हैं।

 if dx^2 + dy^2 <= R^2 then return true else return false. 

यदि एक बिंदु इस चक्र के अंदर होने की अधिक संभावना है तो पहले तीन चरणों का उल्टा क्रम बदलें:

 if dx + dy <= R then return true. if dx > R then return false. if dy > R then return false. if dx^2 + dy^2 <= R^2 then return true else return false. 

वैकल्पिक तरीकों ने एक हीरे के बजाय इस चक्र के अंदर एक वर्ग की कल्पना की है लेकिन इसकी तुलना में थोड़ा अधिक परीक्षण और गणना की आवश्यकता नहीं है (कोई भी कम्प्यूटेशनल लाभ नहीं है) (आंतरिक वर्ग और हीरे समान क्षेत्र हैं):

 k = R/sqrt(2) if dx <= k and dy <= k then return true. 

अद्यतन करें:

प्रदर्शन में रुचि रखने वाले लोगों के लिए मैंने इस पद्धति को ग में कार्यान्वित किया, और -ऑ 3 के साथ संकलित किया

मैंने समय से निष्पादन समय प्राप्त किया। / time ./a.out

मैंने इस पद्धति को कार्यान्वित किया, एक सामान्य विधि और समय सीमा निर्धारित करने के लिए एक डमी पद्धति।

Normal: 21.3s This: 19.1s Overhead: 16.5s

इसलिए, ऐसा लगता है कि इस पद्धति में इस क्रियान्वयन में और अधिक कुशलता है।

 // compile gcc -O3 <filename>.c // run: time ./a.out #include <stdio.h> #include <stdlib.h> #define TRUE (0==0) #define FALSE (0==1) #define ABS(x) (((x)<0)?(0-(x)):(x)) int xo, yo, R; int inline inCircle( int x, int y ){ // 19.1, 19.1, 19.1 int dx = ABS(x-xo); if ( dx > R ) return FALSE; int dy = ABS(y-yo); if ( dy > R ) return FALSE; if ( dx+dy <= R ) return TRUE; return ( dx*dx + dy*dy <= R*R ); } int inline inCircleN( int x, int y ){ // 21.3, 21.1, 21.5 int dx = ABS(x-xo); int dy = ABS(y-yo); return ( dx*dx + dy*dy <= R*R ); } int inline dummy( int x, int y ){ // 16.6, 16.5, 16.4 int dx = ABS(x-xo); int dy = ABS(y-yo); return FALSE; } #define N 1000000000 int main(){ int x, y; xo = rand()%1000; yo = rand()%1000; R = 1; int n = 0; int c; for (c=0; c<N; c++){ x = rand()%1000; y = rand()%1000; // if ( inCircle(x,y) ){ if ( inCircleN(x,y) ){ // if ( dummy(x,y) ){ n++; } } printf( "%d of %d inside circle\n", n, N); } 

आप अपनी बिंदु और केंद्र के बीच की दूरी को मापने के लिए पायथागोरस का उपयोग कर सकते हैं और देखें कि यह त्रिज्या से कम है:

 def in_circle(center_x, center_y, radius, x, y): dist = math.sqrt((center_x - x) ** 2 + (center_y - y) ** 2) return dist <= radius 

संपादित करें (पॉल के लिए टोपी टिप)

व्यवहार में, स्क्वायरिंग अक्सर वर्गमूल लेने से सस्ता होता है और चूंकि हम केवल एक आदेश में रुचि रखते हैं, हम निश्चित रूप से वर्गमूल ले जा सकते हैं:

 def in_circle(center_x, center_y, radius, x, y): square_dist = (center_x - x) ** 2 + (center_y - y) ** 2 return square_dist <= radius ** 2 

इसके अलावा, जेसन ने नोट किया कि <= को बदल दिया जाना चाहिए < और उपयोग के आधार पर यह वास्तव में समझ में आता है हालांकि मुझे विश्वास है कि यह सख्त गणितीय अर्थों में सच नहीं है मुझे सही साबित होना है।

 boolean isInRectangle(double centerX, double centerY, double radius, double x, double y) { return x >= centerX - radius && x <= centerX + radius && y >= centerY - radius && y <= centerY + radius; } //test if coordinate (x, y) is within a radius from coordinate (center_x, center_y) public boolean isPointInCircle(double centerX, double centerY, double radius, double x, double y) { if(isInRectangle(centerX, centerY, radius, x, y)) { double dx = centerX - x; double dy = centerY - y; dx *= dx; dy *= dy; double distanceSquared = dx + dy; double radiusSquared = radius * radius; return distanceSquared <= radiusSquared; } return false; } 

यह अधिक कुशल और पठनीय है। यह महंगा वर्ग रूट ऑपरेशन से बचा जाता है। मैंने यह भी निर्धारित करने के लिए एक जांच भी जोड़ दी है कि क्या बिंदु सर्कल के बाउंडिंग आयत के भीतर है।

कई बिंदुओं या कई मंडलियों को छोड़कर आयत की जांच अनावश्यक है। यदि अधिकांश बिंदुएं सर्कल के अंदर हैं, तो सीमा आयत की जांच वास्तव में चीजें धीमी कर देगी!

हमेशा की तरह, अपने उपयोग के मामले पर विचार करना सुनिश्चित करें

दूरी की गणना करें

 D = Math.Sqrt(Math.Pow(center_x - x, 2) + Math.Pow(center_y - y, 2)) return D <= radius 

वह सी # में है … अजगर में उपयोग के लिए कन्वर्ट …

आपको जांच करनी चाहिए कि क्या वृत्त के केंद्र से दूरी बिंदु पर त्रिज्या से कम है, यानी

 if (x-center_x)**2 + (y-center_y)**2 <= radius**2: # inside circle 

जैसा कि ऊपर कहा – यूक्लिडियन दूरी का उपयोग करें

 from math import hypot def in_radius(c_x, c_y, r, x, y): return math.hypot(c_x-x, c_y-y) <= r 

यह वही समाधान है, जैसा कि जेसन पूनॉन द्वारा उल्लिखित है , लेकिन इसमें एक छद्म कोड उदाहरण और कुछ और विवरण शामिल हैं। मैंने यह लिखने के बाद उसका जवाब देखा, लेकिन मैं मेरा हटा नहीं जाना चाहता था।

मुझे लगता है कि सबसे आसानी से समझने योग्य तरीका पहले चक्र के केंद्र और बिंदु के बीच की दूरी की गणना करना है। मैं इस फार्मूले का प्रयोग करूंगा:

 d = sqrt((circle_x - x)^2 + (circle_y - y)^2) 

फिर, उस सूत्र के परिणाम की तुलना करें, दूरी ( d ), radius साथ। यदि दूरी ( d ) त्रिज्या ( r ) के बराबर या उससे कम है, तो बिंदु सर्कल के अंदर है (सर्कल के किनारे पर अगर d और r समान हैं)।

यहां एक छद्म कोड उदाहरण है जिसे आसानी से किसी भी प्रोग्रामिंग भाषा में बदला जा सकता है:

 function is_in_circle(circle_x, circle_y, r, x, y) { d = sqrt((circle_x - x)^2 + (circle_y - y)^2); return d <= r; } 

जहां circle_x और circle_y , सर्कल के केंद्र निर्देशांक है, r सर्कल के त्रिज्या है, और x और y पॉइंट के निर्देशांक है।

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

 int d = r^2 - (center_x-x)^2 + (center_y-y)^2; if(d>0) print("inside"); else if(d==0) print("on the circumference"); else print("outside"); 

एक पूर्ण कट-पेस्ट के रूप में सी # में मेरा जवाब (अनुकूलित नहीं) समाधान:

 public static bool PointIsWithinCircle(double circleRadius, double circleCenterPointX, double circleCenterPointY, double pointToCheckX, double pointToCheckY) { return (Math.Pow(pointToCheckX - circleCenterPointX, 2) + Math.Pow(pointToCheckY - circleCenterPointY, 2)) < (Math.Pow(circleRadius, 2)); } 

उपयोग:

 if (!PointIsWithinCircle(3, 3, 3, .5, .5)) { } 

मैंने अपने जैसे शुरुआती के लिए नीचे दिए गए कोड का इस्तेमाल किया 🙂

सार्वजनिक कक्षा इंकर्केल {

 public static void main(String[] args) { int x; int y; int middelx; int middely; int straal; { // Adjust the coordinates of x and yx = -1; y = -2; // Adjust the coordinates of the circle middelx = 9; middely = 9; straal = 10; { //When x,y is within the circle the message below will be printed if ((((middelx - x) * (middelx - x)) + ((middely - y) * (middely - y))) < (straal * straal)) { System.out.println("coordinaten x,y vallen binnen cirkel"); //When x,y is NOT within the circle the error message below will be printed } else { System.err.println("x,y coordinaten vallen helaas buiten de cirkel"); } } } }} 

जैसा कि पहले बताया गया है, यदि यह इंगित करने के लिए कि बिंदु चक्र में है तो हम निम्नलिखित का उपयोग कर सकते हैं

 if ((x-center_x)^2 + (y - center_y)^2 < radius^2) { in.circle <- "True" } else { in.circle <- "False" } 

इसे रेखांकन करने के लिए हम इसका उपयोग कर सकते हैं:

 plot(x, y, asp = 1, xlim = c(-1, 1), ylim = c(-1, 1), col = ifelse((x-center_x)^2 + (y - center_y)^2 < radius^2,'green','red')) draw.circle(0, 0, 1, nv = 1000, border = NULL, col = NA, lty = 1, lwd = 1) 

3 डी की दुनिया में स्थानांतरित होने पर यदि आप यह देखना चाहते हैं कि एक 3 डी बिंदु यूनिट क्षेत्र में है तो आप कुछ समान कर रहे हैं। 2 डी में काम करने के लिए आवश्यक सभी 2 डी वेक्टर ऑपरेशन का उपयोग करना है।

  public static bool Intersects(Vector3 point, Vector3 center, float radius) { Vector3 displacementToCenter = point - center; float radiusSqr = radius * radius; bool intersects = displacementToCenter.magnitude < radiusSqr; return intersects; }