2012-10-11 44 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; 
    } 
}