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() } }