[orx-shapes] Improve RectifiedContour's handling of empty contours

This commit is contained in:
Edwin Jakobs
2023-07-18 10:24:56 +02:00
parent 5770281a5f
commit 607c0c58c6

View File

@@ -25,39 +25,62 @@ class RectifiedContour(val contour: ShapeContour, distanceTolerance: Double = 0.
* computes a rectified t-value for [contour] * computes a rectified t-value for [contour]
*/ */
fun rectify(t: Double): Double { fun rectify(t: Double): Double {
if (t <= 0.0) { if (contour.empty) {
return 0.0 return 0.0
}
val fi = t * (points.size - 1.0)
val fr = fi.mod(1.0)
val i0 = fi.toInt()
val i1 = i0 + 1
return if (i0 >= points.size - 1) {
1.0
} else { } else {
(points[i0].second * (1.0 - fr) + points[i1].second * fr) if (t <= 0.0) {
return 0.0
}
val fi = t * (points.size - 1.0)
val fr = fi.mod(1.0)
val i0 = fi.toInt()
val i1 = i0 + 1
return if (i0 >= points.size - 1) {
1.0
} else {
(points[i0].second * (1.0 - fr) + points[i1].second * fr)
}
} }
} }
fun position(t: Double): Vector2 { fun position(t: Double): Vector2 {
return contour.position(rectify(safe(t))) return if (contour.empty) {
Vector2.INFINITY
} else {
contour.position(rectify(safe(t)))
}
} }
fun velocity(t: Double): Vector2 { fun velocity(t: Double): Vector2 {
val (segment, st) = contour.segment(rectify(safe(t))) return if (contour.empty) {
return contour.segments[segment].direction(st) Vector2.ZERO
} else {
val (segment, st) = contour.segment(rectify(safe(t)))
contour.segments[segment].direction(st)
}
} }
fun normal(t: Double): Vector2 { fun normal(t: Double): Vector2 {
return contour.normal(rectify(safe(t))) return if (contour.empty) {
Vector2.UNIT_Y
} else {
contour.normal(rectify(safe(t)))
}
} }
fun pose(t: Double): Matrix44 { fun pose(t: Double): Matrix44 {
return contour.pose(rectify(safe(t))) return if (contour.empty) {
Matrix44.IDENTITY
} else {
contour.pose(rectify(safe(t)))
}
} }
fun sub(t0: Double, t1: Double): ShapeContour { fun sub(t0: Double, t1: Double): ShapeContour {
if (contour.empty) {
return ShapeContour.EMPTY
}
return if (contour.closed) { return if (contour.closed) {
contour.sub(rectify(t0.mod(1.0)) + floor(t0), rectify(t1.mod(1.0)) + floor(t1)) contour.sub(rectify(t0.mod(1.0)) + floor(t0), rectify(t1.mod(1.0)) + floor(t1))
} else { } else {