java mandelbrot集移动错误
所以我一直在尝试用java编写mandelbrot集,我知道代码不是很优化,但我刚刚开始这样做 这个想法是当我点击一个像素时,它会把这个像素放在中心(代表一个复数),然后计算它周围的集合。这在一开始是有效的,但如果我放大它,它会开始表现得很奇怪。我猜可能是我的midX、midY或是显示功能有点奇怪,但我已经看了很长时间了,想不出来,希望能得到一些帮助java mandelbrot集移动错误,java,mandelbrot,Java,Mandelbrot,所以我一直在尝试用java编写mandelbrot集,我知道代码不是很优化,但我刚刚开始这样做 这个想法是当我点击一个像素时,它会把这个像素放在中心(代表一个复数),然后计算它周围的集合。这在一开始是有效的,但如果我放大它,它会开始表现得很奇怪。我猜可能是我的midX、midY或是显示功能有点奇怪,但我已经看了很长时间了,想不出来,希望能得到一些帮助 class set { DotWindow w; int[][] arrayColor; int max = 100;
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));
}
}
}
}
}
类集合{
dotw;
int[][]阵列颜色;
int max=100;
灰度;
双变焦=1.1;
双中点=-0.5;
双midY=0;
公共静态void main(字符串[]args){
新集合().run();
}
无效运行(){
设置();
runLoop();
}
void runLoop(){
int x;
int-y;
while(true){
GameEvent事件=w.getNextEvent();
开关(event.getKind()){
case GameEvent.KEY_按下:
int key=event.getKey();
如果(键==43){
缩放=缩放*1.1;
}否则,如果(键==45){
缩放=缩放/1.1;
}
显示();
打破
case GameEvent.MOUSE_单击:
midX=midX-(1-event.getX()/250.0);
midY=midY-(1-event.getY()/250.0);
系统输出打印LN(midX);
显示();
打破
}
}
}
无效设置(){
w=新的点窗口(500500,1);
w、 选中鼠标(真、假、假、假、假);
w、 检查键(真、假、假);
arrayColor=新整数[500][500];
缩放=缩放/1.1;
显示();
}
int计算(双re,双im){
双Zre=0;
双Zim=0;
双Zim2=0;
双Zre2=0;
int迭代次数=0;
对于(int k=0;k4.0){
返回k;
}
Zim2=Zim*Zim;
Zre2=Zre*Zre;
Zim=2.0*Zre*Zim+im;
Zre=Zre2-Zim2+re;
迭代次数=k;
}
返回迭代;
}
无效显示(){
用于(双y=0;y<500;y++){
用于(双x=0;x<500;x++){
双值=计算((midX-(1-x/250)/缩放),
(midY-(1-y/250)/缩放);
如果(值==99){
w、 设定点((int)x,(int)y,颜色为黑色);
}否则{
w、 设定点((int)x,(int)y,灰度=新灰度(
255-(int)值*2));
}
}
}
}
}
你已经放大了,比如说放大了10倍,但是你改变了中心坐标,而不考虑缩放值。你介意显示你收到的错误行为吗,最好是截图吗?Eclipse中的CTRL+SHIFT+F有帮助:)添加JAVA标记非常有帮助;)谢谢:)屏幕截图并不能真正解释它,因为它看起来是正确的,但当你移动它时,它不会正确移动。如果我放大几次,它就不会再把我点击的像素放在中间了。似乎只有在放大率不太大的情况下它才能工作。
case GameEvent.MOUSE_CLICKED:
midX = midX - (1 - event.getX() / 250.0)/zoom;
midY = midY - (1 - event.getY() / 250.0)/zoom;
System.out.println(midX);
display();