package zhuye;
|
|
import java.awt.BasicStroke;
|
import java.awt.Color;
|
import java.awt.Graphics2D;
|
import java.awt.Shape;
|
import java.awt.Stroke;
|
import java.awt.geom.Ellipse2D;
|
import java.awt.geom.Path2D;
|
import java.awt.geom.Point2D;
|
import java.util.List;
|
|
/**
|
* Utility renderer for handheld boundary previews.
|
*/
|
public final class adddikuaiyulan {
|
private static final Color HANDHELD_BOUNDARY_FILL = new Color(51, 153, 255, 60);
|
private static final Color HANDHELD_BOUNDARY_BORDER = new Color(0, 100, 0, 220);
|
private static final Color HANDHELD_BOUNDARY_POINT = new Color(0, 100, 0);
|
private static final double BASE_WORLD_MARKER_SIZE = 0.27d; // halve the base diameter for subtler markers
|
private static final double MIN_PIXEL_DIAMETER = 3.0d;
|
private static final double MAX_PIXEL_DIAMETER = 9.0d;
|
private static volatile double cachedMarkerPixelDiameter = -1.0d;
|
|
private adddikuaiyulan() {
|
}
|
|
public static void drawPreview(Graphics2D g2d,
|
List<Point2D.Double> previewPoints,
|
double scale,
|
boolean previewActive,
|
double diameterScale) {
|
if (!previewActive) {
|
cachedMarkerPixelDiameter = -1.0d;
|
}
|
|
if (g2d == null || !previewActive || previewPoints == null || previewPoints.isEmpty()) {
|
return;
|
}
|
|
Path2D.Double path = new Path2D.Double();
|
boolean started = false;
|
for (Point2D.Double point : previewPoints) {
|
if (point == null || !Double.isFinite(point.x) || !Double.isFinite(point.y)) {
|
continue;
|
}
|
if (!started) {
|
path.moveTo(point.x, point.y);
|
started = true;
|
} else {
|
path.lineTo(point.x, point.y);
|
}
|
}
|
|
if (!started) {
|
return;
|
}
|
|
Stroke originalStroke = g2d.getStroke();
|
Color originalColor = g2d.getColor();
|
|
if (previewPoints.size() >= 3) {
|
path.closePath();
|
g2d.setColor(HANDHELD_BOUNDARY_FILL);
|
g2d.fill(path);
|
}
|
|
float outlineWidth = 0.1f;
|
g2d.setStroke(new BasicStroke(outlineWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
|
g2d.setColor(HANDHELD_BOUNDARY_BORDER);
|
g2d.draw(path);
|
|
if (cachedMarkerPixelDiameter <= 0.0d) {
|
double previousPixelDiameter = Math.abs(BASE_WORLD_MARKER_SIZE * scale);
|
if (previousPixelDiameter <= 0.0d) {
|
previousPixelDiameter = MIN_PIXEL_DIAMETER;
|
}
|
cachedMarkerPixelDiameter = Math.max(MIN_PIXEL_DIAMETER,
|
Math.min(MAX_PIXEL_DIAMETER, previousPixelDiameter));
|
}
|
|
double effectiveScale = Math.max(0.01d, scale);
|
double markerSize = cachedMarkerPixelDiameter / effectiveScale;
|
double normalizedScale = Double.isFinite(diameterScale) && diameterScale > 0.0d ? diameterScale : 1.0d;
|
markerSize *= normalizedScale;
|
double markerRadius = markerSize / 2.0d;
|
|
for (Point2D.Double point : previewPoints) {
|
if (point == null || !Double.isFinite(point.x) || !Double.isFinite(point.y)) {
|
continue;
|
}
|
Shape marker = new Ellipse2D.Double(point.x - markerRadius, point.y - markerRadius, markerSize, markerSize);
|
g2d.setColor(HANDHELD_BOUNDARY_POINT);
|
g2d.fill(marker);
|
}
|
|
g2d.setStroke(originalStroke);
|
g2d.setColor(originalColor);
|
}
|
}
|