2012-01-27 16 views
8

Haritadaki bir nokta kümesini temsil etmek için uzamsal verileri kullanan bir çözüm var. Söz konusu kümelenme kümesini içerebilen minimum sınırlayıcı dikdörtgeni bulmak için bir kümenin uzantılarını temsil eden koordinatları kullanma ihtiyacım var.2 Boyutlu Minimum Sınırlama Dikdörtgeni Koordinatlarla Hesaplayın

Bunu hesaplayabilmek için basit bir algoritma var mı, yoksa bunu başarmak için C# işlevinde herhangi bir işlev var mı? NetTopologySuite'ın farkındayım, ancak aynı amaca ulaşmak için bunu nasıl kullanabilirim? Koordinatların bir listesi var, bu yüzden bu dizeleri ona aktarmalı ve MBR'yi çıkarmalıyım. bunu yapmak için basit yolu şöyle olabilir gerçi mümkün

+0

Ne yazık ki, bu sorunla nereden başlayacağımı bilmiyorum. Koordinatlarımın bir dizi yazı dizisinde olduğunu ve buradan nasıl hareket edeceğime emin olduğum aşamadayım. – CSharpened

+1

@ İki türünüz olduğunu düşünün: eksen hizalama sınırlayıcı kutu; basitçe min x/y ve max x/y değerini bularak bulunur. Ya da daha karmaşık olan keyfi yönlendirilmiş sınırlayıcı kutunuz var (http://en.wikipedia.org/wiki/Minimum_bounding_box_algorithms). Eğer teknik olarak hala bir kutu çiziyor olsanız da, dünyanın eğriliğini hesaba katmanız gerekiyorsa, bu daha karmaşık hale getirilir, ancak aslında bunun yerine bir küre yüzeyinin bir bölümüdür (muhtemelen ihtiyacınız olan şey için çok fazla) –

+0

Görüyorum. Kutu için 4 koordinat sağlayacak bir işleve ihtiyacım var. Yani iki X değeri ve iki Y değeri. Bunu yapmanın en iyi yolunun koordinatlarımı bölmek ve daha sonra en düşük X değerini ve minimum Y değerini bulmak için hepsini karşılaştırmak olduğunu söyleyebilir miydiniz? Eğer bunu yapsaydım, o zaman sadece bir minX değeri ve bir maxY değeri alacağımı varsayardım?Bu iki rakamdan diğer X ve Y değerlerini hesaplamak mümkün mü? Üzgünüm biraz kayıp gibi görünüyorsa. Mekansal alanım değil. – CSharpened

cevap

10

En kolay çözüm, ve en çok aradığınız olası olanı varsayalım, yalnızca min/max x & y değerlerini bulmak için kullanılan eksen hizalama sınırlayıcı kutusunu hesaplamaktır. bunlardan bir kutu inşa etmek.

point[] points = [[x = -2, y = 0], [x = 1, y = 2], [x = 1, y = 1], [x = -1, y = -2]]; 
box bounds = bounding_box(points); 
:

Sana Yani bunlar verilmiş senin geometri içinde ...

type point { float x; float y; } 
type box { point topleft; point topright; point bottomleft; point 

function bounding_box(points) 
{ 
    xmin = min(points.x) 
    xmax = max(points.x) 
    ymin = min(points.y) 
    ymax = max(points.y) 

    return new box{ 
    topleft = { x = xmin, y = ymax }, 
    topright = { x = xmax, y = ymax }, 
    bottomleft = { x = xmin, y = ymin }, 
    bottomright = { x = xmax, y = ymin } 
    }; 
} 

ifade edilir türlerini gönderme yapmamış verilen, size bunun için yapay olarak kodu vereceğiz

aşağıdakilerden tüm doğru olacaktır: elbette

bounds.topleft == [x = -2, y = 2]; 
bounds.topright == [x = 1, y = 2]; 
bounds.bottomleft == [x = -2, y = -2]; 
bounds.bottomright == [x = -1, y = -2]; 

, sistem t düşük koordinatları vardır koordinatı op (ör. tipik bir ekran gibi - o zaman hesaplamayı tersine çevirmelisiniz; veya sonucu önce nesne-boşlukta hesaplayın ve daha sonra mantıksal alana dönüştürün.

Gelecekte isteğe göre hizalanmış bir kutuyu güncellemek için gelecekte karar vermeniz durumunda, dört köşeyi ifade eden kutunun türü için gittim (aynı yöntemle bir nokta kullanabilirsiniz). Bunun için + 2 vektörler).

+0

Tam olarak ne olduğumu görüyorum. Teşekkürler. – CSharpened

6

biri: Bu tabii yapar

public Rectangle Test(List<Point> points) 
{ 
    // Add checks here, if necessary, to make sure that points is not null, 
    // and that it contains at least one (or perhaps two?) elements 

    var minX = points.Min(p => p.X); 
    var minY = points.Min(p => p.Y); 
    var maxX = points.Max(p => p.X); 
    var maxY = points.Max(p => p.Y); 

    return new Rectangle(new Point(minX, minY), new Size(maxX-minX, maxY-minY)); 
} 

dikey ve yatay olarak hizalanmış bir dikdörtgen için aradığınız varsayalım. Yani mümkün olan en küçük dikdörtgeni arıyorsanız, nasıl döndürülürse yapın, bu sizin için değildir.