1 package com.piro.bezier;
4 import eu.mihosoft.vrl.v3d.Vector3d;
15 public Bezier(
float sx,
float sy,
float[] coords,
int numCoords)
20 public void setCoords(
float sx,
float sy,
float[] coords,
int numCoords)
22 coord =
new float[numCoords * 2 + 2];
25 for (
int i = 0; i < numCoords; i++)
27 coord[i * 2 + 2] = coords[i * 2];
28 coord[i * 2 + 3] = coords[i * 2 + 1];
45 for (
int i = 2; i < coord.length; i += 2)
47 length +=
lineLength(coord[i - 2], coord[i - 1], coord[i], coord[i + 1]);
51 private float lineLength(
float x1,
float y1,
float x2,
float y2)
53 float dx = x2 - x1, dy = y2 - y1;
54 return (
float) Math.sqrt(dx * dx + dy * dy);
59 point.
x = coord[coord.length - 2];
60 point.
y = coord[coord.length - 1];
69 int numKnots = coord.length / 2;
71 for (
int i = 0; i < numKnots; i++)
73 double scale =
bernstein(numKnots - 1, i, param);
74 point.
x += coord[i * 2] * scale;
75 point.
y += coord[i * 2 + 1] * scale;
78 return new Vector3d(point.
x,point.
y);
87 private double bernstein(
int numKnots,
int knotNo,
double param)
89 double iParam = 1 - param;
111 return iParam * iParam;
113 return 2 * iParam * param;
115 return param * param;
124 return iParam * iParam * iParam;
126 return 3 * iParam * iParam * param;
128 return 3 * iParam * param * param;
130 return param * param * param;
138 for (
int i = 0; i < knotNo; i++)
142 for (
int i = 0; i < numKnots - knotNo; i++)
146 retVal *=
choose(numKnots, knotNo);
155 int denom2 = num - denom;
164 for (
int i = num; i > denom; i--)
169 for (
int i = 2; i <= denom2; i++)
float lineLength(float x1, float y1, float x2, float y2)
double bernstein(int numKnots, int knotNo, double param)
Vector2 getFinalPoint(Vector2 point)
Bezier(float sx, float sy, float[] coords, int numCoords)
int choose(int num, int denom)
void setCoords(float sx, float sy, float[] coords, int numCoords)