darts2.html 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. </head>
  5. <body>
  6. <script>
  7. canvas = document.body.appendChild(document.createElement("canvas"))
  8. canvas.height = 800
  9. canvas.width = 800
  10. const ctx = document.querySelector("canvas").getContext("2d");
  11. vadd = ([x,y], [w,z]) => [x+w, y+z];
  12. vrethtoxy = ([r, th]) => [r*cos(th), r*sin(th)];
  13. vscale = (l, [x,y]) => [l*x, l*y];
  14. const phi = (Math.sqrt(5)-1)/2;
  15. const a36 = Math.PI/5;
  16. cos = Math.cos;
  17. sin = Math.sin;
  18. let objects=[];
  19. for (let i=0; i<5; i++) {
  20. objects.push({type:'K', size:0.5, summit:[0,0], angle:a36*2*i, side:1, deco:[0.0, 1.0, 1.0]});
  21. objects.push({type:'K', size:0.5, summit:[0,0], angle:a36*2*i, side:-1, deco:[0.0, 1.0, 1.0]});
  22. }
  23. subdivide = (objects) => {
  24. let result = [];
  25. objects.forEach( (item) => {
  26. const d0 = item.deco[0];
  27. const d1 = item.deco[1];
  28. const d2 = item.deco[2];
  29. const d01 = phi * d0 + (1-phi) * d1;
  30. const d10 = phi * d1 + (1-phi) * d0;
  31. const d02 = phi * d0 + (1-phi) * d2;
  32. const d20 = phi * d2 + (1-phi) * d0;
  33. if (item.type === 'K') {
  34. const outervertex = vadd(item.summit, vrethtoxy([item.size, item.angle + item.side * a36]));
  35. result.push({type:'D', size:item.size*phi, summit:item.summit, side:-item.side, angle:item.angle+a36*item.side, deco:[d0, d02, d10]});
  36. result.push({type:'K', size:item.size*phi, summit:outervertex, side:item.side, angle:item.angle-item.side*3*a36, deco:[d2,d10,d1]});
  37. result.push({type:'K', size:item.size*phi, summit:outervertex, side:-item.side, angle:item.angle-item.side*3*a36, deco:[d2,d10,d02]});
  38. }
  39. if (item.type === 'D') {
  40. const outervertex = vadd(item.summit, vrethtoxy([item.size, item.angle + item.side * a36]));
  41. result.push({type:'K', size:item.size*phi, summit:item.summit, side:item.side, angle:item.angle, deco:[d0,d1,d20]});
  42. result.push({type:'D', size:item.size*phi, summit:outervertex, side:item.side, angle:item.angle+item.side*6*a36, deco:[d2,d20,d1]});
  43. }
  44. });
  45. return result;
  46. }
  47. draw = (objects) => {
  48. w = Math.max(ctx.canvas.height, ctx.canvas.width);
  49. const tos = (p) => vscale(w, vadd([0.5,0.5], p));
  50. const alpha = 1.0;
  51. objects.forEach( (item) => {
  52. points = [tos(item.summit)];
  53. if (item.type === 'K') {
  54. ctx.fillStyle = `rgba(255, 165, ${255*item.deco[0]}, ${alpha})`;
  55. if (item.side < 0) {
  56. ctx.fillStyle = `rgba(205, 125, ${205*item.deco[0]}, ${alpha})`;
  57. }
  58. points.push(tos(vadd(item.summit, vrethtoxy([item.size, item.angle]))));
  59. points.push(tos(vadd(item.summit, vrethtoxy([item.size, item.angle + item.side * a36]))));
  60. }
  61. if (item.type === 'D') {
  62. ctx.fillStyle = `rgba(0, 255, 165, ${alpha})`;
  63. if (item.side < 0) {
  64. ctx.fillStyle = `rgba(0, 205, 125, ${alpha})`;
  65. }
  66. points.push(tos(vadd(item.summit, vrethtoxy([item.size * phi, item.angle]))));
  67. points.push(tos(vadd(item.summit, vrethtoxy([item.size, item.angle + item.side * a36]))));
  68. }
  69. ctx.beginPath();
  70. ctx.moveTo(points[0][0], points[0][1]);
  71. ctx.lineTo(points[1][0], points[1][1]);
  72. ctx.lineTo(points[2][0], points[2][1]);
  73. ctx.lineTo(points[0][0], points[0][1]);
  74. ctx.fill();
  75. ctx.stroke();
  76. });
  77. }
  78. const smax = 5;
  79. for (let i=0; i<smax; i++) {
  80. objects = subdivide(objects);
  81. }
  82. draw(objects);
  83. </script>
  84. </body>
  85. </html>