2014-12-01 2 views
1

저는 정말로 이것에 관한 아이디어가 고착되어 있습니다. 나는 원을 그려야하는데 괜찮습니다. 하지만 다른 해상도로 칠할 수있게 될 것입니다. 나는 아무데도 가지 않을 것입니다. 제발 도와주세요! 여기에 나와있는 코드는 differnet 해상도로 작업하려고하지는 않지만 수행 할 작업에 대한 아이디어가 없습니다.낮은 해상도의 원을 그립니다.

나는 문제가있는 수업을 올릴 것이고, 나는 나머지 프로그램을 시작할 것이다. 또한이 프로그램은 나중에 Mandlebrot 세트에 사용됩니다.

문제는 동그라미가 고해상도로 잘 작동하지만 한 번 줄이려고하면 이상한 선 패턴이 표시되는 것처럼 특정 선을 그립니다. 그런 다음 선을 그려야한다고 생각하지 않습니다. 문제가 의심되는 것은 render()입니다. 또한 문제가 더 구체적으로 for-loops 또는 내 벡터의 인덱스라고 의심합니다. 제 설명이 명확하지 않으면 알려주세요. RESOLUTION_VERY_LOW하는

RESOLUTION_VERY_HIGH 난 당신이 그들을 필요로 의심하지만, 여기에 다른 클래스는 128

package mandelbrot; 
import java.awt.Color; 

import se.lth.cs.ptdc.fractal.MandelbrotGUI; 

public class Generator { 
    public Generator() { 

    } 

    public void render(MandelbrotGUI w) { 
     w.disableInput(); 
     int resolution = 1; 

     switch (w.getResolution()) { 
      case MandelbrotGUI.RESOLUTION_VERY_HIGH: 
      resolution = 1; 
      break; 
      case MandelbrotGUI.RESOLUTION_HIGH: 
       resolution = 3; 
       break; 
      case MandelbrotGUI.RESOLUTION_MEDIUM: 
       resolution = 5; 
       break; 
      case MandelbrotGUI.RESOLUTION_LOW: 
       resolution = 7; 
       break; 
      case MandelbrotGUI.RESOLUTION_VERY_LOW: 
       resolution = 9; 
       break; 
      } 

     Complex complex[][] = mesh(w.getMinimumReal(), w.getMaximumReal(), w.getMinimumImag(), 
       w.getMaximumImag(), w.getWidth(), w.getHeight()); 

     Color[][] picture = new Color[w.getHeight()][w.getWidth()]; 

     for (int i = 0; i<w.getHeight(); i+=resolution) { 
      for (int j = 0; j<w.getWidth(); j+=resolution) { 
       if ((complex[i][j]).getAbs()>1) { 
        picture[i][j] = Color.WHITE; 
       } 
       else { 
        picture[i][j] = Color.BLUE; 
       } 
      } 
     } 

     w.putData(picture, 1, 1); 
     w.enableInput(); 
    } 

    private Complex[][] mesh(double minReal, double maxReal, double minImaginary, 
           double maxImaginary, int width, int height) { 

     Complex[][] matrice = new Complex[height][width]; 
     for (int i = 0; i<height; i++) { 
      for (int j = 0; j<width; j++) { 
       matrice[i][j] = new Complex((minReal + ((maxReal-minReal)/width)*j), 
              ((maxImaginary - (((maxImaginary - minImaginary)/height)*i)))); 

      } 
     } 
     return matrice; 
    } 
} 

, 값 2048, 1024, ...이;

내 주요;

package mandelbrot; 
import se.lth.cs.ptdc.fractal.MandelbrotGUI; 

public class Mandelbrot { 
    public static void main (String[] args) { 
     MandelbrotGUI w = new MandelbrotGUI(); 
     Generator generator = new Generator(); 
     boolean zoomValue = false; 

     while (true) { 
      switch(w.getCommand()) { 

       case MandelbrotGUI.QUIT: System.exit(0); 
       break; 

       case MandelbrotGUI.RENDER: 
        generator.render(w); 
       break; 

       case MandelbrotGUI.RESET: 
       w.clearPlane(); 
       w.resetPlane(); 
       zoomValue = false; 
       break; 

       case MandelbrotGUI.ZOOM: 
        if (zoomValue) { 
          w.clearPlane(); 
          generator.render(w); 
          break; 
        } 
        else {break;} 
      } 
     } 
    } 
} 

여기에 내가 작성한 복잡한 클래스가 있습니다.

package mandelbrot; 

public class Complex { 
    double real; 
    double imaginary; 

    public Complex (double real, double imaginary) { 
     this.real = real; 
     this.imaginary = imaginary; 
    } 

    double getReal() { 
     return real; 
    } 
    double getImaginary() { 
     return imaginary; 
    } 

    double getAbs() { 
     return Math.hypot(real, imaginary); 
    } 

    void add(Complex c) { 
     real += c.getReal(); 
     imaginary += c.getImaginary(); 
    } 

    void multiply(Complex c) { 
     real = (real*c.getReal()) - (imaginary*c.getImaginary()); 
     imaginary = (real*c.getImaginary()) + (imaginary*c.getReal()); 
    } 
} 

여기서 찾을 수있는 GUI의 사양. http://fileadmin.cs.lth.se/cs//Education/EDA016/javadoc/cs_eda016_doc/

도움을 주셔서 감사합니다. 대단히 감사합니다. :)

+0

GUI 클래스의 소스에 대한 링크가없는 것입니까? 꼭 필요한 것은 아니지만 디버깅이 더 쉬워진다. 정확히 말하면 무엇을 말하는지, 스펙에서 재현 할 수있는 동안은 많은 타이핑이 필요하다. :) –

+0

서클과 만델 브로 도형에는 공통점이 있습니까? 원을 그려야 할 경우 사인 함수와 코사인 함수를 사용하여 _true_ 원을 만듭니다. – karatedog

답변

0

코드를 올바르게 따르고 GUI 클래스를 조작하면. 당신이해야 할 두 가지가 있습니다.

1) VERY_HIGH 이외의 해상도에서는 resolution 점마다 색을 설정합니다. 이 작업은 그림을 그릴 픽셀의 크기를 변경하는 경우에만 가능합니다. GUI 클래스가 없다면 말할 충분한 정보가 없습니다. 나는 if 문이 if ((complex[i][j]).getAbs()>1이라면 if ((complex[i][j]).getAbs()>resolution을 읽어야하고 i와 j의 증가분은 1이어야한다고 느낀다. 다시 GUI 클래스가 없으면 나는 말할 수 없다.

2) 핀 크기를 변경하려면 w.putData(picture,1,1); 명령을 w.putData(picture,resolution,resolution);으로 변경해야합니다.

이것이 잘못된 경우 GUI 소스 링크 또는 현재 가져온 결과 사진을 추가하면 도움이됩니다.

+0

글쎄, 내가 GUI 소스에 액세스 할 수 있었으면 좋겠어,하지만 사양 만 가지고있어, 그래서 내가 가진 정보와 거의 같다. 코드에서 생각을 구현하려고합니다. – BarksRosaRota

0

글쎄, 나는이 문제를 해결 한 것처럼 보이는데,이 메소드 렌더는 이렇게 보일 것이다.

public void render(MandelbrotGUI w) { 
    w.disableInput(); 
    int resolution = 1; 

    switch (w.getResolution()) { 
     case MandelbrotGUI.RESOLUTION_VERY_HIGH: 
     resolution = 1; 
     break; 
     case MandelbrotGUI.RESOLUTION_HIGH: 
      resolution = 3; 
      break; 
     case MandelbrotGUI.RESOLUTION_MEDIUM: 
      resolution = 5; 
      break; 
     case MandelbrotGUI.RESOLUTION_LOW: 
      resolution = 7; 
      break; 
     case MandelbrotGUI.RESOLUTION_VERY_LOW: 
      resolution = 9; 
      break; 
     } 

    Complex complex[][] = mesh(w.getMinimumReal(), w.getMaximumReal(), w.getMinimumImag(), 
      w.getMaximumImag(), w.getWidth(), w.getHeight()); 

    Color[][] picture = new Color[w.getHeight()/resolution + 1][w.getWidth()/resolution + 1]; 

    for (int i = 0; i<w.getHeight(); i+=resolution) { 
     for (int j = 0; j<w.getWidth(); j+=resolution) { 
      if ((complex[i][j]).getAbs()>1) { 
       picture[i/resolution][j/resolution] = Color.WHITE; 
      } 
      else { 
       picture[i/resolution][j/resolution] = Color.BLUE; 
      } 
     } 
    } 

    w.putData(picture, resolution, resolution); 
    w.enableInput(); 
} 

증분

는 J = + 해상도와 내가 + = 해상도, I는 w.getHeight/resolution + 1w.getWidth/resolution + 1에 색상 [] []의 인덱스를 넣어.

설명은 모든 "해상도"행 (예 : 해상도 3의 매 3 행)과 해당 행의 모든 ​​"해상도"픽셀 만 비교하는 것입니다. 따라서 요소는 w.getWidth/resolution + 1 (w.getHeight의 경우 동일) 만 필요합니다.

그렇다면 이전에 문제가 너무 많은 요소를 저장했다는 것이었고 픽셀 크기가 커지면 픽셀이 너무 많아 졌다고 생각합니다.

또한 w.putData(picture, resolution, resolution);으로, 픽셀 크기가 확장되어 해상도가 낮아졌습니다.

모든 문제를 보내 주셔서 감사합니다. 사람들이 나를 도와 주러갔습니다.

관련 문제