2016-05-08 10 views
0

drawLine関数を作成したいのですが、グラフィックスクラスを使用することはできません(ピクセルを設定することはできます)。私はこの方法を試しましたhttps://en.wikipedia.org/wiki/Bresenham's_line_algorithm#Methodしかし、これは、行が左上から右下に向かい、例えば右上から左下に行く場合にのみ機能します。誰もこれを行う方法がありますか?私が持っている現在のコード:Draw line function

public void drawLine(int startX, int startY, int endX, int endY) { 
    double deltaX = endX - startX; 
    double deltaY = endY - startY; 
    double error = -1; 
    double deltaError = Math.abs(deltaY/deltaX); 
    int y = startY; 

    for (int x = startX; x < endX - 1; x++) { 
     error += deltaError; 

     if (error >= 0) { 
      y++; 
      error--; 
     } 

     drawPixel(x, y); 
    } 
} 

すべてのヘルプは高く評価されます。

私はそれを解決しました。最終結果はこれです。

public void drawLine(int startX, int startY, int endX, int endY) { 
    if (startX > endX && startY > endY) { 
     int startXCopy = startX; 
     startX = endX; 
     endX = startXCopy; 

     int startYCopy = startY; 
     startY = endY; 
     endY = startYCopy; 
    } 

    double deltaX = endX - startX; 
    double deltaY = endY - startY; 
    double error = -1; 
    double deltaError = Math.abs(deltaY/deltaX); 

    if (deltaX == 0) { 
     for (int y = startY; y < endY; y++) 
      drawPixel(startX, y); 
    } 

    if (deltaY == 0) { 
     for (int x = startX; x < endX; x++) 
      drawPixel(x, startY); 
    } 

    if (deltaX >= deltaY) { 
     int y = startY; 
     int yDirection = endY > startY ? 1 : -1; 

     for (int x = startX; x < endX - 1; x++) { 
      error += deltaError; 

      if (error >= 0) { 
       y += yDirection; 
       error--; 
      } 

      drawPixel(x, y); 
     } 
    } else if (deltaY > deltaX) { 
     int x = startX; 
     int xDirection = endX > startX ? 1 : -1; 

     for (int y = startY; y < endY - 1; y++) { 
      error += deltaError; 

      if (error >= 0) { 
       x += xDirection; 
       error--; 
      } 

      drawPixel(x, y); 
     } 
    } 
} 
+0

重要な情報がありません:どのGUIライブラリを使用していますか? –

+0

私は実際にGUIライブラリを使用していません。私はこれらのメソッドにアクセスできます:drawPixel、drawText、drawImage、drawRect、およびfillRect – stefvanschie

+0

''私はこれらのメソッドにアクセスできます... " - アクセス***どうやって***? –

答えて

0

線を描くことは簡単な数学問題であり、さまざまな方法で達成できます。あなたが必要なもの がmm=(y2−y1)/(x2−x1)として定義され、あなたの傾きである基本的な線形euqation y = f(x) = mx + b で、bはあなたのstartYと値であり、xx_iがあなたのライン上のあなたの現在のポイントであるx = x_i - startXで表現されます。次に、開始点と終了点の間の線にある各x_i値のすべてのy値を計算できます。ポイントの数は、解像度係数によって決まります。

double slope = (double)(endY - startY)/(endX - startX); 
//adjustable resolution factor 
double resolution = 1; 
double x = startX; 
while (x <= endX) { 
    double y = slope * (x - startX) + startY; 
    drawPixel(x, y); 
    x += resolution; 
}