我真的被困在这个想法中,我应该画一个圆圈,这很好。但它将能够以不同的分辨率绘制,而我无处可去,请帮助!我在这里向您展示的代码并不是尝试使用不同的分辨率,但我对于该做什么没有任何想法。
我会把我遇到麻烦的课程,然后我会提出其余的课程。另外,快速注释,该程序稍后将用于Mandlebrot套装。
问题是,圆圈在高分辨率下运行良好,但是一旦我尝试减少它,我会得到奇怪的线条图案,就像它只绘制某些线条,然后画出它不应该的线条,我是怀疑问题的方法是render()
。我还怀疑问题更具体的是for循环,或我的向量的索引。如果我的解释不清楚,请告诉我。
RESOLUTION_VERY_HIGH与RESOLUTION_VERY_LOW的值为2048,1024,...,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;
}
}
我怀疑你需要它们,但这是其他类;
我的主要人物;
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;}
}
}
}
}
这是我写的Complex类;
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 :(得分: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)要更改pizel的大小,您需要更改的是w.putData(picture,1,1);
命令以读取w.putData(picture,resolution,resolution);
。
如果这不正确,指向GUI源的链接或添加您当前获得的结果的图片将有所帮助。
答案 1 :(得分: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 + =分辨率,我还将Color [] []的索引设为w.getHeight/resolution + 1
和w.getWidth/resolution + 1
。
解释是我只比较每个&#34;分辨率&#34;行(例如,分辨率3的每第三行),以及每个&#34;分辨率&#34;该行上的像素。因此,我只需要w.getWidth/resolution + 1
个元素(对于w.getHeight也是如此)。
然后我拿了picture[i/resolution][j/resolution]
,我认为之前的问题是我保存了太多元素,然后当像素大小增加时,我的像素太多了。
另外,w.putData(picture, resolution, resolution);
,这意味着我扩展了像素大小,因此分辨率更低。
感谢这里的人们帮助我的所有麻烦。