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"]},
...