voronoiCanvas


SUBMITTED BY: okpalan86

DATE: July 5, 2023, 10:32 p.m.

UPDATED: July 16, 2023, 4:16 p.m.

FORMAT: Text only

SIZE: 2.9 kB

HITS: 658

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <style>
  5. canvas {
  6. border: 1px solid black;
  7. }
  8. </style>
  9. </head>
  10. <body>
  11. <canvas id="voronoiCanvas" width="600" height="400"></canvas>
  12. <script>
  13. // Get the canvas element
  14. var canvas = document.getElementById("voronoiCanvas");
  15. var ctx = canvas.getContext("2d");
  16. // Generate random points as seeds
  17. var numPoints = 50;
  18. var points = [];
  19. for (var i = 0; i < numPoints; i++) {
  20. points.push({
  21. x: Math.random() * canvas.width,
  22. y: Math.random() * canvas.height,
  23. });
  24. }
  25. // Calculate distance between two points
  26. function distance(p1, p2) {
  27. var dx = p1.x - p2.x;
  28. var dy = p1.y - p2.y;
  29. return Math.sqrt(dx * dx + dy * dy);
  30. }
  31. // Find the closest seed point to a given point
  32. function findClosestSeedPoint(point) {
  33. var minDistance = Number.MAX_VALUE;
  34. var closestPointIndex = -1;
  35. for (var i = 0; i < numPoints; i++) {
  36. var d = distance(point, points[i]);
  37. if (d < minDistance) {
  38. minDistance = d;
  39. closestPointIndex = i;
  40. }
  41. }
  42. return closestPointIndex;
  43. }
  44. // Assign colors based on proximity
  45. function assignColors() {
  46. var imageData = ctx.createImageData(canvas.width, canvas.height);
  47. var data = imageData.data;
  48. for (var y = 0; y < canvas.height; y++) {
  49. for (var x = 0; x < canvas.width; x++) {
  50. var closestPointIndex = findClosestSeedPoint({ x: x, y: y });
  51. // Set color based on the index of the closest point
  52. var colorIndex = closestPointIndex % 16;
  53. var baseColor = colorIndex * 16;
  54. var pixelIndex = (y * canvas.width + x) * 4;
  55. data[pixelIndex] = baseColor; // Red channel
  56. data[pixelIndex + 1] = baseColor; // Green channel
  57. data[pixelIndex + 2] = baseColor; // Blue channel
  58. data[pixelIndex + 3] = 255; // Alpha channel
  59. }
  60. }
  61. ctx.putImageData(imageData, 0, 0);
  62. }
  63. // Draw the Voronoi diagram
  64. function drawVoronoi() {
  65. ctx.clearRect(0, 0, canvas.width, canvas.height);
  66. assignColors();
  67. // Draw seed points
  68. ctx.fillStyle = "red";
  69. for (var i = 0; i < numPoints; i++) {
  70. ctx.beginPath();
  71. ctx.arc(points[i].x, points[i].y, 3, 0, 2 * Math.PI);
  72. ctx.fill();
  73. }
  74. }
  75. // Redraw the diagram when the window is resized
  76. window.addEventListener("resize", function () {
  77. canvas.width = window.innerWidth;
  78. canvas.height = window.innerHeight;
  79. drawVoronoi();
  80. });
  81. // Initial drawing
  82. drawVoronoi();
  83. </script>
  84. </body>
  85. </html>

comments powered by Disqus