私は配列を持っています:int [] [] lawn = new int [980] [1280];円内のすべてのデカルト点を計算する
ブレードの高さの値を芝生に保存します。
私のシミュレーションでは、芝生を回ってブレードを切断するロボットがあります。
私のロボットは、直径(rDiameter)の円の形をしています。 座標系はDoubleで、私の芝生はIntegerです。
私はロボットが芝生を切断できるように2つの "アルゴリズム"を開発しましたが、私のアルゴリズムの精度は十分ではなく、性能も十分ではないため満足できません。
私の質問は、私がすでに考えているアイデア以外にこれを行う方法はありますか?
また、より良い結果を得るために芝生の実装を変更する必要がありますか?
十分明確でない場合は何でもお気軽にお問い合わせください。ここ
は私の2つのアルゴリズム(kはロボットを表す)、中心位置は、ここで私のロボットの中心(SO円の中心)
approach with square
int bottomLeftCornerX = (int) (k.getCenterPosition().getX() - simulParams.getKDiameter()/2);
int bottomLeftCornerY = (int) (k.getCenterPosition().getY() - simulParams.getKDiameter()/2);
for (int i = bottomLeftCornerX; i < bottomLeftCornerX + simulParams.getKDiameter(); i++) {
for (int j = bottomLeftCornerY; j < bottomLeftCornerY + simulParams.getKDiameter(); j++) {
((LawnArea) lawn.getBladeHeight()).cutBladeInArea(j, i);
}
}
円のアプローチの1つを返すためのコードであります(基本的には、ウィキペディアの中に存在する循環型式です...):
for (int r = 0; r < simulParams.getKDiameter()/2; r++) {
for (double t = 0; t < 2 * Math.PI; t = t + 0.1) {
Point2D p = circumference(k.getCenterPosition().getX(), k.getCenterPosition().getY(), t, r);
int intX = (int) Math.ceil(p.getX());
int intY = (int) Math.ceil(p.getY());
((LawnArea) lawn.getBladeHeight()).cutBladeInArea(intY, intX);
}
}
}
なぜ中点サークルアルゴリズムを使用するのではなく、座標を配列に格納してから、円ごとに行を塗りつぶすのはなぜですか? – harold