2

私は現在これを行うための悪い方法を持っています、それはx / y座標が現在の座標の上か下かによって、開始点を1 / -1だけ変換し、開始点.equals(end )、これは悪い解決策です。これは、下の黒いパスのように見える本当に悪いパスを作成するためです。

https://dl.dropbox.com/u/64681860/paths.png

2つのポイント間のポイントの直接パスを生成しようとしています(Graphics.drawLineと同じ種類の線)。

角度を取得するにはMathクラスを使用する必要があると思いますが、MathAPIについてはあまり詳しくありません。

4

4 に答える 4

5

やや単純な方法の 1 つは、角度ではなく勾配の比率を計算することです。

何かのようなもの:

float ratio = (y2 - y1) / (x2 - x1);

それで:

width = x2 - x1;
for(int i = 0; i < width; i++) {
    float x = x1 + i;
    float y = y1 + (ratio * i);
    points.add(new Point(x,y));
}

float が必要でない場合は、何らかの変換を行う必要があります。

また、x1 == x2 の特殊なケースを処理する必要があります。そうしないと、ゼロ除算エラーが発生します。

この方法を使用すると、ラインが急勾配であるほど、生成されるポイントが少なくなります。角度に関係なくポイントを均等に配置したい場合は、sin/cos/tan を分割する必要があります。

不具合を解決するために、少なくとも主要な 8 つのコンパス方向の線の単体テストを記述します。

于 2012-07-31T15:44:05.247 に答える
1

これは非常に単純な概念ですが、正確に何が必要かについてはあまり明確ではありません。定義上、任意の2つのポイントの間に無限の数のポイントがあります(そして、それらのポイントの2つの間に、無限の数のポイントが存在します。など)。

最も簡単な解決策は、ポイントAとポイントBの間の線の式を計算し、次に点をどれだけ離すかを決定し、線の式を使用してそれらの点を計算することです。

基本幾何学は、xの変化に対するyの変化の2点間の傾きを示しています。したがってm = (y1 - y2)/(x1 - x2)、これらの値はすべてdoubleであり、同じポイントx1y1属します。

次に、2点間の線の式はですy - y1 = m(x - x1)。次に、たとえば、の値をプラグインしx、結果を取得してy描画するだけです。

もちろん、これは全体の背後にある考え方です。ベクトルを使用する方がはるかに良いでしょう。

于 2012-07-31T15:45:49.217 に答える
1

これは実際には、プログラミングの問題というよりも数学の問題です。から へのベクトルを見つけてから、それをスケーリングして、必要startendポイントstart数に追加する必要があります。

擬似コード:

f(start,end,nPoints) -> (path)
   delta = (end-start) / nPoints //Find the best difference vector.
   current = start //Set the current point to the start.
   i = 0
   while(|current-end| < epsilon)
      current += delta
      path[i] = current
      i = i + 1

ポイントは浮動小数点であると想定しています(除算による)。 epslion小さい値を選択して (問題によって異なります)、等しいかどうかをチェックする必要があります (!=浮動小数点には使用しないでください!)。

于 2012-07-31T15:44:18.947 に答える
0

角度を計算するには、この以前に回答された質問を確認してください。そして、距離公式を使って距離を求めます。

double dist = Math.sqr((x2 - x1)^2 + (y2 - y1)^2);  //obviously wont compile but you get the idea.
于 2012-07-31T15:29:01.343 に答える