2012-04-24 38 views
0

我很難將此優雅地表達到算法中。一個形狀上的均勻分佈算法

所以我有一個給定的直邊形狀(即正方形,雖然最終形狀並不重要,只是終點)。我得到一個直角座標系上的邊界端點:(2,-2)(2,2)(-2,2)(-2,-2)

我給定點的任意數(即。7)我想沿着形狀的邊緣(在這種情況下是一個正方形)均勻地分佈這些點(x,y)。

我現在的想法是讓所有端點的總長度,通過點的數量除以該得到一個段長(然後我對標準化的邊緣)。然後我從端點到終點,找到這個數量之間的點,並累加歸一化的切片,當這個總數超過1.0時,我迭代終點並取其餘部分並從那裏開始......或類似的東西。

有人能幫幫我(最好是C#)把這個變成一個算法,或者如果你有一個更好的解決方案請不要告訴。我可以想象有一個排序或分配/劃分算法,可能會有相同的影響,但我找不到任何。我希望這不是顯而易見的。

+0

在何種意義上的統一?弧長測量? – Mikola 2012-04-24 08:46:24

+0

關於直線路徑均勻間隔,我有一個單獨的算法來處理弧長和圓 – user1229895 2012-04-24 08:51:33

回答

2

這需要多大?另外,如何表示你的形狀和點?你的算法似乎沒問題;你需要幫助把它變成代碼嗎?


好吧,這是我想出的東西。 備註代碼:

  • 距離方法需要兩個點並返回它們之間的距離。
  • 的標準化的方法需要兩個點,並返回從第一點到第二點指向的法線矢量。
  • Point類具有由一個標量
  • Point類乘以點已浮起乘法方法(或雙)精度

我使用Point類來表示的方式的載體。

我沒有測試過這一點,所以有可能是錯誤。這個算法如何處理確切的區域可能會有問題(例如,你的正方形有4個點)。如果有問題或者您有任何問題,請告知我們! :)

Point[] shapePoints; //already initialized 
int numPoints; //already initialized 
Point[] retPoints = new Point[numPoints]; 
int totalLength; 
for(int i = 1; i < shapePoints.length; i++){ 
    totalLength += distance(shapePoints[i], (shapePoints[i-1])); 
} 
float segLength = ((float) totalLength)/numPoints); 
Point currShape = shapePoints[0]; 
Point nextShape = shapePoints[1]; 
Point prev = currShape; 
int counter = 2; 
while(numPoints > 0){ 
    Point norm = normalize(new Point(nextShape.x - currShape.x, nextShape.y - currShape.y)); 
    if(distance(nextShape, prev) < segLength){ 
     int tempLength = segLength; 
     tempLength -= distance(nextShape, prev); 
     currShape = nextShape; 
     nextShape = shapePoints[counter]; 
     counter ++; 
     norm = normalize(new Point(nextShape.x - currShape.x, nextShape.y - currShape.y)); 
     norm.multiply(tempLength); 
    } 
    else{ 
     norm.multiply(segLength); 
    }  
    retPoints[numPoints - 1] = norm; 
    prev = retPoints[numPoints - 1]; 
    numPoints --; 
} 

Point normalize(Point p){ 
    int scale = Math.sqrt(p.x * p.x + p.y * p.y); 
    p.x = p.x/scale; 
    p.y = p.y/scale; 
    return p; 
} 
+0

以及現在我想要得到的就是點(x,y)。這是相當普遍的,因爲(直線)形狀沒有區別。我真的只處理端點。是的,我無法將其優雅地轉換成代碼=) – user1229895 2012-04-24 08:50:04

+0

好的。我現在正在寫東西:)應該儘快完成。 – moowiz2020 2012-04-24 08:55:55

+1

哈哈,你是比我更聰明的人,謝謝! ;-) – user1229895 2012-04-24 08:57:19