JavaCAD
Bezier.java
Go to the documentation of this file.
1 package com.piro.bezier;
2 
3 
4 import eu.mihosoft.vrl.v3d.Vector3d;
5 
10 public class Bezier
11 {
12  float length;
13  float[] coord;
14 
15  public Bezier(float sx, float sy, float[] coords, int numCoords)
16  {
17  setCoords(sx, sy, coords, numCoords);
18  }
19 
20  public void setCoords(float sx, float sy, float[] coords, int numCoords)
21  {
22  coord = new float[numCoords * 2 + 2];
23  coord[0] = sx;
24  coord[1] = sy;
25  for (int i = 0; i < numCoords; i++)
26  {
27  coord[i * 2 + 2] = coords[i * 2];
28  coord[i * 2 + 3] = coords[i * 2 + 1];
29  }
30 
31  calcLength();
32  }
33 
37  public float getLength()
38  {
39  return length;
40  }
41 
42  private void calcLength()
43  {
44  length = 0;
45  for (int i = 2; i < coord.length; i += 2)
46  {
47  length += lineLength(coord[i - 2], coord[i - 1], coord[i], coord[i + 1]);
48  }
49  }
50 
51  private float lineLength(float x1, float y1, float x2, float y2)
52  {
53  float dx = x2 - x1, dy = y2 - y1;
54  return (float) Math.sqrt(dx * dx + dy * dy);
55  }
56 
58  {
59  point.x = coord[coord.length - 2];
60  point.y = coord[coord.length - 1];
61  return point;
62  }
63 
64  Vector3d eval(double param)
65  {
66  Vector2 point = new Vector2();
67  point.x = 0;
68  point.y = 0;
69  int numKnots = coord.length / 2;
70 
71  for (int i = 0; i < numKnots; i++)
72  {
73  double scale = bernstein(numKnots - 1, i, param);
74  point.x += coord[i * 2] * scale;
75  point.y += coord[i * 2 + 1] * scale;
76  }
77 
78  return new Vector3d(point.x,point.y);
79  }
80 
87  private double bernstein(int numKnots, int knotNo, double param)
88  {
89  double iParam = 1 - param;
90  //Faster evaluation for easy cases:
91  switch (numKnots)
92  {
93  case 0:
94  return 1;
95  case 1:
96  {
97  switch (knotNo)
98  {
99  case 0:
100  return iParam;
101  case 1:
102  return param;
103  }
104  break;
105  }
106  case 2:
107  {
108  switch (knotNo)
109  {
110  case 0:
111  return iParam * iParam;
112  case 1:
113  return 2 * iParam * param;
114  case 2:
115  return param * param;
116  }
117  break;
118  }
119  case 3:
120  {
121  switch (knotNo)
122  {
123  case 0:
124  return iParam * iParam * iParam;
125  case 1:
126  return 3 * iParam * iParam * param;
127  case 2:
128  return 3 * iParam * param * param;
129  case 3:
130  return param * param * param;
131  }
132  break;
133  }
134  }
135 
136  //If this bezier has more than four points, calculate bernstein the hard way
137  double retVal = 1;
138  for (int i = 0; i < knotNo; i++)
139  {
140  retVal *= param;
141  }
142  for (int i = 0; i < numKnots - knotNo; i++)
143  {
144  retVal *= iParam;
145  }
146  retVal *= choose(numKnots, knotNo);
147 
148  return retVal;
149  }
150 
151 
152 
153  private int choose(int num, int denom)
154  {
155  int denom2 = num - denom;
156  if (denom < denom2)
157  {
158  int tmp = denom;
159  denom = denom2;
160  denom2 = tmp;
161  }
162 
163  int prod = 1;
164  for (int i = num; i > denom; i--)
165  {
166  prod *= num;
167  }
168 
169  for (int i = 2; i <= denom2; i++)
170  {
171  prod /= i;
172  }
173 
174  return prod;
175  }
176 }
float lineLength(float x1, float y1, float x2, float y2)
Definition: Bezier.java:51
double bernstein(int numKnots, int knotNo, double param)
Definition: Bezier.java:87
Vector2 getFinalPoint(Vector2 point)
Definition: Bezier.java:57
Bezier(float sx, float sy, float[] coords, int numCoords)
Definition: Bezier.java:15
int choose(int num, int denom)
Definition: Bezier.java:153
void setCoords(float sx, float sy, float[] coords, int numCoords)
Definition: Bezier.java:20