35 lines
1.1 KiB
Kotlin
35 lines
1.1 KiB
Kotlin
package org.openrndr.extra.shapes.blend
|
|
|
|
import org.openrndr.extra.shapes.rectify.RectifiedPath3D
|
|
import org.openrndr.extra.shapes.rectify.rectified
|
|
import org.openrndr.shape.Path3D
|
|
|
|
/**
|
|
* ContourBlend holds two rectified contours with an equal amount of segments
|
|
*/
|
|
class Path3DBlend(val a: RectifiedPath3D, val b: RectifiedPath3D) {
|
|
fun mix(blendFunction: (Double) -> Double): Path3D {
|
|
return a.mix(b, blendFunction)
|
|
}
|
|
|
|
fun mix(blend: Double): Path3D {
|
|
return a.mix(b) { blend }
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create a [ContourBlend] for contours [a] and [b]
|
|
*
|
|
* Finding the pose that minimizes the error between [a] and [b] is not part of this function's work.
|
|
*
|
|
*/
|
|
fun Path3DBlend(a: Path3D, b: Path3D): Path3DBlend {
|
|
val ra = a.rectified()
|
|
val rb = b.rectified()
|
|
val sa = ra.splitForBlend(rb)
|
|
val sb = rb.splitForBlend(ra)
|
|
require(sa.originalPath.segments.size == sb.originalPath.segments.size) {
|
|
"preprocessing for contours failed to produce equal number of segments. ${sa.originalPath.segments.size}, ${sb.originalPath.segments.size}"
|
|
}
|
|
return Path3DBlend(sa, sb)
|
|
} |