أكثر

Python: نقطة في المضلع ، وفحص الحدود والرأس (صب الأشعة)

Python: نقطة في المضلع ، وفحص الحدود والرأس (صب الأشعة)


لقد كتبت بعض التعليمات البرمجية للتحقق مما إذا كانت النقطة [(x ، y)] تقع داخل مضلع [(x ، y) ، (x ، y) ، (x ، y) ، (x ، y)] لكن الكود يفشل إذا كانت النقطة تقع على حد أو قمة ، فأنا بحاجة إلى تصنيفها على أنها تقع داخل المضلع. هذا هو الكود:

def areaign (poly): sumarea = 0 لـ i في النطاق (0، len (poly) -1): xi = poly [i] [0] yi = poly [i] [1] xj = poly [i + 1] [0] yj = poly [i + 1] [1] sumarea = sumarea + ((xi * yj) - (yi * xj)) إذا كانت sumarea == 0: إرجاع 0 إذا كانت sumarea <0: return -1 if sumarea> 0: إرجاع 1 تقاطع سطري محدد (xy، ij): xyi = [] xyj = [] ijx = [] ijy = [] xyi.extend (xy) xyj.extend (xy) xyi.append (ij [0]) xyj .append (ij [1]) xyi.append (xy [0]) xyj.append (xy [0]) ijx.extend (ij) ijy.extend (ij) ijx.append (xy [0]) ijy.append (xy [1]) ijx.append (ij [0]) ijy.append (ij [0]) a = areaign (xyi) b = areaign (xyj) c = areaign (ijx) d = areaign (ijy) if ( a! = b) و (c! = d): إرجاع صحيح آخر: إرجاع False def openpointfile (fname): p = [] f = open (fname) للخط في f: line = line.replace ('POINT (') ، ") line = line.replace (')'،") vals = line.split (") res = map (float، vals) ctuple = tuple (res) p.append (ctuple) print ctuple f.close () إرجاع نقاط p = openpointfile ('C: /Users/Dan/Documents/Informatics/Data/Point_On_Line.txt') def openpolygonfile (fname): p = [] f = فتح (fname) للخط في f: line = line.replace ('POLYGON (('، ") line = line.replace ('))'،") s = line.split ('،') poly = [ ] للإحداثيات في s: vals = Coord.split (") res = map (float، vals) ctuple = tuple (res) poly.append (ctuple) p.append (poly) f.close () return p polys = openpolygonfile ('C: /Users/Dan/Documents/Informatics/Data/Polygon_On_Line.txt') حدد pointinpoly (نقاط ، polys): infinity = tuple ([100000000.0، 100000010.0]) المجموع = 0 testline = (نقاط ، ما لا نهاية) لـ i في النطاق (0 ، لين (بولي) -1): البداية = بولي [i] النهاية = بولي [i + 1] السطر = (البداية ، النهاية) l = تقاطع السطر (الخط ، خط الاختبار) إذا كان l == صحيحًا: المجموع = المجموع + 1 إذا كان المجموع٪ 2 == 0: إرجاع خطأ آخر: إرجاع عدد النقاط الحقيقي = 0 للنقطة في النقاط: pointcount = pointcount + 1 polycount = 0 لـ poly in polys: polycount = polycount + 1 l = pointinpoly (نقطة ، بولي ) res = 'Point' + str (pointcount) + 'تقع داخل Polygon' + str (polycount) + '=' + str (l) print l print (res)

كما قلت من قبل لا يعمل هذا إذا كانت النقطة تقع على حد أو قمة ، لدي هذه الوظيفة التي وجدتها هنا ويبدو أنها تعمل ولكن لا يمكنني العثور على طريقة لجعلها ملفاتي بالتنسيق الصحيح لـ وظيفة والحصول عليها لتكرار قائمة المضلعات.

def point_in_poly (x، y، poly): # تحقق مما إذا كانت النقطة هي قمة الرأس إذا (x، y) في poly: قم بإرجاع "IN" # تحقق مما إذا كانت النقطة على حد بالنسبة لـ i في النطاق (len (poly)): p1 = بلا p2 = بلا إذا i == 0: p1 = poly [0] p2 = poly [1] else: p1 = poly [i-1] p2 = poly [i] if p1 [1] == p2 [1] و p1 [1] == y and x> min (p1 [0]، p2 [0]) و x  min (p1y، p2y): if y <= max (p1y، p2y) : if x <= max (p1x، p2x): if p1y! = p2y: xints = (y-p1y) * (p2x-p1x) / (p2y-p1y) + p1x if p1x == p2x أو x <= xints: داخل = ليس داخل p1x ، p1y = p2x ، p2y إذا كان في الداخل: إرجاع "IN" وإلا: إرجاع "OUT"

أي مساعدة حول كيفية إنشاء هذه الوظيفة في الكود الحالي الخاص بي أو أي مساعدة بشأن وظيفة جديدة يمكن استخدامها للتحقق مما إذا كانت النقطة تقع على حدود مضلع أو على قمة الرأس


ما إذا كانت النقطة [(س ، ص)] تقع داخل مضلع [(س ، ص) ، (س ، ص) ، (س ، ص) ، (س ، ص)] لكن الكود يفشل إذا كانت النقطة تقع على حد أو قمة الرأس

تحتاج إلى فهم القواعد الطوبولوجية:

  • من المراوغات من "يحتوي" المسند المكاني

لا تحتوي المضلعات على حدودها (تحتوي الهندسة أ على Geometry B في حالة عدم وجود نقاط B في الجزء الخارجي من A ، ونقطة واحدة على الأقل من الجزء الداخلي من B تقع في الجزء الداخلي من A)

  • ومن دليل المستخدم الجميل: المسندات الثنائية)

يحتوي على إرجاع صحيح إذا كان الجزء الداخلي للكائن يحتوي على حدود وداخل الكائن الآخر ولا تتلامس حدودهما على الإطلاق.

وبالتالي ، من الطبيعي أن تفشل التعليمات البرمجية الخاصة بك إذا كانت النقطة تقع على حد أو قمة

مضلع وحلقة خطية (حده) ونقطة قمة

1) التحكم في المسندات باستخدام Java Topology Suite (نفس الشيء بالنسبة للمضلع ونقطة الرأس)

2) السيطرة مع جميل

من shapely.geometry import Point، Polygon polygon = Polygon ([(0، 0)، (1، 1)، (1، 0)]) # حدود المضلع = LinearRing linearring = LinearRing (list (polygon.exterior.coords) )) طباعة الخط الخطي LINEARRING (0 0، 1 1، 1 0، 0 0) # يحتوي على مضلع. يحتوي (خطي) False # a vertex point = Point (1،1) polygon.contains (point) False

لكن

polygon.touches (linearring) صحيح polygon.touches (point) صحيح polygon.intersect (linearring) true polygon.intersect (point) true

و

linearring.contains (point) صحيح

شاهد الفيديو: اقوي واسهل كورس بايثون في التاريخ. اساسيات مهمة. الدرس الثاني