Exit Full View
Up

/Games/Backgammon.foocad

Backgammon
FooCAD Source Code
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
import uk.co.nickthecoder.foocad.layers.v1.Layer
import uk.co.nickthecoder.foocad.layers.v1.Layers
import static uk.co.nickthecoder.foocad.layers.v1.Layers.*
import static uk.co.nickthecoder.foocad.extras.v1.Extras.*

class Backgammon : Model {

    var pieceD = 10
    var gap = 3.0
    var margin = 6
    
    var layerA = Layer( "A", 1.2, "Red" )
    var layerB = Layer( "B", 1.7, "Green" )

    var layerTop = Layer( "top", 2.0, "Grey" )

    fun ring( d : double, dx : double, dy : double ) = ( Circle( d + 0.4 ) - Circle( d - 0.4 ) )
            .translate ( dx, dy ).mirrorX().also()

    @Piece
    fun quarter() : Shape3d {
        val dx = pieceD + gap

        val triA = Triangle( dx, pieceD * 5, (pieceD+gap)/2)
          
        val triB = triA.translateX(dx)

        val triangles = ( triA.extrude( layerA ) + triB.extrude( layerB ) )
            .tileX( 3 )

        val boardRect = Square( triangles.size.x, triangles.size.y )
            .offset( margin )
        val board = boardRect.roundAllCorners(2).extrude( layerTop ) -
            triA.recess( layerA ).repeatX(3, dx * 2) -
            triB.recess( layerB ).repeatX(3, dx * 2)
        val pattern = (
                (
                    ring( dx * 0.7, 0, dx*0.0 ) +
                    ring( dx * 0.7, dx * 0.9, dx * 0.0 ) + 
                    ring( dx * 0.7, dx*0.5, dx*0.8 ) +
                    ring( dx * 0.7, 0, dx*1.7 ) +
                    ring( dx * 0.6, dx*0.5, dx * 2.2 ) +
                    ring( dx * 0.7, 0, dx * 2.7 ) +
                    ring( dx * 0.7, dx*0.65, dx * 3.4 )
                ) / Square( dx, triA.size.y ).centerX()
            )
            .translateX(dx/2)
            .repeatX( 6, dx )

        val pattern3d = (pattern / boardRect).extrude( layerTop )
            
        return board + pattern3d
    }

    override fun build() : Shape3d {
        return quarter()
    }
}