Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. <!doctype html>
  2. <html>
  3. <body>
  4. <canvas id="bezier" width="500px" height="500px" style="border: 1px solid black"></canvas>
  5. <script>
  6. let canvas = document.getElementById('bezier');
  7. let ctx = canvas.getContext('2d');
  8.  
  9. const SCALE = 100;
  10. let p0 = {
  11. x: 1,
  12. y: 1
  13. };
  14. let p1 = {
  15. x: 2,
  16. y: 3
  17. };
  18. let p2 = {
  19. x: 4,
  20. y: 3
  21. };
  22. let p3 = {
  23. x: 3,
  24. y: 1
  25. };
  26.  
  27. // draw control points
  28. drawPoint(p0);
  29. drawPoint(p1);
  30. drawPoint(p2);
  31. drawPoint(p3);
  32.  
  33. // draw points on bezier curve
  34. for (let i = 0; i <= 1; i += 0.005) {
  35. bezier(i, [p0, p1, p2, p3]);
  36. }
  37.  
  38. function bezier(u, points) {
  39. let sum = {
  40. x: 0,
  41. y: 0
  42. };
  43.  
  44. for (let i = 0; i < points.length; i++) {
  45. let b = bernstein(points.length - 1, i, u);
  46. sum.x += points[i].x * b;
  47. sum.y += points[i].y * b;
  48. }
  49.  
  50. drawPoint(sum, 1);
  51. }
  52.  
  53. function bernstein(n, i, t) {
  54. let binom = binomial(n, i);
  55. return binom * Math.pow(t, i) * Math.pow(1 - t, n - i);
  56. }
  57.  
  58. function binomial(n, k) {
  59. let coeff = 1;
  60.  
  61. for (let x = n - k + 1; x <= n; x++) {
  62. coeff *= x;
  63. }
  64.  
  65. for (let x = 1; x <= k; x++) {
  66. coeff /= x;
  67. }
  68.  
  69. return coeff;
  70. }
  71.  
  72. function drawPoint(p, size = 3) {
  73. const HEIGHT = 500;
  74. ctx.fillRect(p.x * SCALE, HEIGHT - (p.y * SCALE), size, size);
  75. }
  76. </script>
  77. </body>
  78. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement