Exit Full View
Up

/Games/ChessSaw.foocad

ChessSaw
FooCAD Source Code
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
/**
A Chess board made from jigsaw style pieces.

    For a full set, print "edges" in both colours,
        "corner1", "corner4" in one colour, and "corner2" and "corner3" in the other,
        finally, two lots of "middles" in each colour.
        
*/
class ChessSaw : Model {
    
    // Size of a square
    val size = 30.0

    val thickness = 3.0

    var slack = 0.1
    
    @Custom
    var piece : String = ""

    fun nobble() : Shape2d {   
        val xa = size* 0.11
        val xb = size* 0.2
        val yb = size* 0.2
        val yc = size* 0.35
        val delta = size * 0.1

        return PolygonBuilder().apply {
            moveTo( xa, -slack )
            bezierTo( Vector2(xa-delta, delta), Vector2(xb, yb-delta), Vector2(xb, yb) )
            bezierTo( Vector2(xb, yb+delta), Vector2(delta, yc), Vector2(0, yc) )
            bezierTo( Vector2(-delta,yc), Vector2(-xb,yb+delta), Vector2(-xb, yb) )
            bezierTo( Vector2(-xb,yb-delta), Vector2(-xa+delta, delta), Vector2(-xa, -slack) ) 
            
        }.build().scale(0.7).translate(size*0.07, size*0.5).color("Green")
    }

    fun square() : Shape2d {
        return Square( size-slack ).center()
    }


    fun make3d( shape : Shape2d ) : Shape3d {
        return shape.extrude( thickness )
    }

    override fun build() : Shape3d {

        val square : Shape2d = square()
        val nobble : Shape2d = nobble()
        val nibble = nobble.offset(slack).translateY(-size)

        val corner1 = make3d(square +
            nobble +
            nobble.mirrorX().rotate(-90)
        )

        val edge1 = make3d(square +
            nobble +
            nobble.mirrorX().rotate(-90) -
            nibble
        )
        
        val corner2 = make3d(square +
            nobble.mirrorX().rotate(-90) -
            nibble
        )

        val edge2 = make3d(square +
            nobble +
            nobble.mirrorX().rotate(-90) -
            nibble.mirrorX().rotate(-90)
        )
        
        val corner3 = make3d(square +
            nobble -
            nibble.mirrorX().rotate(-90)
        )

        val edge3 = make3d( square +
            nobble -
            nibble.mirrorX().rotate(-90) -
            nibble
        )

        val corner4 = make3d(
            square -
            nibble.mirrorX().rotate(-90) -
            nibble.rotate(0)
        )

        val edge4 = make3d( square +
            nobble.mirrorX().rotate(-90) -            
            nibble -
            nibble.mirrorX().rotate(-90)
        )
    
        val middle = make3d( square +    
            nobble +
            nobble.mirrorX().rotate(-90) -
            nibble -
            nibble.mirrorX().rotate(-90)
        )

        return if (piece == "middle" ) {
            middle
        } else if (piece == "corner1" ) {
            corner1
        } else if (piece == "corner2" ) {
            corner2
        } else if (piece == "corner3" ) {
            corner3
        } else if (piece == "corner4" ) {
            corner4
        } else if (piece == "edge1" ) {
            edge1
        } else if (piece == "edge2" ) {
            edge2
        } else if (piece == "edge3" ) {
            edge3
        } else if (piece == "edge4" ) {
            edge4

        } else if (piece == "edges" ) {
            edge1.tileX(3,3) +
            edge2.tileX(3,3).translateY(size*1.5) +
            edge3.tileX(3,3).translateY(size*3) +
            edge4.tileX(3,3).translateY(size*4.5)

        } else if (piece == "middles" ) {
            middle.tileX(3,3).tileY(3,3)

        } else {
            corner1.color("Yellow") +
            (
                edge1.color("Blue") +
                edge1.color("Yellow").translateY(size)
            ).repeatY( 3, size*2 ).translateY(size) +
            corner2.color("Blue").translateY(size*7) +
            (
                edge2.color("Blue") +
                edge2.color("Yellow").translateX(size)
            ).repeatX( 3, size * 2 ).translateX(size) +
            corner3.color("Blue").translateX(size*7) +
            (
                edge3.color("Yellow") +
                edge3.color("Blue").translateY(size)
            ).repeatY(3, size * 2 ).translate(size*7, size, 0 ) +
            corner4.color("Yellow").translate(size*7,size*7,0) +
            (
                edge4.color("Yellow") +
                edge4.color("Blue").translateX(size)
            ).repeatX(3, size * 2).translate(size, size*7,0) +
            (
                middle.color("Yellow") +
                middle.color("Blue").translateX(size) +
                middle.color("Blue").translateY(size) +
                middle.color("Yellow").translate(size,size,0)
            ).repeatX(3,size*2).repeatY(3,size*2).translate(size, size, 0 )
        }
    }
}