Escher's Cube
by hawede
HTML
<script src="https://cindyjs.org/dist/v0.8.5/Cindy.js"></script>
<script src="https://cindyjs.org/dist/v0.8.5/Cindy3D.js"></script>
<!DOCTYPE html>
<html>
<head>
<title>Escher's impossible cube</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cindyjs.org/dist/latest/CindyJS.css">
<script type="text/javascript" src="https://cindyjs.org/dist/v0.7/Cindy.js"></script>
<script type="text/javascript" src="https://cindyjs.org/dist/v0.8.5/Cindy3D.js"></script>
<script id="csinit" type="text/x-cindyscript">
use("Cindy3D");
initCam = true;
</script>
<script id="csdraw" type="text/x-cindyscript">
D6.caption = floor(D6.x);
Cam = [-5, 5, -20];
interp(a, c, d) := (v = Cam - a; a + (d.x - c.x) / |v| * v);
PPP = interp([1, 1, 1], C1, D1);
PPM = interp([1, 1, -1], C2, D2);
PMM = interp([1, -1, -1], C3, D3);
PMP = interp([1, -1, 1], C4, D4);
MMP = interp([-1, -1, 1], C5, D5);
MMM = interp([-1, -1, -1], C6, D6);
MPM = interp([-1, 1, -1], C7, D7);
MPP = interp([-1, 1, 1], C8, D8);
vs = [PPP, PPM, PMM, PMP, MMP, MMM, MPM, MPP];
drawtext((D6.x-10,D6.y+5),"vs="+text(D1.x - C1.x));
begin3d(supersample->2);
if (initCam,
background3d([0,0,0]);
shininess3d(50);
lookat3d(Cam, [0, 0, 0], [-1, 100, 0]);
fieldofview3d(8°);
ambientlight3d(0.3*[1,1,1]);
directionallight3d(0, direction->[-2,-1,2],
diffuse->0.7*[1,1,1], specular->0.3*[1,1,1]);
initCam = false);
//forall(vs, draw3d(#, color->[1,0,0], size->5));
forall(cycle(vs) ++ [[PPP, PMP], [PPM, MPM], [PMM, MMM], [MMP, MPP]],
draw3d(#_1, #_2, color->[0,0.5,1], size->3));
draw3d([0,0,0], [0,0,5], color->[0,1,1], size->1);
end3d();
</script>
<script type="text/javascript">
CindyJS({
scripts:"cs*",
ports: [{
id: "CSCanvas",
width: 632,
height: 200,
transform:[{visibleRect:[-11,9,11,3]}],
}],
geometry: [
{name:"A1",type:"Free",pos:[-8,8],visible:false},
{name:"B1",type:"Free",pos:[0,8],visible:false},
{name:"s1",type:"Segment",args:["A1","B1"]},
...