0

これをエレガントにアルゴリズムに定式化するのは難しいです。

だから私は与えられたまっすぐな形をしています(つまり、四角形ですが、最終的な形は端点だけではありません)。デカルト座標系で境界端点を取得します: (2,-2) (2,2) (-2,2) (-2,-2)

任意の数のポイント (つまり 7) が与えられ、これらのポイント (x、y) を形状 (この場合は正方形) の端に沿って均一に広げたいと考えています。

私の現在の考えは、すべてのエンドポイントの合計の長さを取得し、これをポイントの数で割ってセグメントの長さを取得することです (これをエッジに対して正規化します)。次に、エンドポイントからエンドポイントに移動して、この量の間のポイントを見つけ、正規化されたスライスを獲得します。この合計が 1.0 を超えると、エンドポイントを反復し、残りを取り、そこから開始します...またはそのようなものです。

誰かがこれをアルゴリズム(できればC#)に入れるのを手伝ってもらえますか、またはより良い解決策がある場合は教えてください。同じ影響を与える可能性のある並べ替えまたは分散/分割アルゴリズムがあると思いますが、見つかりませんでした。これが露骨に明白でないことを願っています。

4

1 に答える 1

2

これはどの程度一般的である必要がありますか? また、あなたの形やポイントはどのように表現されていますか? あなたのアルゴリズムは問題ないようです。それをコードに変換するのに助けが必要ですか?


さて、ここに私が思いついたものがあります。コードに関する注意事項:

  • distance メソッドは 2 つの Point を取り、それらの間の距離を返します。
  • normalize メソッドは 2 つの点を取り、最初の点から 2 番目の点を指す法線ベクトルを返します。
  • Point クラスには、ポイントをスカラーで乗算する乗算メソッドがあります。
  • Point クラスには float (または double) 精度があります

ところで、ベクトルを表すために 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;
}
于 2012-04-24T08:46:07.630 に答える