2013-11-10 26 views
-1

我正在編寫一個Java程序,它非常類似於Microsoft Paint。它可以繪製四種不同的形狀:線條,橢圓形,矩形和正方形。我非常接近完成這一點,但我堅持繪製正方形的邏輯。通過拖動鼠標繪製一個方塊

繪製這些形狀時有兩點涉及。第一個Point(point1)是當用戶按下鼠標按鈕,第二個Point(point2)是當用戶在畫布上拖動鼠標時。我相信繪製矩形和方形應該非常相似,但是讓我困惑的部分是繪製正方形時,兩邊的長度相等,所以point2並不完全位於鼠標所在的位置。

下面是參考fillRect()方法的標題:

fillRect(x, y, width, height) 

我給繪製矩形功能代碼如下:

g.fillRect((((point1.x < point2.x) ? point1.x : point2.x)), 
      ((point1.y < point2.y) ? point1.y : point2.y), 
      Math.abs(point2.x - point1.x), 
      Math.abs(point2.y - point1.y)); 

我使用相同的代碼用於繪製平方除改變試圖高度參數等於寬度參數,因爲正方形具有相等長度的邊:

g.fillRect((((point1.x < point2.x) ? point1.x : point2.x)), 
      ((point1.y < point2.y) ? point1.y : point2.y), 
      Math.abs(point2.x - point1.x), 
      Math.abs(point2.x - point1.x)); //same as width 

我不知道什麼問題是使寬度和高度相等。它向下向左或向右繪製時起作用,但當然,如果向下拉直,形狀不會擴展。點擊並拖動不起作用;廣場簡單地沿着Y軸向上移動,而不是展開。

任何人都可以在正確的方向上指出我從兩點繪製正方形的邏輯嗎?

如果需要,我可以更好地解釋我的代碼。

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

0

你應該在你的MouseDragged方法中做兩個計算 - 首先你應該計算矩形的兩個角點,p1和p2,然後才能計算寬度。點p1很容易 - 它總是按下第一個點,但p2需要一個簡單的計算。一旦這些被澄清,你的計算應該正確地失敗。

即是這樣的:

int width = Math.abs(pointA.x - pointB.x); 
    int height = Math.abs(pointA.y - pointB.y); 

    width = Math.max(width, height); 
    height = width; 

    int x = pointA.x > pointB.x ? pointA.x - width : pointA.x; 
    int y = pointA.y > pointB.y ? pointA.y - width : pointA.y; 

    g.fillRect(x, y, width, height); 
0

如果我使用的工具繪製一個正方形,我希望我的鼠標光標會留在廣場的兩側同時提請之一。如果您總是使用x距離作爲邊,那麼如果我畫的距離比對面更遠,則光標將位於正方形之外。

我認爲,拖動正在進行時,代碼需要計算x距離還是y距離原點的距離更長,並將其用作正在進行中的一側。然後光標將位於其中一側,並且該側將超出光標延伸到正在進行中的角落。

我不知道爲什麼圖紙會出錯 - 很難確定我明白你說錯了什麼。