أكثر

ما هو التعريف والخوارزميات والحلول العملية لـ Concave Hull؟


هيكل محدب

يتم تعريف بدن الشكل المحدب على النحو التالي:

في الرياضيات ، الهيكل المحدب أو المغلف المحدب لمجموعة من النقاط X في مساحة متجهية حقيقية V هي المجموعة المحدبة الأدنى التي تحتوي على X (ويكيبيديا)

تتصور ويكيبيديا ذلك جيدًا باستخدام تشبيه الشريط المطاطي ، وهناك بعض الخوارزميات الجيدة لحسابه.

هال مقعر

يتم تصور بدن مقعر باستخدام الخط الأحمر في الصورة أدناه (الخط الأزرق يصور بدن محدب). حدسيًا ، هو مضلع يحتوي على جميع النقاط ، ولكن به مساحة أقل (الحد الأدنى؟) مقارنة بالبدن المحدب. نتيجة لذلك ، يكون طول حدود المضلع أطول.

قد يكون الهيكل المقعر هو الحل لبعض مشاكل العالم الحقيقي (مثل إيجاد الحدود المعقولة للمدينة).

لقد فشلت في العثور على تعريف مناسب وخوارزمية وحل عملي لمفهوم الهيكل المقعر. يحتوي Grass Wiki على بعض الأوصاف والصور ، وهناك حل تجاري في concavehull.com.

أي أفكار وخوارزميات وروابط؟


كما يشير scw ، فأنت تريد تنفيذ أشكال α.

يمكن اعتبار أشكال ألفا تعميمًا للبدن المحدب. تم وصفها لأول مرة في عام 1981 في:

إيدلسبرونر ، هـ. كيركباتريك ، د. سيدل ، ر. ، "على شكل مجموعة من النقاط في الطائرة ،" نظرية المعلومات ، IEEE Transactions on ، المجلد 29 ، العدد 4 ، الصفحات 551-559 ، يوليو 1983

توجد تطبيقات مفتوحة المصدر للبيئات التي تهتم بها:

PostGIS

إذا كنت تستخدم مكدس PostGIS ، فإن ملحق مسافة القيادة الاختياري الخاص بـ pgRouting يعرض تطبيق شكل ألفا. لست متأكدًا مما إذا كان بإمكانك تغيير معلمة ألفا أم لا.

الاستخدام أدناه:

حدد the_geom AS alpha_shape من Points_as_polygon ('SELECT id، ST_X (your_geom) AS x، ST_Y (your_geom) AS y FROM your_table') ؛

بايثون

ربما هناك العديد من وحدات Python التي يمكنك استخدامها. لقد سمعت أشياء جيدة عن CGAL ، مكتبة هندسة حسابية بلغة ++ C. توجد أغلفة Python لأجزاء من CGAL ، بما في ذلك تعريض تطبيق شكل ألفا لـ CGAL إلى Python.

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


هذا ما تبحث عنه

يمكنك تحميل واختبار البرنامج: (في جافا ، تحت رخصة GPL)

الورقة التي تعرض الخوارزمية موجودة:

Duckham، M.، Kulik، L.، Worboys، M.F.، Galton، A. (2008) توليد فعال للمضلعات البسيطة لوصف شكل مجموعة من النقاط في المستوى. التعرف على الأنماط الإصدار 41 ، 3224-3236


يبدو أن هذا تطبيق محدد لأشكال ألفا ، والتي هي من قراءتي شكلاً أكثر عمومية لهذه المشكلة. يحتوي R على وحدة alphahull ، التي تحتوي على وثائق ممتازة حول حساب أشكال ألفا. تحقق أيضًا من هذه الخلفية التفصيلية على أشكال ألفا. إذا كنت ترغب فقط في حساب هياكل محدبة / مقعرة ، تحقق من lasboundary ، وهو جزء من lastools ، فإنه يتوسع جيدًا ويمكنه التعامل مع الملايين من نقاط الإدخال.

أخيرًا ، هذا التطبيق المثير للاهتمام لأشكال ألفا بواسطة Flickr جعل الجولات منذ فترة ، موضحًا فائدتها لتجميع محتوى النقاط الذي تم إنشاؤه بواسطة المستخدم:


هناك تطبيق ST_ConcaveHull في صندوق PostGIS. http://postgis.net/docs/ST_ConcaveHull.html


لقد صنعت أداة عالية الكفاءة تسمى لاسبوندري (1،2) ، الذي يحسب بدنًا مقعرًا لـ LIDAR بتنسيق LAS / LAZ / SHP / ASCII ويخزن النتيجة كمضلع حد متجه بتنسيق ESRI Shapefile أو ملف KML ذي المرجعية الجغرافية.

هنا مثال على الجري:

C:  lastools  bin> lasboundary -i SerpentMound.las -o SerpentMound_boundary.shp قراءة 3265110 نقطة وحساب بدن محدب لـ 3265110 نقطة ينمو داخليًا نحو بدن مقعر (مع التقعر = 50) إخراج بدن مقعر بدن به 1639 نقطة

بعض صور النتائج هنا.


فيما يلي وظيفة R التي تنفذ نموذج Alpha Hull. الناتج هو كائن sp مضلع. يرجى الاطلاع على المثال في العنوان. يتطلب حزم sp و alphahull و maptools.

** تحديث (01-15-2018) تم إجراء العديد من التغييرات على الكائنات الناتجة التي تنتجها حزمة alphahull. على هذا النحو ، كنت بحاجة إلى إعادة كتابة الوظيفة. أضفت دالة محدبة إلى حزمة المكاني الاقتصادي. ومع ذلك ، نظرًا لقيود الترخيص في حزمة alphahull ، لا تتوفر هذه الوظيفة إلا في إصدار التطوير على GitHub. يمكن تثبيت نسخة التطوير باستخدام:

مكتبة (devtools) install_github ("jeffreyevans / spatialEco")

هنا مثال على استخدام الوظائف

مكتبة (sp) مكتبة (spatialEco) إحداثيات البيانات (meuse) (meuse) = ~ x + y a <- convexHull (meuse، alpha = 100000) plot (a) points (meuse، pch = 19)

تحويل SpatialLinesDataFrame الناتج إلى SpatialPolygonsDataFrame

مكتبة (sf) a <- sf :: st_as_sf (a) a <- sf :: st_polygonize (a) class (a <- as (a، "spatial")) plot (a)

اختبر عدة قيم ألفا

par (mfcol = c (2،2)) لـ (a in c (500، 1500، 5000، 100000)) {ch <- convexHull (meuse، alpha = a) plot (ch) Points (meuse، pch = 19) العنوان (لصق 0 ("alpha ="، a))}


حول تطبيق R Alpha-Shapes ، هناك مقال حول "تحويل أشكال Alpha إلى كائنات SP"

يعتمد على alphahull و sp و spgrass6 http://casoilresource.lawr.ucdavis.edu/drupal/node/919


يوفر JTS (https://github.com/locationtech/jts) تنفيذ Convex Hull. ذكر مارتن ديفيز أيضًا وجود خوارزمية Alpha Shape قيد التشغيل ، لذا قد ترغب في التحقق من مستودع SVN لمعرفة ما إذا كان موجودًا حتى الآن إذا كان هذا هو ما تريده.


بالحديث عن JTS ، يمكنك استخدام Geoscript لمعالجة مكتبة JTS. http://geoscriptblog.blogspot.com/2010/06/unwrapped-jts-with-python.html لمقال حول الهيكل المحدب. تتوفر تطبيقات GeoScript في JavaScript و Python و Scala و Groovy. الموقع الرسمي: http://geoscript.org


إليك برنامج مكتوب بلغة C يحسب الهياكل المحدبة وأشكال ألفا ومثلثات Delauney ومجلدات Voronoi:

  • هال - كين كلاركسون (2002)

خوارزمية بدن محدبة أخرى مع تطبيقات C و Java هنا:

  • هيكل محدب (2D) - الهندسة الحسابية في C ، جوزيف أورورك (1998)

للإضافة إلى الإجابات السابقة لهذا المنشور ، على الأقل اعتبارًا من QGIS 2.6 يحتوي على خوارزمية بدن مقعر

المعلمات
طبقة نقطة الإدخال [المتجه: نقطة]
ضع وصف المعلمة هنا

العتبة (0-1 ، حيث 1 مكافئ لـ Convex Hull) [number]
ضع وصف المعلمة هنا
الافتراضي: 0.3

السماح بالثقوب [قيمة منطقية]
ضع وصف المعلمة هنا
الافتراضي: صحيح

تقسيم الهندسة متعددة الأجزاء إلى أشكال هندسية لأجزاء فردية [قيمة منطقية]
الافتراضي: خطأ

المخرجات بدن مقعر [متجه]
ضع وصف الإخراج هنا

استخدام وحدة التحكم
Processing.runalg ('qgis: concavehull' ، المدخلات ، ألفا ، الثقوب ، no_multigeometry ، الإخراج)

أيضًا ، لدى Esri أداة هندسة الحد الأدنى من الحدود (إدارة البيانات)

مما يسمح لك باختيار النوع الهندسي الذي يتضمن بدن محدب


يتوفر ملحق جديد لـ GRASS GIS 7: v.concave.hull. راجع أيضًا http://grasswiki.osgeo.org/wiki/Create_concave_hull


للمساعدة في "التعريف المناسب" جزء من سؤالك ؛ ربما تكون قد نظرت إلى https://en.wikipedia.org/wiki/Convex_hull وحصلت على ما يمكن اعتباره تعريفًا "مناسبًا" ، لكنك وجدت أنه غير موجود ، لذلك ربما يكون التعريف الأكثر "مفيدًا" هو:

ل كل نقطة داخل بدن محدب ، خط مستقيم ل أي النقطة التي ليست داخل الهيكل ستتقاطع مع الهيكل مرة واحدة فقط.

هذا مفيد لأنه بالنظر إلى نقطة ما ، يمكنك إنشاء خط خلالها واختبار ذلك الخط الذي تم إنشاؤه لأجزاء متقاطعة من الهيكل.

  • لا يوجد تقاطع النقطة ليست في بدن السفينة.
  • تقاطع النقطة على البدن.
  • تقاطعان النقطة داخل البدن
  • لا يمكن أن يتقاطع الخط المستقيم مع بدن محدب أكثر من مرتين


شاهد الفيديو: Алгоритми з розгалуженням (شهر اكتوبر 2021).