2011-10-13 46 views
0

我需要讓圖像在圓環中飛翔,我現在只能卡在一個部分。 爲了計算點數,需要使用畢達哥拉斯來計算高度(點B)。讓圖像在Java中環繞飛行

現在,當使用sqrt函數時,我無法將double轉換爲int的錯誤。 這裏是我的代碼:

package vogel; 

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.image.*; 
import java.io.*; 
import javax.imageio.*; 
import javax.swing.*; 

public class vogel extends Component { 
    private int x; 
    private int r; 
    private int b; 


    BufferedImage img; 

    public vogel() { 
     try { 
      img = ImageIO.read(new File("F:/JAVA/workspace/School/src/vogel/vogel.png")); 
     } catch (IOException e) { 
     } 
     r = 6; 
    } 


    @Override 
    public void paint(Graphics g) { 
     for(int i = -r; i <= r; i++) { 
      x = i;  

      b = Math.sqrt(r^2 - x^2); 
      g.drawImage(img, x, b, this); 
     }   
    } 


    public static void main(String[] args) { 
     JFrame f = new JFrame("Boot"); 
     f.setSize(1000,1000); 
     f.add(new vogel());   
     f.setVisible(true); 

     for (int number = 1; number <= 1500000; number++) { 
      f.repaint(); 

      try { 
       Thread.sleep(50); 
      } catch (InterruptedException e) {} 
     } 
    } 
} 

希望你們中的一個可以幫助我

回答

3

鑄值。例如。

b = (int)Math.sqrt(r^2 - x^2); 
+1

我在代碼仔細看看,它有很多問題有待解決。 1)不要吞食例外。 2)不要混用Swing和AWT。 3)在Swing中進行自定義繪畫時,重寫'paintComponent()'而不是'paint()'。 4)不要在EDT中調用'Thread.sleep()'。5)當前繪畫方法中的循環很可能無法按預期工作。 (雖然我不知道你期望它如何工作)。 6)顯示的公式將圖像從左向右直線移動。 –

+1

此外,使用畢達哥拉斯將不會平滑地將對象移動一圈。它會在對面加速並減速。如果你希望它以固定的速度移動,你需要給它一個航向和速度,並用三角函數來計算下一個座標點。 – Bob

+2

有一個使用@ Bob的方法[這裏]的例子(http://stackoverflow.com/questions/3256269/jtextfields-on-top-of-active-drawing-on-jpanel-threading-problems/3256941#3256941)。 – trashgod

0
b = (int)Math.sqrt(r^2 - x^2); 
1

將其轉換鑄造

b = (int)Math.sqrt(..); 

雖然使用布氏的算法比根

0

這條線計算在更高效:

b = Math.sqrt(r^2 - x^2); 

...那以多種方式做你的想法。以^表示異或,它不是一個指數運算符 - 它返回一個double,其中b是一個int。

與功率處理問題,我們可以使用Math.pow,而不是(這實際上給你一個電源)來獲得:

b = Math.sqrt(Math.pow(r, 2), Math.pow(x, 2)); 

當然,我假設你在這裏做平均功率和沒」意思是將兩個數字異或。

你可以只把結果爲int:

b = (int)Math.sqrt(Math.pow(r, 2), Math.pow(x, 2)); 

但你可能想改變B上它是一個雙,你可以保持增加的準確性。

0

預先計算路徑座標將加快重繪循環,做到讓每一個像素的座標與布氏方法(參見公共的蜂)的最快方法,這裏是Java代碼

private void drawCircle(final int centerX, final int centerY, final int radius) { 
    int d = 3 - (2 * radius); 
    int x = 0; 
    int y = radius; 
    Color circleColor = Color.white; 

    do { 
     image.setPixel(centerX + x, centerY + y, circleColor); 
     image.setPixel(centerX + x, centerY - y, circleColor); 
     image.setPixel(centerX - x, centerY + y, circleColor); 
     image.setPixel(centerX - x, centerY - y, circleColor); 
     image.setPixel(centerX + y, centerY + x, circleColor); 
     image.setPixel(centerX + y, centerY - x, circleColor); 
     image.setPixel(centerX - y, centerY + x, circleColor); 
     image.setPixel(centerX - y, centerY - x, circleColor); 
     if (d < 0) { 
      d = d + (4 * x) + 6; 
     } else { 
      d = d + 4 * (x - y) + 10; 
      y--; 
     } 
     x++; 
    } while (x <= y); 
} 

由於本示例使用由Rosetta定義的數據存儲類型,因此您需要稍微調整以適合自己的實現。 http://rosettacode.org/wiki/Basic_bitmap_storage#Java

注:因爲它會產生一個1/8圓弧和鏡子,它不會創建正確的順序座標來移動你的形象 - 你需要將其加載到一個數組並將其分類。

完整的類可以在這裏找到Rosetta; http://rosettacode.org/wiki/Bitmap/Midpoint_circle_algorithm#Java

約Bresehnam方程的更多信息可以在這裏找到 http://free.pages.at/easyfilter/bresenham.html