private <E extends Vector<E>> E[] generateExtrudedPoints(
ImmutableVector<E> first,
ImmutableVector<E> mid,
ImmutableVector<E> last,
float extrude) {
ImmutableVector<E> dir1 = mid.clone().sub(first);
ImmutableVector<E> dir2 = last.clone().sub(mid);
ImmutableVector<E> left = dir1.clone().rotateCCW(2).normalize().mul(extrude);
ImmutableVector<E> right = left.clone().mul(-1);
if (dir1.isParrallelTo(dir2)) {
return toArray(mid.clone().add(left), mid.clone().add(right));
}
Line<E> firstLeft = Line.fromPoints(first.clone().add(left), mid.clone().add(left));
Line<E> firstRight = Line.fromPoints(first.clone().add(right), mid.clone().add(right));
left = dir2.clone().rotateCCW(2).normalize().mul(extrude);
right = left.clone().mul(-1);
Line<E> secondLeft = Line.fromPoints(last.clone().add(left), mid.clone().add(left));
Line<E> secondRight = Line.fromPoints(last.clone().add(right), mid.clone().add(right));
try {
E leftResult = firstLeft.getIntersection(secondLeft);
E rightResult = firstRight.getIntersection(secondRight);
return toArray(leftResult, rightResult);
} catch (Throwable t) {
System.out.println(t);
dir1.isParrallelTo(dir2);
throw t;
}
}