2016-03-31 15 views
3

Sorunla karşılaştım ve nasıl çözeceğimi bilmiyorum.Saatlerin saat yönünün ayrılması

Noktaların listesini, bir yol oluşturmak için tüm noktaların olacak şekilde sıralamaya çalışıyorum. Şimdiye kadar yaptığım şey listedeki tüm noktaların merkez noktasını hesapladım ve daha sonra sıralama işleminin yapıldığı this post kodunu kullandım. İşte ödünç kod parçacığı:

public int Compare(Point3D pointA, Point3D pointB) 
{ 
    if (pointA.X - CenterPoint.X >= 0 && pointB.X - CenterPoint.X < 0) 
     return 1; 
    if (pointA.X - CenterPoint.X < 0 && pointB.X - CenterPoint.X >= 0) 
     return -1; 

    if (pointA.X - CenterPoint.X == 0 && pointB.X - CenterPoint.X == 0) 
    { 
     if (pointA.Y - CenterPoint.Y >= 0 || pointB.Y - CenterPoint.Y >= 0) 
      if (pointA.Y > pointB.Y) 
       return 1; 
      else return -1; 
     if (pointB.Y > pointA.Y) 
      return 1; 
     else return -1; 
    } 

    // compute the cross product of vectors (CenterPoint -> a) x (CenterPoint -> b) 
    double det = (pointA.X - CenterPoint.X)*(pointB.Y - CenterPoint.Y) - 
        (pointB.X - CenterPoint.X)*(pointA.Y - CenterPoint.Y); 
    if (det < 0) 
     return 1; 
    if (det > 0) 
     return -1; 

    // points a and b are on the same line from the CenterPoint 
    // check which point is closer to the CenterPoint 
    double d1 = (pointA.X - CenterPoint.X)*(pointA.X - CenterPoint.X) + 
        (pointA.Y - CenterPoint.Y)*(pointA.Y - CenterPoint.Y); 
    double d2 = (pointB.X - CenterPoint.X)*(pointB.X - CenterPoint.X) + 
        (pointB.Y - CenterPoint.Y)*(pointB.Y - CenterPoint.Y); 
    if (d1 > d2) 
     return 1; 
    else return -1; 
} 

sorunsuz çalışıyor ama bazen harikalar çalışır Bazı durumlarda, ekteki resimler bakın, siyah nokta hesaplanır merkez noktası:

Picture A, black dot is a center Point

resim A'da herşey yolunda ama iki yatay çizgiler oluşturan noktaları yukarı taşımak için karar verirseniz, ben bu işe çalıştırın:

PictureB,black dot is a center Point

Yeşil çizgi nasıl görünmesi gerektiği, siyah çizgi gerçekten nasıl göründüğü ve neden böyle olduğunu anlayamıyorum. Aynı sonuçlarla atan() çözümlerini denedim. Herhangi bir yardım gerçekten takdir edilecektir.

+1

Resimlerinize hesaplanan merkezi noktanın konumunu eklemenin ilginç olacağını düşünüyorum – pm100

+0

Ana göreviniz nedir? – gabba

+0

Bir nokta listem var ve bu noktalar üzerinden yol çizmek istiyorum. Ne yazık ki sıralanmamış ve yanlış sonuçlar veriyorlar. Bu yüzden onları kendim ayırmaya çalışıyorum. @gabba – niks

cevap

2

Örneklerinizde saat yönüne göre sıralanan noktalar. Fakat ikinci örnek için bu yöntem uygun değildir. Saat yönünde algoritma sadece dışbükey şekiller üzerinde çalışacaktır.

Şu anda merkezi bir nokta olmaksızın desteklenen desteklenmeyen örneklerin örneği. Eğer bazı noktaları kümesi var ve bunları bağlamak için nasıl bilmiyorum ve özgün figür geri yükleyemezsiniz şekil hakkında hiçbir şey bilmiyorum Yani eğer

enter image description here

.

+0

Yani içbükey çokgenlerim varsa, doğru yolu çizmek için noktaları sıralamak mümkün değil mi? – niks

+1

@niks: İlk çokgen de içbükeydir. Algoritma, merkez nokta çekirdekte olduğunda [yıldız şekilli çokgenler] (https://en.wikipedia.org/wiki/Star-shaped_polygon) üzerinde çalışır. Konveks poligonlar yıldız şekillidir ve çekirdeği bütün poligondur, bu yüzden saat yönüne göre sıralama onlar için çalışmaya tabi tutulur. Merkezin T haç çubuklarının bulunduğu yere taşınması için bir yol bulursanız, ikinci çokgen için de saat yönünde sıralama kullanabilirsiniz. –

+1

@MOehm, Tüm durumlarda çalışmak için algoritma yapmanın bir yolu yoktur. – gabba

İlgili konular