A
Weiter geht mein Leben als Alleinunterhalter...
Das ist richtig, ich habe noch einmal nachgefragt, (<)Point2D(>) sollte überall durch (<)Point2D.Double(>) ersetzt werden.
Hier ist mal ein git diff patch... vielleicht besteht ja Bedarf:
--- a/src/main/java/MapPolygon.java
+++ b/src/main/java/MapPolygon.java
@@ -27,12 +27,12 @@ public class MapPolygon {
public static void main(String[] args) throws IOException {
BufferedImage image = ImageIO.read(new File("Screenshot-2026-09-15-233031.png"));
- List<Point2D> points = getPolygon(image);
- for (Point2D point : points) {
+ List<Point2D.Double> points = getPolygon(image);
+ for (Point2D.Double point : points) {
System.out.println(point);
drawPointWith10px(image, point, Color.BLUE);
}
- List<Point2D> centers = calculatePolygonCenters(points);
+ List<Point2D.Double> centers = calculatePolygonCenters(points);
for (int i = 0; i < centers.size(); i++) {
System.out.println(i + 1 + ". " + centers.get(i));
}
@@ -42,7 +42,7 @@ public class MapPolygon {
ImageIO.write(image, "PNG", new File("Screenshot-2026-09-15-233031-2.png"));
}
- public static void drawPointWith10px(BufferedImage image, Point2D point, Color color) {
+ public static void drawPointWith10px(BufferedImage image, Point2D.Double point, Color color) {
Objects.requireNonNull(image, "image");
Objects.requireNonNull(point, "point");
@@ -59,7 +59,7 @@ public class MapPolygon {
}
}
- public static List<Point2D> calculatePolygonCenters(List<Point2D> points) {
+ public static List<Point2D.Double> calculatePolygonCenters(List<Point2D.Double> points) {
Objects.requireNonNull(points, "points");
if (points.size() < 3) {
throw new IllegalArgumentException("At least three points are required");
@@ -75,8 +75,8 @@ public class MapPolygon {
double centroidY = 0;
for (int index = 0; index < points.size(); index++) {
- Point2D current = Objects.requireNonNull(points.get(index), "points contains null");
- Point2D next =
+ Point2D.Double current = Objects.requireNonNull(points.get(index), "points contains null");
+ Point2D.Double next =
Objects.requireNonNull(points.get((index + 1) % points.size()), "points contains null");
if (!Double.isFinite(current.getX())
|| !Double.isFinite(current.getY())
@@ -115,7 +115,7 @@ public class MapPolygon {
return List.of(vertexCenter, edgeCenter, areaCenter);
}
- public static List<Point2D> getPolygon(BufferedImage image) {
+ public static List<Point2D.Double> getPolygon(BufferedImage image) {
Objects.requireNonNull(image, "image");
List<Point> redPixels = largestRedComponent(image);
[quote]Ich prüfe zunächst die Verwendungen von Point2D in MapPolygon.java sowie den aktuellen Arbeitsstand, damit die Vereinheitlichung ohne unbeabsichtigte Änderungen erfolgt.
Die Klasse verwendet Point2D nur noch in den öffentlichen Methoden und in main; alle erzeugten Geometriepunkte sind bereits Point2D.Double. Ich vereinheitliche daher diese Signaturen und lokalen Variablen auf Point2D.Double und prüfe anschließend den vorhandenen Gradle-Build.
Die Typvereinheitlichung ist umgesetzt. Der projektinterne Wrapper fehlt bzw. ist nicht ausführbar; ich prüfe deshalb noch die verfügbare Gradle-Installation und den finalen Diff, bevor ich abschließe.
MapPolygon.java wurde vereinheitlicht:
List<Point2D> durch List<Point2D.Double> ersetzt
Methodenparameter und Rückgabewerte auf Point2D.Double angepasst
Lokale Variablen in main und calculatePolygonCenters entsprechend aktualisiert
Alle bereits möglichen internen Verwendungen bleiben konsistent bei Point2D.Double
Der Diff ist whitespace-sauber. Der Gradle-Build konnte nicht ausgeführt werden, da in der Umgebung kein Java bzw. kein JAVA_HOME konfiguriert ist.[/quote]
Btw. im Forum fehlt ein Quote-Button - und ich bin zu faul, um selber manuell zu quoten...
Und ich muss mich leider entschuldigen, weil ich im Eingangsprompt List<Point2D> als Signatur vorgegeben hatte... dann ist es natürlich nicht verwunderlich, wenn Quatsch durch gen ai produziert wird.
Merke: Nicht jeder Entwickler ist unersetzlich, aber Entwickler sollten wenigstens grob wissen, was sie tun...
Ich glaube, mit "Gegen das Interface programmieren" ist immer das größtmögliche Interface gemeint, das aber noch die gesamte benötigte Funktionalität anbietet.
Beispiel: Tier -> Säugetier -> Fleischfresser -> Tierheimfähig -> Hund -> Beller -> Dackel
Jetzt möchte ich mit allen Tieren etwas machen können, die bellen können und Fleisch fressen... also wäre es bspw. nicht sinnvoll, Dackel, Säugetier oder Fleischfresser als Typ zu wählen...
(Ok, meine biologische Systematik ist ein wenig unsinnig (nicht nur problemdomänenbedingt, auch durch einen potenziellen Mehrfachvererbungskonflikt), aber ich hoffe, das Prinzip ist verständlicher geworden...)