0

現在、ポイントグリッドを生成するアルゴリズムがあります。lxこれは、x( )の長さとy( )の長さの形式でユーザーからの入力を受け取り、ポイントの間隔を空けるためにlyどの増分(デルタ)(dxおよび)を使用します。とで定義された境界正方形のエッジで常に開始および終了dyするポイントが必要です。私はいくつかの方法を試しました:lxly

境界正方形の開始エッジは次のように定義されます。

double startx = lx / -2.0, starty = ly / -2.0;

私の最初の方法は、ポイントとラウンドの数を決定します。

int numintervalx = round(lx / dx), numintervaly = round(ly / dy);

2番目の方法では、ポイントの数を決定し、ポイントの数よりも大きい最も近い整数を使用します。

int numintervalx = ceil(lx / dx), numintervaly = ceil(ly / dy);

私の3番目の方法は、ポイントの数を決定し、ポイントの数よりも少ない最も近い整数を使用します。

int numintervalx = floor(lx / dx), numintervaly = floor(ly / dy);

次に、デルタがバウンディングボックスに合うように再計算されます。

dx = lx / double(numintervalx);
dy = ly / double(numintervaly);

for次に、これらはポイント自体を生成するループに送られます。

for (int i = 0; i <= numintervaly; i++)
  for (int j = 0; j <= numintervalx; j++)
  {
    double point[3] = {startx + dx * j, starty + dy * i, 0};
  }

実際のグリッドをユーザー指定のグリッドに近づけ、常にエッジで開始および終了する、別のより正確な方法はありますか?

4

3 に答える 3

1

整数変換はエラーの追加と考えてください。その場合、整数に変換するときに追加されるエラーを最小限に抑える方法は丸めです。最悪のケースは、ユーザーがlx / dxがsomething.5になるような値を入力した場合です。これは、丸め誤差が0.5であることを意味します。あなたの問題を考えると、これはあなたができる最善のことです。

実際にはnumpointsよりも1つ多いポイントを作成するため、numpointsの名前をnumintervalsなどに変更することを検討してください。これは奇妙なことです。

于 2012-05-24T19:42:49.607 に答える
0

それぞれとの倍数であるlxとの値をユーザーに提供するように要求します。もちろん、これには基本的な入力検証が必要ですが、実際のグリッドがユーザー指定のグリッドとまったく同じであり、ポイントは常にエッジで開始および終了することが保証されます。lydxdy

于 2012-05-24T19:17:12.900 に答える
0

lx入力がの整数倍と互換性があることは明らかに保証されていないdxため、問題が発生します。したがって、互換性のある入力を要求する必要があります。理想的には、アプリケーションでより意味のあるnx入力と、dxまたはのいずれかを使用します。lx

または、ユーザー入力をガイドとしてのみ扱うこともできます。

nx = int(ceil(lx/dx));    // get suitable number of points
dx = lx/nx;               // set suitable spacing to fit range exactly
于 2012-05-24T19:30:39.193 に答える