2013-03-10 268 views
0

你好,我正在嘗試創建一個Java程序,它允許你繪製一個方程,並且它一直工作得很好,直到我想要它繪製餘弦和正弦函數。我很困惑我如何才能做到這一點,當正弦和餘弦返回雙打,但拉線只採取整數。我是新來的Java,所以這可能很容易,但如果你能幫助,我將不勝感激。Java正弦和餘弦

這裏是我的代碼:

import java.util.Scanner; 
import javax.swing.JFrame; 
import javax.swing.*; 
import java.awt.*; 
import java.lang.Math; 
import java.awt.geom.*; 

class PlotGraph extends JFrame{ 


public void paintComponent(Graphics g){ 
    Graphics2D g2 = (Graphics2D) g; 

    g.drawLine(50, 300, 550, 300); //x axis 
    g.drawLine(300, 550, 300, 50); //y axis 
    //Orignin x = 300 y = 300 

    double xmin, xmax; 
    double y; 
    xmin =(0); 
    xmax = 100; 
    double x = xmin; 

    double form = Math.cos(x); 

    double last_y = 300-(form); 

    for (x = xmin+1; x<=xmax; x++){ 
    double newForm = Math.cos(x); 
    y = 300-(newForm); 
    g2.draw(new Line2D.Double(x-1+(300), last_y, x+300, y)); 
    last_y = y; 

    } 




} 

public static void main(String [] args) { 

    PlotGraph graph = new PlotGraph(); 
    graph.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    graph.setSize(600, 600); 
    graph.setVisible(true); 
    graph.setTitle("PlotGraph"); 

} 
} 
+3

根據你希望餘弦的樣子,你可能想要乘以一個常數,比如10或50,以便在你的圖表上顯示得更好。否則,餘弦將只返回從-1到1的值。 – Aiias 2013-03-10 07:35:51

回答

0

嘗試鑄造雙爲int。

int y = 300 - (int) (Math.cos(x) * scaleFactor); 

正如Aiias說: COS只會-1和1之間的返回值所以一定要由一個常數因子相乘或鑄造後,你將失去價值。

0

適當縮放之後,你可以嘗試之一:

  • 類型轉換doubleintint i = (int)d;

  • 四捨五入,返回long必須通過強制轉換爲intint i = (int)Math.round(d);

1

使用Line2D.Double對象,一個Graphics2D Graphics對象,並讓Graphics2D對象通過其draw(...)方法繪製形狀。

+0

什麼類型的參數確實繪製(..)? – CodeNewbie 2013-03-10 18:11:45

+0

@ user2106089:它需要一個Shape參數或任何派生自Shape類型的類,例如Line2D。 – 2013-03-10 18:12:29

+0

我想使用這條線,它說Line2D包不存在 g2.draw(new Line2D.Double(x-1 +(300),last_y,x + 300,y)); – CodeNewbie 2013-03-10 20:06:10

2

由於Math.cos()返回-1和1之間的值,鑄造爲int將導致只有3個值-1,0和1,並且幾乎始終爲0

要什麼做的是乘法雙重由一個大常量來創建一個整數範圍:

y = 300-(int)(300d * newForm); 

注意「d」 300後:使300雙,使結果如果乘法也是雙,這個保管細粒度。

+2

由於'newForm'已經是double,'300d'中的'd'沒有任何貢獻。 – EJP 2013-03-10 07:40:22

+0

嗯,我只是困惑於我如何繪製餘弦和正弦,因爲drawLine()只需要int的一個dnot雙打。 – CodeNewbie 2013-03-10 18:14:12

+0

'(int)'被稱爲強制轉換。在值之前使用時,它會將其轉換(或「轉換」)爲括號中指示的類型。所以在這個例子中,'(300d * newForm)'的double值被轉換爲int。由於'300'也是一個int,'y'因此也是一個int。 – MTCoster 2013-03-10 21:40:01