【问题标题】:Julia Set Rendering on JPanel in Java - colours only one PixelJulia 在 Java 中的 JPanel 上设置渲染 - 仅着色一个像素
【发布时间】:2016-06-21 09:22:43
【问题描述】:

当用户单击 Mandelbrot 集面板上的一个点时,我正在尝试编写一个程序来呈现 Mandelbrot 集,然后在另一个面板中呈现复数的 Julia 集。

但是,由于某种原因,我的 Julia 设置的渲染代码不起作用。它似乎只为最左上角的像素着色,我不知道为什么会这样。我不知道渲染方法中的数学是否错误,或者着色是否是问题。任何指示或解决方案都会很棒——我已经为此摸不着头脑了。

如果有人发现拥有所有代码更容易解​​决这个问题,请告诉我 - 谢谢。

这里只是 Julia 的设置面板的代码,其他的都被省略了。

  class juliaPanel extends JPanel {

        ComplexNumber fixedNumber = new ComplexNumber(0,0);
        double newReal, newImaginary, oldReal, oldImaginary;

        public void setFixedNumber(ComplexNumber fixedNumberIn) {
            fixedNumber = fixedNumberIn;
        }

        public void paintComponent(Graphics g){
            super.paintComponent(g);
            newReal = 0;
            newImaginary = 0;
            int i;
            for(int y = 0; y < height; y++) {
                for(int x = 0; x < width; x++) {
                    for (i=0; i< iterationsToDo; i++) {
                        oldReal = newReal;
                        oldImaginary = newImaginary;
                        newReal = oldReal * oldReal - oldImaginary * oldImaginary + fixedNumber.getReal();
                        newImaginary = 2 * oldReal * oldImaginary + fixedNumber.getImaginary();
                        if((newReal * newReal + newImaginary * newImaginary) > 4) break;
                    }
                    if(i == 255){
                        g.setColor(Color.BLACK);
                    }else{
                         g.setColor(Color.getHSBColor(i/100.0F,1F,1F));
                    }
                    g.fillRect(x, y, 1, 1);
                }
            }   
        }

【问题讨论】:

  • 我怀疑问题是您没有在第二个循环中将 newReal 和 newImaginary 重置为 0。
  • 你如何设置高度宽度迭代ToDo?
  • 您好博客 - 您是否建议我应该将设置这些变量等于零的两个语句移动到迭代ToDo 循环中?非常感谢您的快速回复。
  • i/100.0F 对我来说似乎不正确,因为参数需要介于 0 和 1 之间。我怀疑你想要(float) i / iterationsToDo
  • 嗨 gpasch - 这是一个用户定义的变量,存储在程序层次结构更高的变量中。我使用的测试号码是 100。非常感谢。

标签: java swing math awt paintcomponent


【解决方案1】:

i开始内循环之前,即xy已经改变到下一个像素后,需要根据这个像素设置初始复数,类似

newReal = minReal + x*deltaReal;
newImag = maxImag - y*deltaImag;

其中minmax-2.02.0delta4.0/width4.0/height 或两者的最小值,以获得1:1 的纵横比。

【讨论】:

  • 嗨 LutzL - 我猜这是不是像 Welbog 在上面的 cmets 中建议的那样在同一个地方将它们设置为 0?感谢您的回复,我现在就试一试
  • LutzL,这似乎行得通!渲染一张(我认为是)这个 Julia Set of the ComplexNumber 传入的图像。非常感谢您的帮助。已将答案标记为正确。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2014-02-12
  • 2013-06-20
相关资源
最近更新 更多