2014-03-07 9 views
1

나는 JPanel 200x200을 가지고 있습니다.범위 내의 포물선

JPanel의 경계와 함께 무작위 포물선을 생성하는 함수를 만들려고합니다. 높이가 100보다 작을 수 없다는 제약으로 (기본적으로 화면 이동) 모양을 이동하려고합니다.^2

- Y = (30) (X/7) :

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 

// 포물선 기능 :이 포물선 주위에 여기

parabolas

내가 시작하는 데 사용하고 일부 코드는 01 // x와 y 23,516,

는 모양이 내가 FlatteningPathIterator에 대해 연구하고 있지만이를 사용하는 방법을 너무 확실하지 봤는데

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

그려진 곳의 coordiates 있습니다. 내 기능

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

포물선이 때로는 범위를 벗어났습니다. 포물선을 테두리 안에 인쇄하려면 어떻게 편집해야합니까?

+0

*? "어떤 제안이"* 1) 빨리 더 나은 도움이 필요한 경우, 게시 A [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 KeyBindings 대신 KeyListener (2014 년 사용) 제외 – mKorbel

+0

@mKorbel 감사하지만 무슨 뜻인지 모르겠군요. 다시 그리기를 유발하는 키가 필요했습니다. 키보드의 모든 키에 바인딩 할 수없는 키 바인딩으로이 작업을 수행 할 수 있습니까? – Gene

+0

예, 정확히 KeyListener는 선사 시대의 AWT 구성 요소로 지정되었습니다. KeyBindings 태그 (예 : (http://stackoverflow.com/a/7940227/714968))를 사용하여 여기를 검색하십시오. – mKorbel