0
所以我一直在嘗試編程在java中的mandelbrot集,我知道代碼不是非常優化,但我剛開始這樣做。java mandelbrot set moving wrong
這個想法是,當我點擊一個像素,它會把該像素放在中心(表示一個複數),並計算它周圍的集合。這工作在一開始,但如果我放大它會開始表現怪異。我猜這是我的midX,midY或顯示功能,這很奇怪,但我一直在尋找它很長一段時間,無法弄清楚,希望能得到一些幫助。
class set {
DotWindow w;
int[][] arrayColor;
int max = 100;
Grayscale gray;
double zoom = 1.1;
double midX = -0.5;
double midY = 0;
public static void main(String[] args) {
new set().run();
}
void run() {
setup();
runLoop();
}
void runLoop() {
int x;
int y;
while (true) {
GameEvent event = w.getNextEvent();
switch (event.getKind()) {
case GameEvent.KEY_PRESSED:
int key = event.getKey();
if (key == 43) {
zoom = zoom * 1.1;
} else if (key == 45) {
zoom = zoom/1.1;
}
display();
break;
case GameEvent.MOUSE_CLICKED:
midX = midX - (1 - event.getX()/250.0);
midY = midY - (1 - event.getY()/250.0);
System.out.println(midX);
display();
break;
}
}
}
void setup() {
w = new DotWindow(500, 500, 1);
w.checkMouse(true, false, false, false, false);
w.checkKeys(true, false, false);
arrayColor = new int[500][500];
zoom = zoom/1.1;
display();
}
int calculate(double re, double im) {
double Zre = 0;
double Zim = 0;
double Zim2 = 0;
double Zre2 = 0;
int iterations = 0;
for (int k = 0; k < max; k++) {
if (Zre2 + Zim2 > 4.0) {
return k;
}
Zim2 = Zim * Zim;
Zre2 = Zre * Zre;
Zim = 2.0 * Zre * Zim + im;
Zre = Zre2 - Zim2 + re;
iterations = k;
}
return iterations;
}
void display() {
for (double y = 0; y < 500; y++) {
for (double x = 0; x < 500; x++) {
double value = calculate((midX - (1 - x/250)/zoom),
(midY - (1 - y/250)/zoom));
if (value == 99) {
w.setDot((int) x, (int) y, Color.BLACK);
} else {
w.setDot((int) x, (int) y, gray = new Grayscale(
255 - (int) value * 2));
}
}
}
}
}
您是否介意以最好的截圖形式顯示您收到的錯誤行爲? – Vesper 2013-03-28 10:19:38
在Eclipse中CTRL + SHIFT + F有助於:)在SO上添加JAVA標記有助於*很多*;) – 2013-03-28 10:20:13
謝謝:)嗯,截圖並沒有真正解釋它,因爲它看起來是正確的,但是當你移動它時正確移動。如果我放大幾倍,它不會把我點擊的像素放在中心。似乎只有在放大倍數不太大的情況下才有效。 – poffsan 2013-03-28 10:35:05