package viewer; import mandelbrot.Complex; /** * A class to represent the view (a rectangle over the complex plane) * to be displayed. Some interesting views are already defined. */ class Camera { /** * The high-level view of the Mandelbrot set. */ static Camera camera0 = new Camera( -0.5, 0., 3, 4. / 3.); private final Complex center; /* Center of the rectangle */ private final Complex width; /* Vector for the width of the rectangle */ private final Complex height; /* Vector for the height of the rectangle */ /** * Creates a view. * * @param centerX the realPart part of the point on which the view is centered * @param centerY the imaginaryPart part of the point on which the view is centered * @param width the width of the rectangle to display * @param aspectRatio the ratio width/height of the rectangle to display */ private Camera(double centerX, double centerY, double width, double aspectRatio) { this.width = Complex.real(width); this.height = new Complex(0, width / aspectRatio); this.center = new Complex(centerX, centerY); } /** * Converts position relative to the rectangle defining the view * into absolute complex numbers. * * @param tx horizontal relative position, between 0 (left) and 1 (right) * @param ty vertical relative position, between 0 (bottom) and 1 (top) * @return the complex at this position of the rectangle */ Complex toComplex(double tx, double ty) { return center.add(width.scale(tx - 0.5)).add(height.scale(ty - 0.5)); } }