4

2 点を通る無限線 (終わりのない線、光線とも呼ばれます) を描く方法を探しています。Line2D を使用して 2 点間に線を引くことができますが、ここでは問題ありません。

次に、無限の部分を確認する必要がありました。私の単純な心で、2 番目のポイントの x 座標と y 座標に 100 を掛けて、線を描き直してみましょう。これは機能しますが、単純な場合のみです。

たとえば、さまざまな角度の線を生成する場合は次のとおりです。

    g.setColor(Color.red);
    g2.setStroke(new BasicStroke(4.0f));
    g2.draw(new Line2D.Double(0, 61.632653061218946, 944, 217.25510204080692));
    g.setColor(Color.blue);
    g2.setStroke(new BasicStroke(1.0f));
    g2.draw(new Line2D.Double(0, 61.632653061218946, 944*10, 217.25510204080692*10));

これにより、最初に太い赤い線が描画され、次に青い細い線が描画されます。

青い線は、赤い線とは角度が異なります。この効果を説明するスクリーンショットを次に示します。

ここに画像の説明を入力

誰かがこれを修正する方法を知っていますか、それとも2点を通る無限の線を描くより良い方法ですか?

4

2 に答える 2

7

2 番目の点を 10 倍すると、x と y の比率が維持されません。乗算する前に原点を減算する必要があります。

g2.draw(new Line2D.Double(0, 61.632653061218946, 944*10, (217.25510204080692-61.632653061218946)*10+61.632653061218946));動作するはずです。

一般的に、g2.draw(new Line2D.Double(x0,y0,(x1-x0)*k+x0,(y1-y0)*k+y0)動作するはずです。

この背後にある計算は、2 つの点をベクトル ( a& b) と見なすことです。ここで、3 番目と 4 番目のベクトルを定義します。差ベクトル ( d) と無限終点ベクトル ( c) です。b差分ベクトルは、単純にとの差aです。つまりd = b-a。無限の終点を見つけるには、差ベクトルの無限倍を開始点に追加するだけです ( a)。したがって、c = a + d*kk任意の大きな定数です。を交換dすると、 がありc = a+(b-a)*kます。

于 2012-09-05T17:35:54.233 に答える
4

ちょっと計算してみましょう。

  • 最初の行は(0, 61.632653061218946)-(944, 217.25510204080692). 坂道はrise/run、したがってm = 0.16485428917329234533898305084746
  • 2 行目は(0, 61.632653061218946)-(9440, 2172.5510204080692); m = 0.22361423382911549300847457627119.

傾斜が違うのは、角度が違うという別の言い方です。

あなたがする必要があるのは、ラインを延長することです。ポイントの 1 つの両方の座標に 10 を掛けることはできません。最初に、キャンバスの境界を超える x または y のいずれかを決定し、次に他の値を解きます

これどうやってやるの?

  1. まず、直線の方程式を取得します。直線は で定義されy=m*x+bmは傾き、bは y 切片です。

    1. rise/run勾配 ( = )の計算方法は既にわかっていますy2 - y1 / x2 - x1。我々が得る0.16485428917329234533898305084746
    2. 勾配を差し込んでb( y - m*x) を解くと、 が得られ61.632653061218946ます。あなたの場合、y切片はy座標であるため、すでにこの値を持っていますx=0.
    3. 次に、式を取得しますy = 0.16485428917329234533898305084746 * x + 61.632653061218946
  2. ここで、10000 などの十分に大きな x を選択します。この値を代入して、y について解きます。あなたが得る1710.1755447941423993898305084746

  3. 最後に、この新しいポイントに線を引きます。(0, 61.632653061218946)-(10000,1710.1755447941423993898305084746)

さて、これを一般化しましょう。

  • と の 2 つの点が(x1, y1)あり(x2, y2)ます。について解きたい(10000, y3)
  • したがって、y3 = m*x3 + b、またはy3 = m * 10000 + b.
  • もわかっているb = y - m * xので、これを差し込んで、ポイント 1 を任意に選択しy3 = m * 10000 + y1 - m * x1ます。
  • mわかりました、 :を因数分解しましょうy3 = m * (10000 + x1) - y1
  • はわかっているm = (y2 - y1) / (x2 - x1)ので、これを次のように挿入しますy3 = ((y2 - y1) / (x2 - x1)) * (10000 + x1) - y1

線が で始まらない場合はx = 0、 に対してこのプロセスを繰り返す必要があります。x = 0つまり、線をプロットする必要があります(0, ((y2 - y1) / (x2 - x1)) * x1 - y1)-(10000,((y2 - y1) / (x2 - x1)) * (10000 + x1) - y1)

注:x2 - x1が 0 の場合、勾配は無限になります。これは垂直線であり、このケースは個別に処理する必要があります。

于 2012-09-05T17:38:30.240 に答える