Tôi bắt đầu tạo một bộ xem fractal cho mandelbrot. Tôi đang gặp phải rất nhiều vấn đề khi phóng to hình ảnh fractal. Nếu bạn cố gắng thu phóng, người xem sẽ chỉ đóng ở trung tâm. Tôi đã làm nhiều nhất có thể để hiểu được tình trạng tiến thoái lưỡng nan này. Làm thế nào tôi có thể phóng to trên fractal của tôi theo cách mà khi tôi phóng to, nó sẽ phóng to ở trung tâm của màn hình, và không phải là trung tâm của fractal?Phóng to trên bộ fractal của Mandelbrot trong Java
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);
}
}
Vui lòng [chấp nhận] (http://meta.stackexchange.com/a/65088/155831) câu trả lời khi bạn có cơ hội. Vui mừng bạn đã nhận nó được sắp xếp. :) –
Nhân xMove bằng cách phóng to, để sau này bạn có thể chia bằng cách thu phóng, về cơ bản sẽ hoạt động, nhưng có vẻ như đó là một cách quá phức tạp để thực hiện điều đó. Trên thực tế, kết quả không chính xác về mặt toán học: thu phóng bắt đầu ở 130 và zoomIncrease bắt đầu ở mức 100 và khi bạn thêm những thứ đó lại với nhau, nó không tăng gấp đôi chính xác, do đó tăng gấp đôi xMove sẽ không chính xác. Hãy nhớ rằng, trong tất cả các mã hóa, đơn giản là luôn luôn tốt hơn. Đơn giản hóa và làm cho thuật toán này chính xác, bằng cách loại bỏ zoomIncrease và chỉ đơn giản là sử dụng 'zoom * = 2; ' – AgilePro