# GeneralPath wie eine Parabel: Scheitelpunkt bestimmen



## aze (24. Mrz 2011)

Hi

Hat jemand eine Idee wie man bei einem GeneralPath,der eine Parabel zeichnet,den Scheitelpunkt bestimmen könnte ?

Schöne Grüße

Aze


----------



## Marco13 (24. Mrz 2011)

Bei einer "echten" Parabel: Den Pfad langlaufen und den Punkt mit dem kleinsten y-Wert suchen?! :bahnhof:


----------



## aze (24. Mrz 2011)

Und wie läuft man dem Pfad entlang ?  Mit dem PathIterator ?


----------



## Marco13 (24. Mrz 2011)

Im einfachsten Fall, ja... Kannst du die Frage ansonsten konkretisieren?


----------



## aze (24. Mrz 2011)

Marco13 hat gesagt.:


> Im einfachsten Fall, ja... Kannst du die Frage ansonsten konkretisieren?



Naja,ich meinte wie ich das jetzt umsetzen kann von dem du gerade gesprochen hast.Wie kriege ich mit dem PathIterator alle Punkte ? Ich habe mir mal die Methode "currentSegment(double[] /float[]) angeguckt.Ich glaub die gibt aber nur die Stützpunkte wieder.


----------



## Marco13 (24. Mrz 2011)

Naja, "alle" Punkte sind bei einer Bezier-Kurve unendlich viele. Aber man kann diese Methode verwenden. Dort wird die Kurve in Geradenstücke umgewandelt, die man sich dann wie üblich mit dem Iterator abholen kann (und wenn es genau daraum geht: hier ein Beispiel dazu...)


----------



## aze (14. Jun 2011)

Hi

ausgehend von der Definition bei Wikipedia:







habe ich folgende Funktion geschrieben.Leider funktioniert sie nicht.Sieht jemand den Fehler ?


```
private static Point getMinPoint(GeneralPath gp) {

        PathIterator pi = gp.getPathIterator(null);
        ArrayList<Point> points = new ArrayList<Point>();
        while (!pi.isDone()) {
            double segment[] = new double[6];
            int segmentKind = pi.currentSegment(segment);
            if (segmentKind == PathIterator.SEG_CUBICTO) {
                Point point = new Point((int) segment[2], (int) segment[3]);
                points.add(point);
                break;
            }
            pi.next();
        }

        int currentY = Integer.MAX_VALUE;
        int currentX = Integer.MAX_VALUE;


        for (int i = 0; i < points.size(); i++) {
            Point bezierPolynomPoint = BezierPolynomPoint(i, points);
            if (bezierPolynomPoint.y < currentY) {
                currentY = bezierPolynomPoint.y;
                currentX = bezierPolynomPoint.x;
            }
        }
        System.out.println(currentX+ "," + currentY);
        return new Point(currentX, currentY);

    }

    //Berechnet den t´ten Bezierpunkt
    private static Point BezierPolynomPoint(double t, ArrayList<Point> points) {
        int bernsteinX = 0;
        int bernsteinY = 0;

        int n = points.size();

        for (int i = 0; i < points.size(); i++) {
            Point point = points.get(i);
            double bernstein = binomialKoeffizient(n, i) * Math.pow(t, i) * Math.pow((1 - t), (n - i));
            bernsteinX = (int) (bernsteinX + bernstein * point.x);
            bernsteinY = (int) (bernsteinY + bernstein * point.y);
        }

        return new Point(bernsteinX, bernsteinY);

    }

    //Berechnet den Binomialkoeffizienten

    private static int binomialKoeffizient(int d, int h) {
        if (h == 0) {
            return 1;
        } else if (d == h) {
            return (int) (Math.pow(2, d) + 0.5);
        } else {
            return binomialKoeffizient(d - 1, h) + binomialKoeffizient(d - 1, h - 1);
        }
    }
```


----------



## Marco13 (14. Jun 2011)

Müßte man erst ein KSKB basteln um (vielleicht) rauszufinden, was nicht funktioniert. BTW: Hast du FlatteningPathIterator (Java Platform SE 6) bzw. die oben verlinkte Funktion gesehen? Damit kommen keine CUBICTO mehr vor, könnte einfacher sein...


----------



## aze (14. Jun 2011)

Hi

Ja,die Klasse habe ich mir auch angeguckt.Ich denke mit diesem PathIterator könnte man sich die Stützpunkte leichter heranholen.Das Problem liegt aber nicht darin.


----------



## Marco13 (14. Jun 2011)

Stimmen die Punkte denn?
  Point bezierPolynomPoint = BezierPolynomPoint(i, points);
*System.out.println("Punkt "+i+" ist "+bezierPolynomPoint );*

?


----------

