दिलचस्प पोस्ट

मैं 2 डी बहुभुज के क्षेत्र की गणना कैसे करूं?

2 डी स्पेस में एक श्रृंखला की श्रृंखला को मानते हुए स्वयं को अन्तर्निहित नहीं करते, परिणामस्वरूप बहुभुज के क्षेत्र का निर्धारण करने का एक कुशल तरीका क्या है?

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

वेब के समाधान से एकत्रित समाधान "मैं 2 डी बहुभुज के क्षेत्र की गणना कैसे करूं?"

यहां मानक विधि , AFAIK है। असल में प्रत्येक शीर्ष के आसपास क्रॉस उत्पादों का योग। त्रिकोणीय से बहुत सरल

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

def area(p): return 0.5 * abs(sum(x0*y1 - x1*y0 for ((x0, y0), (x1, y1)) in segments(p))) def segments(p): return zip(p, p[1:] + [p[0]]) 

डेविड लेहवी टिप्पणी करते हैं: यह एल्गोरिथ्म क्यों काम करता है इसके लिए उल्लेखनीय है: यह ग्रीन के प्रमेय का कार्य- i और x के लिए है; जिस तरह से एक योजनाबद्ध काम करता है अधिक विशेष रूप से:

फॉर्मूला = ऊपर
integral_over_perimeter(-y dx + x dy) =
integral_over_area((-(-dy)/dy+dx/dx) dy dx) =
2 Area

पार उत्पाद एक क्लासिक है

यदि आपके पास इस तरह की गणना के लिए शून्य है, तो निम्न अनुकूलित संस्करण को आज़माएं, जो कि आधा कम गुणों की आवश्यकता होती है:

 area = 0; for( i = 0; i < N; i += 2 ) area += x[i+1]*(y[i+2]-y[i]) + y[i+1]*(x[i]-x[i+2]); area /= 2; 

मैं स्पष्टता के लिए सरणी सबस्क्रिप्ट का उपयोग करता हूँ यह संकेतक का उपयोग करने के लिए अधिक कुशल है यद्यपि अच्छा कंपलर आपके लिए ऐसा करेंगे।

बहुभुज को "बंद" माना जाता है, जिसका अर्थ है कि आप सबस्क्रिप्ट एन के साथ बिंदु के रूप में पहले बिंदु की प्रतिलिपि बनाते हैं। यह भी मानता है कि बहुभुज में अंकों की एक भी संख्या है। यदि एन भी नहीं है तो पहले बिंदु की एक अतिरिक्त प्रति जोड़ें।

एल्गोरिथ्म क्लासिक क्रॉस उत्पाद एल्गोरिथम के दो लगातार पुनरावृत्तियों को अनारोल और संयोजन करके प्राप्त किया जाता है।

मुझे यह निश्चित नहीं है कि दो एल्गोरिदम संख्यात्मक सटीक के बारे में कैसे तुलना करते हैं मेरा इंप्रेशन यह है कि उपरोक्त एल्गोरिदम क्लासिक से बेहतर है क्योंकि गुणा घटाव की सटीकता के नुकसान को बहाल करते हैं। जब GPU के साथ फ़्लोट्स का उपयोग करने के लिए विवश हो, तो यह एक महत्वपूर्ण अंतर बना सकता है।

संपादित करें: "त्रिभुज और बहुभुज 2 डी और 3 डी का क्षेत्र" एक और अधिक कुशल विधि का वर्णन करता है

 // "close" polygon x[N] = x[0]; x[N+1] = x[1]; y[N] = y[0]; y[N+1] = y[1]; // compute area area = 0; for( size_t i = 1; i <= N; ++i ) area += x[i]*( y[i+1] - y[i-1] ); area /= 2; 

यह पृष्ठ दिखाता है कि सूत्र

यहां छवि विवरण दर्ज करें

को सरल बना दिया जा सकता है:

यहां छवि विवरण दर्ज करें

यदि आप कुछ शब्दों को लिखते हैं और उन्हें xi सामान्य कारकों के अनुसार समूह बनाते हैं, तो समानता देखना मुश्किल नहीं है।

अंतिम सम्मेलन अधिक कुशल है क्योंकि इसके लिए 2n जगह केवल n गुणांक की आवश्यकता होती है

 def area(x, y): return abs(sum(x[i] * (y[i + 1] - y[i - 1]) for i in xrange(-1, len(x) - 1))) / 2.0 

मैंने जो किंगटन से इस सरलीकरण को सीखा, यहां ।


यदि आपके पास NumPy है, तो यह संस्करण तेजी से है (सभी लेकिन बहुत छोटी एरे के लिए):

 def area_np(x, y): x = np.asanyarray(x) y = np.asanyarray(y) n = len(x) shift_up = np.arange(-n+1, 1) shift_down = np.arange(-1, n-1) return (x * (y.take(shift_up) - y.take(shift_down))).sum() / 2.0 

किसी भी अन्य बाधाओं के बिना अंक का एक सेट अनिवार्य रूप से एक बहुभुज को परिभाषित नहीं करता है।

तो, पहले आपको यह तय करना होगा कि इन बिंदुओं से बहुभुज कैसे निर्माण होगा – शायद उत्तल पतवार? http://en.wikipedia.org/wiki/Convex_hull

फिर त्रिकोण और क्षेत्र की गणना। http://www.mathopenref.com/polygonirregulararea.html

त्रिज्या और राशि त्रिभुज क्षेत्रों पर विस्तार करने के लिए, यदि आपके पास उत्तल बहुभुज होता है या आप ऐसा कोई बिंदु चुनते हैं जो बहुभुज को एक दूसरे को इंगित करने के लिए प्रत्येक दूसरे बिंदु पर लाइन उत्पन्न नहीं करता है।

सामान्य गैर-अन्तर्विभाजक बहुभुज के लिए, आपको वैक्टर (संदर्भ बिंदु, एक बिंदु), (संदर्भ बिंदु, बिंदु बी) के क्रॉस उत्पाद को जोड़ना होगा जहां एक और बी एक दूसरे के "अगला" हैं

यह मानते हुए कि आपके पास अंक की एक सूची है जो बहुभुज को क्रम में परिभाषित करती है (क्रम अंक I और I + 1 को बहुभुज की एक पंक्ति बनाते हैं):

I = 1 से n – 1 के लिए योग (क्रॉस प्रोडक्ट ((बिंदु 0, बिंदु I), (बिंदु 0, बिंदु I + 1))

उस क्रॉस उत्पाद की भयावहता ले लो और आपके पास सतह क्षेत्र है।

यह एक अच्छा संदर्भ बिंदु चुनने के बारे में चिंता किए बिना अवतल बहुभुजों को संभाल देगा; कोई भी तीन बिंदु जो त्रिकोण उत्पन्न करते हैं जो बहुभुज के अंदर नहीं है, एक क्रॉस उत्पाद होगा जो किसी त्रिकोण के विपरीत दिशा में इंगित करता है जो बहुभुज के अंदर है, इसलिए क्षेत्रों को सही ढंग से अभिव्यक्त किया जाता है

बहुभुज के क्षेत्र को शांत करने के लिए

http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry1#polygon_area

 int cross(vct a,vct b,vct c) { vct ab,bc; ab=ba; bc=cb; return ab.x*bc.y-ab.y*bc.x; } double area(vct p[],int n) { int ar=0; for(i=1;i+1<n;i++) { vct a=p[i]-p[0]; vct b=p[i+1]-p[0]; area+=cross(a,b); } return abs(area/2.0); } 

या एक समोच्च अभिन्न है। स्टोक्स के प्रमेय आपको एक समन्वित अभिन्न के रूप में अभिन्न क्षेत्र को व्यक्त करने की अनुमति देता है। थोड़ा सा गॉस चौधरी और बॉब आपके चाचा

ऐसा करने का एक तरीका बहुभुज को त्रिभुज में विघटित करना , त्रिभुज के क्षेत्र की गणना करना और बहुभुज के क्षेत्र के रूप में योग लेना होगा।

  1. आधार बिंदु (सबसे उत्तल बिंदु) सेट करें यह आपके त्रिकोण का धुरी बिंदु होगा
  2. अपने मूल बिंदु के अलावा, सबसे-बाएं बिंदु (मनमाना) की गणना करें
  3. अपने त्रिकोण को पूरा करने के लिए 2-सबसे-बाएं बिंदु की गणना करें
  4. इस त्रिकोणीय क्षेत्र को सहेजें
  5. प्रत्येक बिंदु पर दाईं ओर एक स्थान पर शिफ्ट करें
  6. त्रिकोणीय क्षेत्रों को जोड़ना

संक्षेप में संक्षेप त्रिभुज की तुलना में कार्टेशियन अंतरिक्ष में ट्रेपेरोइड्स का संक्षेप:

 area = 0; for (i = 0; i < n; i++) { i1 = (i + 1) % n; area += (vertex[i].y + vertex[i1].y) * (vertex[i1].x - vertex[i].x) / 2.0; } 

भाषा स्वतंत्र समाधान:

GIVEN: एक बहुभुज हमेशा एन -2 त्रिभुज से बना हो सकता है जो ओवरलैप नहीं करते (n = अंक या पक्ष की संख्या)। 1 त्रिकोण = 3 पक्षीय बहुभुज = 1 त्रिकोण; 1 वर्ग = 4 पक्षीय बहुभुज = 2 त्रिकोण; आदि क्यूईडी क्यूईडी

इसलिए, बहुभुज को "काटकर" त्रिकोण द्वारा कम किया जा सकता है और कुल क्षेत्र इन त्रिकोणों के क्षेत्रफल का योग होगा। इसे पेपर और कैंची के एक टुकड़े के साथ आज़माएं, यह सबसे अच्छा होगा यदि आप निम्नलिखित से पहले प्रक्रिया को कल्पना दें।

यदि आप बहुभुज के रास्ते में 3 लगातार अंक लेते हैं और इन बिंदुओं के साथ त्रिकोण बनाते हैं, तो आपके पास एक और तीन संभावित परिदृश्यों में से केवल एक होगा:

  1. परिणामी त्रिकोण पूरी तरह से मूल बहुभुज के अंदर है
  2. परिणामस्वरूप त्रिकोण पूरी तरह से मूल बहुभुज के बाहर है
  3. परिणामी त्रिभुज मूल बहुभुज में आंशिक रूप से समाहित है

हम केवल उन मामलों में रुचि रखते हैं जो पहले विकल्प (पूरी तरह से समाहित) में आते हैं।

हर बार जब हम इनमें से किसी एक को खोजते हैं, तो हम इसे काटते हैं, अपने क्षेत्र की गणना करते हैं (आसान पेसी, यहां फार्मूले की व्याख्या नहीं करते हैं) और एक कम पक्ष के साथ एक बहुभुज बनाते हैं (इस त्रिकोण के साथ बहुभुज के समतुल्य बंद)। जब तक हमारे पास केवल एक त्रिकोण छोड़ा नहीं है

इस प्रोग्राम को कैसे कार्यान्वित करें:

बहुभुज के आगे पथ का प्रतिनिधित्व करते हुए (लगातार) अंक की एक सरणी बनाएं बिंदु 0 से शुरू करें। एक्स, एक्स + 1 और एक्स + 2 अंक से सरणी बनाने वाली त्रिकोण (एक समय में एक) चलाएं। प्रत्येक त्रिकोण को एक आकार से एक क्षेत्र में बदलना और इसे बहुभुज से बनाए क्षेत्र के साथ एक दूसरे को बदल देना चाहिए। यदि परिणामस्वरूप प्रतिच्छेदन मूल त्रिकोण के समान है, तो कहा गया है कि त्रिकोण पूरी तरह से बहुभुज में समाहित है और इसे काट लिया जा सकता है। सरणी से x + 1 निकालें और एक्स = 0 से फिर से शुरू करें अन्यथा (यदि त्रिकोण बाहर [आंशिक रूप से या पूरी तरह से] बहुभुज है), सरणी में अगले बिंदु x + 1 पर जाएं।

इसके अतिरिक्त यदि आप मैपिंग के साथ एकीकृत करने के लिए देख रहे हैं और geopoints से शुरू कर रहे हैं, तो आपको भौगोलिक बिंदुओं से स्क्रीनपॉइंट को FIRST में कनवर्ट करना होगा। इसके लिए पृथ्वी की आकृति के लिए एक मॉडलिंग और फार्मूला तय करने की आवश्यकता है (हालांकि हम पृथ्वी को एक गोले के रूप में सोचते हैं, यह वास्तव में एक अनियमित अंडाकार (अंडेपैप) है, जिसमें दंतों के साथ) वहाँ कई मॉडल हैं, अधिक जानकारी विकी के लिए एक महत्वपूर्ण मुद्दा यह है कि आप क्षेत्र को विमान समझने या घुमावदार होने पर विचार करेंगे या नहीं। सामान्य तौर पर, "छोटे" क्षेत्र, जहां अंक कुछ किमी के ऊपर हैं, ताराकार पर विचार नहीं करते हैं और उत्तल नहीं मानते हैं।

मेरा झुकाव केवल त्रिकोण को बंद करना शुरू करना होगा मुझे नहीं लगता कि कुछ और भी बहुत ही बालों वाले होने से बच सकते हैं।

तीन अनुक्रमिक बिंदु लें जिनमें बहुभुज शामिल हैं। सुनिश्चित करें कि कोण 180 से कम है। अब आपके पास एक नया त्रिकोण है, जो गणना करने में कोई समस्या नहीं होनी चाहिए, पॉलीगॉन की अंकों की सूची से मध्य बिंदु हटा दें। दोबारा दोहराएं जब तक आपके पास केवल तीन अंक शेष रह जाएंगे

शोएल्स सूत्र का क्रियान्वयन नंपी में किया जा सकता है। इन कोने मान लें:

 import numpy as np x = np.arange(0,1,0.001) y = np.sqrt(1-x**2) 

क्षेत्र खोजने के लिए हम निम्नलिखित फ़ंक्शन को परिभाषित कर सकते हैं:

 def PolyArea(x,y): return 0.5*np.abs(np.dot(x,np.roll(y,1))-np.dot(y,np.roll(x,1))) 

और परिणाम प्राप्त करना:

 print PolyArea(x,y) # 0.26353377782163534 

लूप से बचना इस समारोह को बनाता है ~ PolygonArea से 50X तेज:

 %timeit PolyArea(x,y) # 10000 loops, best of 3: 42 µs per loop %timeit PolygonArea(zip(x,y)) # 100 loops, best of 3: 2.09 ms per loop 

ध्यान दें: मैंने एक और प्रश्न के लिए यह उत्तर लिखा था, मैं यहां इस बात का उल्लेख करता हूं कि समाधान की एक पूरी सूची है।

ऐसा करने का सी तरीका:

 float areaForPoly(const int numVerts, const Point *verts) { Point v2; float area = 0.0f; for (int i = 0; i<numVerts; i++){ v2 = verts[(i + 1) % numVerts]; area += verts[i].x*v2.y - verts[i].y*v2.x; } return area / 2.0f; } 

मैं 2d बहुभुज के क्षेत्र की गणना करने के लिए कुछ सरल कार्य देना चाहता हूं। यह दोनों उत्तल और अवतल बहुभुजों के लिए काम करता है हम बहुभुज को कई उप त्रिकोणों में विभाजित करते हैं।

 //don't forget to include cmath for abs function struct Point{ double x; double y; } double cp(Point a, Point b){ //returns cross product return ax*by-ay*bx; } double area(Point * vertices, int n){ //n is number of sides double sum=0.0; for(i=0; i<n; i++){ sum+=cp(vertices[i]+vertices[(i+1)%n]); //%n is for last triangle } return abs(sum)/2.0; } 

पायथन कोड

जैसा कि यहां बताया गया है: http://www.wikihow.com/Calculate-the-Area-of-a-Polygon

पांडा के साथ

 import pandas as pd df = pd.DataFrame({'x': [10, 20, 20, 30, 20, 10, 0], 'y': [-10, -10, -10, 0, 10, 30, 20]}) df = df.append(df.loc[0]) first_product = (df['x'].shift(1) * df['y']).fillna(0).sum() second_product = (df['y'].shift(1) * df['x']).fillna(0).sum() (first_product - second_product) / 2 600