PolygonMacroPrimitive.java

package com.varnernet.gerb4j.macro;

import com.varnernet.gerb4j.Polarity;
import com.varnernet.gerb4j.render.GerberOutputTarget;

import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

/**
 * Gerber macro primitive type 5 — Regular Polygon. Format: {@code
 * 5,exposure,numVertices,centerX,centerY,diameter,rotation}
 */
final class PolygonMacroPrimitive extends AbstractMacroPrimitive {

    private final int numVertices;
    private final double centerX;
    private final double centerY;
    private final double diameter;
    private final double rotation;

    PolygonMacroPrimitive(
            final boolean exposed,
            final int numVertices,
            final double centerX,
            final double centerY,
            final double diameter,
            final double rotation) {
        super(exposed);
        this.numVertices = numVertices;
        this.centerX = centerX;
        this.centerY = centerY;
        this.diameter = diameter;
        this.rotation = rotation;
    }

    @Override
    public Rectangle2D getBounds() {
        // Circumscribed-circle bounding box — rotation does not change the enclosing circle.
        double r = diameter / 2.0;
        return new Rectangle2D.Double(centerX - r, centerY - r, diameter, diameter);
    }

    @Override
    public void render(final Point2D flashPoint, final GerberOutputTarget target, final Polarity polarity) {
        Point2D center = new Point2D.Double(flashPoint.getX() + centerX, flashPoint.getY() + centerY);
        target.drawPolygon(center, numVertices, diameter, rotation, effectivePolarity(polarity));
    }
}