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);
}
}