Methods Summary |
---|
public void | addToEnd(java.lang.Object[] by)Adds the input value to this Segment's end value.
if (by == null || !(by instanceof float[][])) {
throw new IllegalArgumentException();
}
float[][] add = (float[][]) by;
if (add.length != end.length) {
throw new IllegalArgumentException();
}
for (int ci = 0; ci < add.length; ci++) {
float[] v = end[ci];
float[] av = add[ci];
int vl = v != null ? v.length : 0;
int avl = av != null ? av.length : 0;
if (vl != avl) {
throw new IllegalArgumentException();
}
for (int di = 0; di < vl; di++) {
v[di] += av[di];
}
}
|
public void | collapse(Segment seg, Animation anim)Collapses this segment with the one passed as a parameter.
Note that if the input segment is not of the same class
as this one, an IllegalArgumentException is thrown. The
method also throws an exception if the input segment's
end does not have the same number of components as this
segment's end.
After this method is called, this segment's end value
is the one of the input seg parameter.
FloatSegment mseg = (FloatSegment) seg;
if (mseg.end.length != end.length) {
throw new IllegalArgumentException();
}
end = mseg.end;
|
public void | compute(float p, float[][] w)Computes an interpolated value for the given penetration in the
segment. Note that the start and end segment values must be set
before calling this method. Otherwise, a NullPointerException
is thrown.
// For each component
int nc = w.length;
int nd = 0;
for (int ci = 0; ci < nc; ci++) {
// For each dimension
nd = w[ci].length;
for (int di = 0; di < nd; di++) {
w[ci][di] = p * end[ci][di] + (1 - p) * start[ci][di];
}
}
|
public java.lang.Object[] | getEnd()
return end;
|
public float | getLength()
float length = 0;
final int nc = start.length;
for (int ci = 0; ci < nc; ci++) {
// Start value for the requested component.
float[] s = start[ci];
// End value for the requested component.
float[] e = end[ci];
// Number of dimensions.
int nd = s.length;
float clength = 0;
for (int di = 0; di < nd; di++) {
clength += (e[di] - s[di]) * (e[di] - s[di]);
}
length += MathSupport.sqrt(clength);
}
return length;
|
public java.lang.Object[] | getStart()
return start;
|
public void | initialize()Should be called after the segment's configuration is complete
to give the segment's implementation a chance to initialize
internal data and cache values.
|
public boolean | isAdditive()
return true;
|
public void | setStart(java.lang.Object[] newStart)Sets the start value.
start = (float[][]) newStart;
|
public void | setZeroStart()Sets the start value to its notion of 'zero'.
For a FloatSegment, a 'zero' start means zero all all
dimensions for all components.
for (int ci = 0; ci < start.length; ci++) {
for (int di = 0; di < start[ci].length; di++) {
start[ci][di] = 0;
}
}
|
public java.lang.String | toString()Debug helper.
StringBuffer sb = new StringBuffer();
sb.append("FloatSegment[");
if (start == null) {
sb.append("null");
} else {
sb.append("start[" + start.length + "] : {");
for (int ci = 0; ci < start.length; ci++) {
float[] fc = start[ci];
if (fc == null) {
sb.append("null");
} else {
sb.append("float[" + fc.length + "{");
for (int di = 0; di < fc.length; di++) {
sb.append(fc[di]);
if (di < fc.length - 1) {
sb.append(", ");
}
}
sb.append("}");
}
if (ci < start.length - 1) {
sb.append(", ");
}
}
sb.append("} ");
}
if (end == null) {
sb.append("null");
} else {
sb.append("end[" + end.length + "] : {");
for (int ci = 0; ci < end.length; ci++) {
float[] fc = end[ci];
if (fc == null) {
sb.append("null");
} else {
sb.append("float[" + fc.length + "{");
for (int di = 0; di < fc.length; di++) {
sb.append(fc[di]);
if (di < fc.length - 1) {
sb.append(", ");
}
}
sb.append("}");
}
if (ci < end.length - 1) {
sb.append(", ");
}
}
sb.append("}");
}
return sb.toString();
|