All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.oliviercailloux.geometry.Zone Maven / Gradle / Ivy

package io.github.oliviercailloux.geometry;

import static com.google.common.base.Preconditions.checkArgument;

import com.google.common.collect.Range;
import java.util.stream.Stream;

public class Zone {

  public static Zone centered(Point center, Point size) {
    Point semiSize = size.mult(0.5);
    return new Zone(center.moveBy(semiSize.opposite()), center.moveBy(semiSize));
  }

  public static Zone at(Point... corners) {
    Range xs = Range.encloseAll(Stream.of(corners).mapToDouble(Point::x)::iterator);
    Range ys = Range.encloseAll(Stream.of(corners).mapToDouble(Point::y)::iterator);
    Point start = Point.given(xs.lowerEndpoint(), ys.lowerEndpoint());
    Point end = Point.given(xs.upperEndpoint(), ys.upperEndpoint());
    return new Zone(start, end);
  }

  public static Zone cornerMove(Point corner, Displacement move) {
    return Zone.at(corner, corner.moveBy(move));
  }

  private final Point start;
  private final Point end;

  public Zone(Point start, Point end) {
    checkArgument(start.x() <= end.x());
    checkArgument(start.y() <= end.y());
    this.start = start;
    this.end = end;
  }

  public Point start() {
    return start;
  }

  public Displacement across() {
    return Displacement.between(start, end);
  }

  public Point size() {
    return end.moveBy(start.opposite());
  }

  public Point end() {
    return end;
  }

  public Point center() {
    return start.moveBy(size().mult(0.5));
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy