Das Zoomen in Mandelbrot-Menge Fraktale in Java
Ich bin Anfang zu machen, ein apfelmännchen-fraktal-viewer. Ich habe eine Menge Probleme, wenn es um das Zoomen in das fraktal. Wenn Sie versuchen, um zu vergrößern, wird der Betrachter gerade in der Nähe auf der center. Ich habe so viel getan, wie ich kann, um zu verstehen dieses dilemma. Wie kann ich zoom-in auf meine Fraktale in der Weise, dass, wenn ich zu vergrößern, Sie werden vergrößern auf die Mitte des Bildschirms, und nicht das Zentrum des fraktalen?
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import java.awt.event.*;
public class Mandelbrot extends JFrame implements ActionListener {
private JPanel ctrlPanel;
private JPanel btnPanel;
private int numIter = 50;
private double zoom = 130;
private double zoomIncrease = 100;
private int colorIter = 20;
private BufferedImage I;
private double zx, zy, cx, cy, temp;
private int xMove, yMove = 0;
private JButton[] ctrlBtns = new JButton[9];
private Color themeColor = new Color(150,180,200);
public Mandelbrot() {
super("Mandelbrot Set");
setBounds(100, 100, 800, 600);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
plotPoints();
Container contentPane = getContentPane();
contentPane.setLayout(null);
ctrlPanel = new JPanel();
ctrlPanel.setBounds(600,0,200,600);
ctrlPanel.setBackground(themeColor);
ctrlPanel.setLayout(null);
btnPanel = new JPanel();
btnPanel.setBounds(0,200,200,200);
btnPanel.setLayout(new GridLayout(3,3));
btnPanel.setBackground(themeColor);
ctrlBtns[1] = new JButton("up");
ctrlBtns[7] = new JButton("down");
ctrlBtns[3] = new JButton ("left");
ctrlBtns[5] = new JButton("right");
ctrlBtns[2] = new JButton("+");
ctrlBtns[0] = new JButton("-");
ctrlBtns[8] = new JButton(">");
ctrlBtns[6] = new JButton("<");
ctrlBtns[4] = new JButton();
contentPane.add(ctrlPanel);
contentPane.add(new imgPanel());
ctrlPanel.add(btnPanel);
for (int x = 0; x<ctrlBtns.length;x++){
btnPanel.add(ctrlBtns[x]);
ctrlBtns[x].addActionListener(this);
}
validate();
}
public class imgPanel extends JPanel{
public imgPanel(){
setBounds(0,0,600,600);
}
@Override
public void paint (Graphics g){
super.paint(g);
g.drawImage(I, 0, 0, this);
}
}
public void plotPoints(){
I = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
for (int y = 0; y < getHeight(); y++) {
for (int x = 0; x < getWidth(); x++) {
zx = zy = 0;
cx = (x - 320+xMove) / zoom;
cy = (y - 290+yMove) / zoom;
int iter = numIter;
while (zx * zx + zy * zy < 4 && iter > 0) {
temp = zx * zx - zy * zy + cx;
zy = 2 * zx * zy + cy;
zx = temp;
iter--;
}
I.setRGB(x, y, iter | (iter << colorIter));
}
}
}
public void actionPerformed(ActionEvent ae){
String event = ae.getActionCommand();
switch (event){
case "up":
yMove-=100;
break;
case "down":
yMove+=100;
break;
case "left":
xMove-=100;
break;
case "right":
xMove+=100;
break;
case "+":
zoom+=zoomIncrease;
zoomIncrease+=100;
break;
case "-":
zoom-=zoomIncrease;
zoomIncrease-=100;
break;
case ">":
colorIter++;
break;
case "<":
colorIter--;
break;
}
plotPoints();
validate();
repaint();
}
public static void main(String[] args) {
new Mandelbrot().setVisible(true);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Mandelbrot-Menge besteht in einer mathematischen Ebene mit natürlichen Koordinaten. Sie "Ansicht" dies mit einem BufferedImage ich mit "view port" - Koordinaten. Es ist alles in der Zuordnung zwischen diese. Sie haben mit der Bezeichnung der viewport-Koordinaten als x und y, und die "echten" Koordinaten in die Mandelbrot-Raum als cx und cy. Dies sind die Formeln:
Um zu vergrößern und aus einer bestimmten "realen" Ort, Sie wollen die Höhe Ihrer Verschiebung konstant ist, wie Sie Zoomen. Das problem ist, dass der Betrag der Verschiebung wird skaliert, indem der zoom-Wert. Denken Sie daran cx und cy sind die realen Koordinaten in der Mandelbrot-Ebene und x & y sind die viewport-Koordinaten. Also, wenn man auf die Mitte des Viewports, wie Sie zoom ändern, Sie wollen cx & cy konstant zu bleiben.
Meine Vermutung ist, dass Sie etwas wie:
Dadurch wird die "Bewegung" in die Mandelbrot-Ebene bleiben unabhängig von der zoom-Wert. Ich gehe davon aus, dass die 320 und 290 ist in Bezug auf viewport-Größe und gibt Ihnen eine null in die Mitte des Viewports.
Sind Sie gehen zu wollen, den Betrag, der xMove & yMove ändern auf einen Tastendruck, um nicht einen festen Betrag (100), sondern vielmehr eine Menge, die hängt von der Zoomstufe. Wie Sie zoom in einer Menge, die Sie möchten, dass der Betrag der Bewegung in der realen Mandelbrot-Ebene kleiner zu sein für jeden Tastenanschlag.
Konnte ich beheben dieses problem, indem er eine zusätzliche horizontale oder vertikale Verschiebung jedes mal, wenn ich gezoomt in.
Daher, anstatt:
Werde ich nun
diese im Grunde verschiebt das Bild, das gezeichnet worden ist durch die Multiplikation Ihrer Bewegung auf die x-und y-Achse durch den Faktor, dass der zoom erhöht hat (zwei).
zoom *= 2;