Я действительно застрял и из идей об этом, я должен нарисовать круг, который идет хорошо. Но это будет возможность рисоваться в разных разрешениях, и я никуда не буду, пожалуйста, помогите! Код, который я покажу вам, не пытается работать с разрешениями differnet, но у меня нет идей, что делать.
Я подниму класс, с которым у меня возникнут проблемы, и затем я оставлю оставшуюся часть программы. Также быстро заметим, что в дальнейшем программа будет использоваться для множеств Мандлброта.
Проблема в том, что круг отлично работает с высоким разрешением, но как только я попытаюсь его уменьшить, я получаю странные линейные шаблоны, например, он рисует только определенные строки, а затем рисует строки, которые не предполагается, я подозреваю, что проблема это метод render()
. Я также подозреваю, что проблема более конкретно - for-loops или индекс моих векторов. Если я неясен в своем объяснении, скажите мне.
RESOLUTION_VERY_HIGH to 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;}
}
}
}
}
и вот сложный класс, который я написал;
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/
Спасибо за любую помощь, очень ценю! :)
Ну, похоже, я решил проблему, метод render должен выглядеть так:
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
.
Объяснение состоит в том, что я сравниваю только каждую "разрешающую" строку (например, каждую третью строку для разрешения 3) и каждый "разрешающий" пиксель в этой строке. w.getWidth/resolution + 1
мне нужно только w.getWidth/resolution + 1
элемент (и то же самое для w.getHeight).
Затем я сделал picture[i/resolution][j/resolution]
, я думаю, что проблема прежде заключалась в том, что я сохранил слишком много элементов, а затем, когда pixize был увеличен, у меня было слишком много пикселей.
Кроме того, w.putData(picture, resolution, resolution);
, что означало, что я расширил pixize, и поэтому разрешение было ниже.
Спасибо за все неприятности, что люди здесь помогли мне помочь.
Если я правильно соблюдаю ваш код и работу класса GUI. Вам нужно сделать две вещи.
1) Если в разрешении, отличном от VERY_HIGH, вы устанавливаете только цвет для каждой точки resolution
. Это может работать, но только если вы измените размер пикселя, который вы рисуете. Без GUI-класса недостаточно информации. Я получаю ощущение, что оператор if ((complex[i][j]).getAbs()>1
должен читать if ((complex[i][j]).getAbs()>resolution
и приращение для я и j должно быть 1. Опять же, без класса GUI, я не могу сказать.
2) Чтобы изменить размер пизделя, все, что вам нужно изменить, это w.putData(picture,1,1);
команда для чтения w.putData(picture,resolution,resolution);
,
Если это неверно, ссылка на источник GUI или добавление фотографий результатов, которые вы сейчас получаете, поможет.