Exit Full View
Up

/Vases/HighRise.foocad

HighRise
FooCAD Source Code
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*

include PlantPot.foocad

class HighRise : Model {
    
    val height = 100

    val stemSize = Vector2(15, 200)

    val baseSize = Vector2( 115, 30 )

    val thickness = 2.0


    fun twist(d : double, extra : bool ) : Shape3d {
        val steps = 30
        val wiggle = Path3dBuilder().apply {
            if (extra) {
                moveTo( 0,0,-1)
                lineTo( 0,0,0 )
            } else {
                moveTo( 0,0,0 )
            }
            val foo = 15
            for (i in 0..steps) {
                val angle = i/steps * 720
                val offset = Degrees.cos(i/steps * 360) * foo - foo
                lineTo(
                    Degrees.sin(angle)*offset,
                    Degrees.cos(angle)*offset,
                    i/steps * stemSize.y
                )
            }
            if (extra) {
                lineTo(0,0,stemSize.y+10)
            }
        }.build()
        // Extrude the rounded square along the 3D path.
        return ExtrusionBuilder
            .followPath( wiggle, Circle( d/2 )  )

    }

    override fun build() : Shape3d {

        val path = PolygonBuilder().apply {
            moveTo(0,0)
            lineBy( baseSize.x/2, 0 )
            lineBy( 0, thickness/2 )
            bezierBy(
                Vector2( 0, baseSize.y * 0.5 ),
                Vector2( 0, baseSize.y * 0.3 ),
                Vector2( -baseSize.x/2 + stemSize.x/2 - thickness/2, baseSize.y )
            )

        }.buildPath()
        val base = path.thickness( thickness ).revolve().bottomTo(0).color("Green")

        val third = twist( stemSize.x, false ).color("Green")
        val stem = third.bottomTo( base.top ) //.repeatAroundZ(3).bottomTo( base.top )

        return stem
    }

}