Çokgenlerin sentroidi tam olarak nasıl hesaplanır?


10

QGIS Geometri araçlarının -> çokgen sentroidinin nokta koordinatlarını tam olarak nasıl hesapladığını bilmek istiyorum. Örneğin, çokgenin yatılı kısmını küçük noktalara böler, maksimum iki mesafeden iki çift (uzunluk ve genişlik) iki çift alır ve bu iki çizginin kesişmesini sentroid olarak alır mı?

Yanıtlar:


13

QGIS, sentroidi bir JTS portu olan GEOS ile hesaplıyorsa, algoritma bu http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/algorithm/CentroidArea.html'dir . Teori hakkında, javadoc'ta http://www.faqs.org/faqs/graphics/algorithms-faq/ ile bir bağlantı vardır , bakınız bölüm 2.02: Bir çokgenin sentroidi nasıl hesaplanabilir ?.

Bir çokgenin sentroidi (yani kütle merkezi veya ağırlık merkezi), çokgenin üçgenlere bölünmesinin sentroidlerinin ağırlıklı toplamı olarak hesaplanabilir. Bir üçgenin centroidi basitçe üç köşesinin ortalamasıdır, yani (x1 + x2 + x3) / 3 ve (y1 + y2 + y3) / 3 koordinatlarına sahiptir. Bu, önce çokgenin üçgenlenmesini, daha sonra her bir üçgenin alanı ile ağırlıklandırılmış her üçgenin sentroidlerinin bir toplamının oluşturulmasını, toplamın toplam poligon alanı tarafından normalleştirilmesini önerir. Bu gerçekten işe yarıyor, ancak daha basit bir yöntem var: nirengi bir bölüm olmak zorunda değil, çokgen alanını hesaplarken kullanılan pozitif ve negatif yönelimli üçgenleri (pozitif ve negatif alanlarla) kullanabilir. Bu, işaretli alanlarıyla ağırlıklandırılmış toplam üçgen sentroidlerine dayanarak, sentroidi hesaplamak için çok basit bir algoritmaya yol açar. Üçgenler, herhangi bir sabit nokta, örneğin çokgenin tepe noktası v0 ve çokgenin ardışık kenarlarının iki uç noktası olarak alınabilir: (v1, v2), (v2, v3), vb. a, b, c köşeleri olan bir üçgenin bu ifadenin yarısıdır: (b [X] - a [X]) * (c [Y] - a [Y]) - (c [X] - a [X] ) * (b [Y] - a [Y]);

Code available at ftp://cs.smith.edu/pub/code/centroid.c (3K).
Reference: [Gems IV] pp.3-6; also includes code.

Bana öyle geliyor ki yöntem doğru. Koordinat değerlerinin nasıl kullanıldığını ve yuvarlama hataları vb. Olup olmadığını kontrol etmek istiyorsanız, JTS veya GEOS kaynak koduna bakabilirsiniz.


1
Birkaç bağlantı daha: gdal.org/python/osgeo.ogr.Geometry-class.html#Centroid , GDAL'ın geos.osgeo.org/doxygen/classgeos_1_1algorithm_1_1Centroid.html adresinde açıklanan GEOS yöntemini kullandığını belirtiyor . QGIS, arka planda GDAL işlevini kullanır.
AndreJ

2
Yöntem sadece çok küçük çokgenler için doğrudur. Büyük olanlar için dünyanın düz olmadığı sorunuyla karşılaşırsınız.
Peter Taylor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.