私は現在これを行うための悪い方法を持っています、それはx / y座標が現在の座標の上か下かによって、開始点を1 / -1だけ変換し、開始点.equals(end )、これは悪い解決策です。これは、下の黒いパスのように見える本当に悪いパスを作成するためです。
2つのポイント間のポイントの直接パスを生成しようとしています(Graphics.drawLineと同じ種類の線)。
角度を取得するにはMathクラスを使用する必要があると思いますが、MathAPIについてはあまり詳しくありません。
やや単純な方法の 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 つのコンパス方向の線の単体テストを記述します。
これは非常に単純な概念ですが、正確に何が必要かについてはあまり明確ではありません。定義上、任意の2つのポイントの間に無限の数のポイントがあります(そして、それらのポイントの2つの間に、無限の数のポイントが存在します。など)。
最も簡単な解決策は、ポイントAとポイントBの間の線の式を計算し、次に点をどれだけ離すかを決定し、線の式を使用してそれらの点を計算することです。
基本幾何学は、xの変化に対するyの変化の2点間の傾きを示しています。したがってm = (y1 - y2)/(x1 - x2)
、これらの値はすべてdoubleであり、同じポイントx1
にy1
属します。
次に、2点間の線の式はですy - y1 = m(x - x1)
。次に、たとえば、の値をプラグインしx
、結果を取得してy
描画するだけです。
もちろん、これは全体の背後にある考え方です。ベクトルを使用する方がはるかに良いでしょう。
これは実際には、プログラミングの問題というよりも数学の問題です。から へのベクトルを見つけてから、それをスケーリングして、必要start
なend
ポイント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
小さい値を選択して (問題によって異なります)、等しいかどうかをチェックする必要があります (!=
浮動小数点には使用しないでください!)。
角度を計算するには、この以前に回答された質問を確認してください。そして、距離公式を使って距離を求めます。
double dist = Math.sqr((x2 - x1)^2 + (y2 - y1)^2); //obviously wont compile but you get the idea.