2012-10-11 47 views
1

我正在做一些練習,並且我一直堅持這幾個小時(對Java來說很新)。 無論如何,這是我應該做的: 當我運行程序時,屏幕中間會有一個正方形,然後當我點擊該屏幕內的某個位置時,會在我點擊的地方繪製另一個正方形在這兩點之間應該有10個方格。所以無論我點擊哪裏,總是應該在10個方格之間繪製。兩點之間畫正方形

但是,我不能讓它正常工作。

這是我已經設法到目前爲止做:

import se.lth.cs.ptdc.window.SimpleWindow; 
import se.lth.cs.ptdc.square.Square; 


public class PrintSquares2 { 


public static void main(String[] args) { 
    SimpleWindow w = new SimpleWindow(600, 600, "PrintSquares2"); 
    int posX = 300; 
    int posY = 300; 
    int loop = 0; 
    System.out.println("Skriv rotation"); 
    Square sq1 = new Square(posX,posY,200); 
    sq1.draw(w); 


      w.waitForMouseClick(); 
      int destX = w.getMouseX(); 
      int destY = w.getMouseY(); 
      System.out.println("Dest X: " + destX + " Dest Y: " + destY); 
      System.out.println("Pos X: " + posX + " Pos Y: " + posY); 
      SimpleWindow.delay(10); 
      //sq1.erase(w); 
      int jumpX = (destX - posX)/10; 
      int jumpY = (destY - posY)/10; 
      System.out.println(jumpX); 


       while (posX < destX) 
       {  
        posX = posX+10; 
        SimpleWindow.delay(100); 
        loop++; 
        System.out.println("Loop: " + loop); 
        System.out.println("Dest X: " + destX + " Dest Y: " + destY); 
        System.out.println("Pos X: " + posX + " Pos Y: " + posY);  
        Square sq2 = new Square(posX,posY,200);   
        sq2.draw(w);       
       } 

       while (posX > destX) 
       { 
        posX = posX-10; 
        SimpleWindow.delay(100); 
        loop++; 
        System.out.println("Loop: " + loop); 
        System.out.println("Dest X: " + destX + " Dest Y: " + destY); 
        System.out.println("Pos X: " + posX + " Pos Y: " + posY); 
        sq1.draw(w); 
        Square sq2 = new Square(posX,posY,200);   
        sq2.draw(w); 
       } 

       while (posY < destY) 
       {  
        posY = posY+10; 
        SimpleWindow.delay(100); 
        loop++; 
        System.out.println("Loop: " + loop); 
        System.out.println("Dest X: " + destX + " Dest Y: " + destY); 
        System.out.println("Pos X: " + posX + " Pos Y: " + posY); 
        sq1.draw(w); 
        Square sq2 = new Square(posX,posY,200);   
        sq2.draw(w); 
       } 

       while (posY > destY) 
       { 
        posY = posY-10; 
        SimpleWindow.delay(100); 
        loop++; 
        System.out.println("Loop: " + loop); 
        System.out.println("Dest X: " + destX + " Dest Y: " + destY); 
        System.out.println("Pos X: " + posX + " Pos Y: " + posY); 
        sq1.draw(w); 
        Square sq2 = new Square(posX,posY,200);   
        sq2.draw(w); 
       } 


      SimpleWindow.delay(10); 
      sq1.draw(w); 

      //SimpleWindow.clear(w); 


    } 

}

我敢肯定,我一切都過於複雜,因爲這應該是非常基本的。

最終的結果應該是這樣的: End result

+1

你現在的結果是什麼? – svz

+0

你有沒有遇到異常? – MaVRoSCy

+0

這就是現在的樣子。它首先在x軸上移動,然後在y軸上移動。 http://i.imgur.com/3D9af.png – Rob

回答

2

這是我已經解決了它的方式:

我聽不太懂的se.lth.cs.ptdc.square.Square的文檔,但我會假設它根據其左上角的座標和側面大小繪製一個正方形。

因此,您有第一個方形左上角的座標和最後一個方形中心的座標。有,它不是很難得到最後一個方塊的左上角的座標:
lastX = centerX - side/2
lastY = centerY - side/2

之後,你有你找到起點和終點之間的區別:
diffX = posX - lastX
diffY = posY - lastY

,之後只需畫出9個正方形:

for (int i=1; i<10; i++){ 
    squareX = posX + (diffX/10)*i; 
    squareY = posY + (diffY/10)*i; 
    Square square = new Square(squareX,squareY,200);   
    square.draw(w); 
} 

其實你做的第一部分是正確的,只是搞砸了那些不必要的檢查。希望能幫助到你。

-
問候,svz。

1

更新X和Y在同一時間:

int jumpX = (destX - posX)/10; 
    int jumpY = (destY - posY)/10; 
    if (posX > destX) { 
     int temp = destX; 
     destX = posX; 
     posX = temp; 
    } 

    while (posX <= destX) 
    {  
      SimpleWindow.delay(100); 
      loop++; 
      System.out.println("Loop: " + loop); 
      System.out.println("Dest X: " + destX + " Dest Y: " + destY); 
      System.out.println("Pos X: " + posX + " Pos Y: " + posY);  
      Square sq2 = new Square(posX,posY,200);   
      sq2.draw(w);       
      posX = posX+jumpX; 
      posY = posY+jumpY; 
    }  

    SimpleWindow.delay(10); 
    sq1.draw(w); 
+0

對不起,遲到的答案,必須開始我的數學講座,然後乘火車回家。我試過上面的代碼,並對它做了一些細微的修改,但是我有一個小問題。每當我點擊原始正方形的右側時,動畫將獲得偏移量,但仍會循環正確的次數。 見這樣的畫面:http://imgur.com/a/T0ibA 我在代碼改變的唯一事情是: 如果(POSX = destX && POSY> = destY ){ – Rob

+0

否則,如果我使用您提供的代碼,它將在單側單擊時將偏移+循環變爲無窮大。 – Rob

1

這裏是你如何在兩個方向同時移動(在對角線)。

static final int Steps = 10; 

private void test() { 
    int x1 = 100; 
    int y1 = 100; 
    int x2 = 300; 
    int y2 = 500; 

    double dx = (double)(x2 - x1)/(double) Steps; 
    double dy = (double)(y2 - y1)/(double) Steps; 

    double x = x1; 
    double y = x2; 
    for (int i = 0; i < Steps; i++) { 
    // Simulate the drawing of the square. 
    System.out.println("("+x+","+y+")"); 
    x += dx; 
    y += dy; 
    } 
}