Exit Full View
Up

/Games/CustomRiskBoard.foocad

CustomRiskBoard
FooCAD Source Code
import uk.co.nickthecoder.foocad.smartextrusion.v1.*
import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*

class CustomRiskBoard : Model {

    var name = "Test"

    var sideLength = 40

    var sides = 6

    var baseThickness = 0.6

    var wallSize = Vector2(2, 1.5)

    var clearance = 0.3

    var style = TextStyle(DEFAULT_FONT)
        .fontSize(10)

    meth bump( scale : double ) : Shape2d {
        return PolygonBuilder().apply {
            moveTo( 0, -1 )
            lineTo( 0.5, -0.3 )
            lineTo( 1.5, -1 )
            lineTo( 2.5, 0 )
            lineTo( 1.5, 1 )
            lineTo( 0.5, 0.3 )
            lineTo( 0, 1 )
        }.build()
            .scale( scale*0.8, scale )
            .roundCorner(5, scale*0.3)
            .roundCorner(4, scale*0.6)
            .roundCorner(3, scale*0.7)
            .roundCorner(2, scale*0.6)
            .roundCorner(1, scale*0.3)
    }

    meth polygon( sides : int ) : Shape2d {
        val outside = PolygonBuilder().apply {
            var x = 0.0
            var y = 0.0
            var angle = Math.PI
            moveTo( x, y )
            for ( i in 0 until sides ) {
                x += sideLength * Math.sin(angle)
                y += sideLength * Math.cos(angle)
                angle += Math.PI * 2 / sides
                println( "$x,$y")
                lineTo( x, y )
            }
        }.build().center()
            .offset( -clearance/2 )

        val bumpScale = sideLength*0.15
        val bump = bump( bumpScale )
        val indent = bump.mirrorX()
            .offset(clearance)

        val bumps = bump
            .centerYTo( -sideLength * 0.2 )
            .leftTo( outside.right - bumpScale*0.2 )
            .repeatAround( sides )

        val indents = indent
            .centerYTo( sideLength * 0.2 )
            .rightTo( outside.right + bumpScale*0.2 + clearance*2 )
            .repeatAround( sides )
            
        return outside + bumps - indents

    }

    meth territory( shape : Shape2d ) : Shape3d {
        
        val base = shape
            .smartExtrude( baseThickness )
                .bottom( Chamfer(wallSize.y / 3) )

        val wall = (shape - shape.offset( -wallSize.x ))
            .smartExtrude( wallSize.y )
                .outsideTop( Chamfer(wallSize.y / 3) )
            .bottomTo( base.top )

        return base + wall

    }

    meth polygon() = polygon( sides )

    meth rect2x1() : Shape2d {
        val square = polygon( 4 )
        val shape = square.translateX( sideLength/2 )
            .rotate(180).also() +
            Square( sideLength ).center().offset(-clearance/2 )

        return shape
    }

    override fun build() : Shape3d {
        val hexDX = sideLength * 1.73
        val squareDX = sideLength

        val hex1 = territory( polygon(6) )
        val hex2 = hex1
            .translateX( hexDX )

        val square = territory( polygon(4) )
            .translateX( hexDX *1.5 + squareDX / 2 )

        val rect = territory( rect2x1() )
            .translateX( - hexDX * 0.5 - squareDX  )


        return hex1 + hex2 + square + rect
    }
}