これはどの程度一般的である必要がありますか? また、あなたの形やポイントはどのように表現されていますか? あなたのアルゴリズムは問題ないようです。それをコードに変換するのに助けが必要ですか?
さて、ここに私が思いついたものがあります。コードに関する注意事項:
- 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;
}