2014-03-07 44 views
1

我有一個JPanel 200x200。界限內的拋物線

我試着創建一個函數,它會隨着JPanel邊界生成隨機拋物線,約束條件是高度不能低於100(屏幕中間),我基本上想要移動一個形狀圍繞這些拋物線

parabolas

下面是一些代碼我使用開始:

Random random = new Random(); int y; int x; 
int size = random.nextInt(10); 
int translation = random.nextInt(50); 
int height = random.nextInt(100) - 200; //between 100 and 200 

//拋物線函數:Y =((X/7 - 30))^ 2

// x和y是在形狀繪製

while(y != 200){ 
y = (float)Math.pow((float)xloc/size - translation ,2) + height; 
x++; 
} 

我一直在研究有關FlatteningPathIterator但也不太清楚如何使用它們的coordiates。我的功能

y = (float)Math.pow((float)xloc/size - translation ,2) + height;` 

打印拋物線的有時界限之外,如何將我編輯打印拋物線的界限內?

+0

*? 「任何建議」 * 1)爲了更好地幫助更快,發佈[MCTaRE(http://stackoverflow.com/help/mcve)(最小完整測試和可讀例子)。 2)添加更具體的問題。除了是一個懶惰的問題「任何建議?」太寬泛了。 –

+1

此[示例](http://stackoverflow.com/a/20107935/230513)將結果縮放到封閉容器。 – trashgod

回答

1

這個叫做Quad2dCurve的Java Swing形狀生成器。調用getPathIterator會爲您提供曲線上點的枚舉器。

下面是一些示例代碼:

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import java.util.Random; 
import javax.swing.*; 

final class TestCanvas extends JComponent { 

    int size = 200; 
    int n = 10; 
    float[] ph = new float[n]; 
    float[] pw = new float[n]; 
    float[] px = new float[n]; 
    Random gen = new Random(); 

    TestCanvas() { 
     makeRandomParabolas(); 
     setFocusable(true); 
     addKeyListener(new KeyAdapter() { 

      @Override 
      public void keyPressed(KeyEvent e) { 
       makeRandomParabolas(); 
       repaint(); 
       float [] coords = new float [6]; 
       for (int i = 0; i < n; i++) { 
        PathIterator pi = getQuadCurve(i).getPathIterator(null, 0.1); 
        System.out.print(i + ":"); 
        while (!pi.isDone()) { 
         switch (pi.currentSegment(coords)) { 
          case PathIterator.SEG_MOVETO: 
           System.out.print(" move to"); 
           break; 
          case PathIterator.SEG_LINETO: 
           System.out.print(" line to"); 
           break; 
          default: 
           System.out.print(" unexpected"); 
           break; 
         } 
         System.out.println(" (" + coords[0] + "," + coords[1]+")"); 
         pi.next(); 
        } 
        System.out.println(); 
       } 
      } 
     }); 
    } 

    QuadCurve2D.Float getQuadCurve(int i) { 
     return new QuadCurve2D.Float(px[i] - pw[i], size, 
       px[i], size - (2 * ph[i]), 
       px[i] + pw[i], size); 
    } 

    void makeRandomParabolas() { 
     for (int i = 0; i < n; i++) { 
      float x = 0.2f + 0.6f * gen.nextFloat(); 
      px[i] = size * x; 
      pw[i] = size * (Math.min(x, 1 - x) * gen.nextFloat()); 
      ph[i] = size * (0.5f + 0.5f * gen.nextFloat()); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g0) { 
     Graphics2D g = (Graphics2D) g0; 
     for (int i = 0; i < n; i++) { 
      g.draw(getQuadCurve(i)); 
     } 
    } 
} 

public class Main extends JFrame { 

    public Main() { 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     getContentPane().add(new TestCanvas()); 
     getContentPane().setPreferredSize(new Dimension(200, 200)); 
     pack(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Main().setVisible(true); 
      } 
     }); 
    } 
} 
+1

+1不包括KeyListener(2014年的使用)而不是KeyBindings – mKorbel

+0

@mKorbel謝謝,但我不確定你的意思。我想要任何密鑰來重繪。這可以通過鍵綁定來完成,而不需要綁定到鍵盤上的所有鍵上? – Gene

+0

是的,KeyListener被指定用於史前AWT組件,在這裏通過使用KeyBindings標記([例如](http://stackoverflow.com/a/7940227/714968))來搜索 – mKorbel