Friday, September 5, 2025
HomeLanguagesJavascriptHow to Draw Smooth Curve Through Multiple Points using JavaScript ?

How to Draw Smooth Curve Through Multiple Points using JavaScript ?

In this article, we will Draw a Smooth Curve Through Multiple Points using JavaScript.

Approach: Drawing a smooth curve with multiple points is a challenging task. There are many algorithms that can help us to draw a curve using particular points. Bezier Curve is one of the curve drawing techniques. There is always lots of discussion around how to draw a smooth curve through multiple numbers of points using JavaScript. So, we are given to draw a smooth curve through the multiple numbers of points. For drawing a line we should have a slope of the line. So here we calculate the slope of a line by taking multiple inputs of x and y. For drawing a smooth curve we should have multiple numbers of inputs/points by which we can draw the smooth curve. Here we are trying to get a random number for which we are trying to draw a smooth curve. Here, we give you some ideas about drawing a smooth curve using multiple numbers of points. Please go through this code and we will explain it further. 

Example: This example shows the use of the above-explained approach.

html




<h1 style="color:green">
    neveropen
</h1>
  
<canvas id="GFG" width="600" height="400" 
        style="border: 2px solid black">
</canvas>
  
<script>
    var cv = document.getElementById("GFG");
    var ctx = cv.getContext("2d");
          
    function gradient(a, b) {
        return (b.y-a.y)/(b.x-a.x);
    }
          
    function bzCurve(points, f, t) {
        if (typeof(f) == 'undefined') f = 0.3;
        if (typeof(t) == 'undefined') t = 0.6;
      
        ctx.beginPath();
        ctx.moveTo(points[0].x, points[0].y);
      
        var m = 0;
        var dx1 = 0;
        var dy1 = 0;
          
        var preP = points[0];
          
        for (var i = 1; i < points.length; i++) {
            var curP = points[i];
            nexP = points[i + 1];
            if (nexP) {
                m = gradient(preP, nexP);
                dx2 = (nexP.x - curP.x) * -f;
                dy2 = dx2 * m * t;
            } else {
                dx2 = 0;
                dy2 = 0;
            }
              
            ctx.bezierCurveTo(
                preP.x - dx1, preP.y - dy1,
                curP.x + dx2, curP.y + dy2,
                curP.x, curP.y
            );
          
            dx1 = dx2;
            dy1 = dy2;
            preP = curP;
        }
        ctx.stroke();
    }
      
    // Generate random data
    var lines = [];    
    var X = 10;
    var t = 40; // control the width of X.
    for (var i = 0; i < 100; i++ ) {
        Y = Math.floor((Math.random() * 300) + 50);
        p = { x: X, y: Y };
        lines.push(p);
        X = X + t;
    }
      
    // Draw smooth line
    ctx.setLineDash([0]);
    ctx.lineWidth = 2;
    ctx.strokeStyle = "green";
    bzCurve(lines, 0.3, 1);
</script>


Output:

  

Explanation: When we run this program, Every time it takes random inputs and this is why it generates a new smooth curve on every execution.

  • Pre-requisite: HTML Canvas Basics
  • Reference for canvas object is stored in variable ‘cv’ using DOM concept.
  • Without having the drawing context of the canvas nothing can be drawn on it.
 var cv = document.getElementById("GFG");
        var ctx = cv.getContext("2d");
  • Gradient function that returns the slope of the line.
function gradient(a, b) {
            return (b.y-a.y)/(b.x-a.x);
        }
  • The beginPath method is used to start or reset the path.
  • The MoveTo method is used to move the path to the specified point in the canvas.
  ctx.beginPath();
        ctx.moveTo(points[0].x, points[0].y);
  • Stroke is used to draw the path you have defined with all those methods.
ctx.stroke();
RELATED ARTICLES

Most Popular

Dominic
32264 POSTS0 COMMENTS
Milvus
81 POSTS0 COMMENTS
Nango Kala
6634 POSTS0 COMMENTS
Nicole Veronica
11801 POSTS0 COMMENTS
Nokonwaba Nkukhwana
11863 POSTS0 COMMENTS
Shaida Kate Naidoo
6752 POSTS0 COMMENTS
Ted Musemwa
7025 POSTS0 COMMENTS
Thapelo Manthata
6701 POSTS0 COMMENTS
Umr Jansen
6718 POSTS0 COMMENTS