Что именно делают эти методы? - PullRequest
0 голосов
/ 27 апреля 2020

Надеюсь, у тебя все хорошо. У меня есть Java программа, которая позволяет вам масштабировать фигуру MandelBrot, но я не совсем понимаю, как мы получаем результаты, более конкретно, что делает каждый метод и как он выполняет свои функции (особенно метод с именем «paint»).

Here's the code:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class MandelBrot1 extends Applet implements MouseListener {
  private int max = 64;
  private Color[] colors = new Color[48];
  private double viewX = 0.0;
  private double viewY = 0.0;
  private double zoom = 1.0;
  private int mouseX;
  private int mouseY;

  public void init() {
    addMouseListener(this);
    for (int i = 0; i < colors.length; i++) {
      int c = 2 * i * 256 / colors.length;
      if (c > 255)
        c = 511 - c;
      colors[i] = new Color(c, c, c);
    }
  }

  public void paint(Graphics g) {
    Dimension size = getSize();
    for (int y = 0; y < size.height; y++) {
      for (int x = 0; x < size.width; x++) {
        double r = zoom / Math.min(size.width, size.height);
        double dx = 2.5 * (x * r + viewX) - 2.0;
        double dy = 1.25 - 2.5 * (y * r + viewY);
        int value = mandel(dx, dy);
        g.setColor(colors[value % colors.length]);
        g.drawLine(x, y, x, y);
      }
    }
  }

   public void update(Graphics g) {
     paint(g);
  }

  private int mandel(double px, double py) {
    double zx = 0.0, zy = 0.0;
    double zx2 = 0.0, zy2 = 0.0;
    int value = 0;
    while (value < max && zx2 + zy2 < 4.0) {
      zy = 2.0 * zx * zy + py;
      zx = zx2 - zy2 + px;
      zx2 = zx * zx;
      zy2 = zy * zy;
      value++;
    }
    return value == max ? 0 : value;
  }

  public void mousePressed(MouseEvent e) {
    mouseX = e.getX();
    mouseY = e.getY();
  }

  public void mouseReleased(MouseEvent e) {
    int x = e.getX();
    int y = e.getY();
    if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
      if (x != mouseX && y != mouseY) {
        int w = getSize().width;
        int h = getSize().height;
        viewX += zoom * Math.min(x, mouseX) / Math.min(w, h);
        viewY += zoom * Math.min(y, mouseY) / Math.min(w, h);
        zoom *= Math.max((double)Math.abs(x - mouseX) / w, (double)Math.abs(y - mouseY) / h);
      }
    }
    else if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0) {
      max += max / 4;
    }
    else {
      max = 64;
      viewX = viewY = 0.0;
      zoom = 1.0;
    }
     repaint();
  }

  public void mouseClicked(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}
}

Я был бы очень признателен, если бы кто-нибудь мог это объяснить, для меня очень важно понять методы этого класса. Заранее большое спасибо!

...