Javascript html5画布在滑块移动时绘制曲线

Javascript html5画布在滑块移动时绘制曲线,javascript,html5-canvas,Javascript,Html5 Canvas,嗨,我想在移动滑块时绘制一条曲线。我有两种曲线。贝塞尔曲线和二次曲线。同样,当我绘制曲线时,我想在同一路径上移动一个对象。我希望它是动态的,所以如果我应该能够改变曲线点。 所以我需要一个函数,我可以调用滑块的变化,因为我做的直线。 这是我的密码。此代码仅在chrome中有效 <!DOCTYPE HTML> <html> <head> <

嗨,我想在移动滑块时绘制一条曲线。我有两种曲线。贝塞尔曲线和二次曲线。同样,当我绘制曲线时,我想在同一路径上移动一个对象。我希望它是动态的,所以如果我应该能够改变曲线点。 所以我需要一个函数,我可以调用滑块的变化,因为我做的直线。 这是我的密码。此代码仅在chrome中有效

            <!DOCTYPE HTML>
            <html>
                <head>
                    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
                    <meta name="viewport" content="width=device-width, initial-scale=1">

                    <style type="text/css">
                        .wrapper {
                            margin: 0 auto;
                            width: 1000px;
                        }
                        .canHdr {
                            float: left;
                            width: 450px;
                            height: 400px;
                            border: 1px solid red;
                        }
                    </style>

                </head>
                <body>
                    <form>
                        <!-- wrapper -->
                        <div class="wrapper">

                            <!-- canHdr -->
                            <div id="canHdr" class="canHdr" >

                                <p>
                                    This is my 1st div with quadratic curve I want to draw this curve as I move the slider. I want to make it dynamic so when I should be able to change the curve points. Also I want to move an object on that curve as I am doing in my 3rd div.
                                </p>

                                <div class="canOuterHdr" >
                                    <canvas id="myCanvas1" width="300" height="195" style="position: relative;">
                                        [No canvas support]
                                    </canvas>

                                </div>

                                <div id="slider1" class="newBg">
                                    <input id="slide1" type="range" min="0" max="100" step="1" value="0" onchange="counterSlider('slide1');" />
                                </div>

                            </div>
                            <!--/ canHdr -->
                            <!-- canHdr2 -->
                            <div id="canHdr2" class="canHdr" >

                                <p>
                                    This is my 2nd div. I have bezier curve. I want to make it dynamic so when I should be able to change the curve points. Also I want to move an object on that curve as I am doing in my 3rd div.
                                </p>

                                <div class="canOuterHdr" >
                                    <canvas id="myCanvas2" width="300" height="195" style="position: relative;">
                                        [No canvas support]
                                    </canvas>

                                </div>

                                <div id="slider2" class="newBg">
                                    <input id="slide2" type="range" min="0" max="100" step="1" value="0" onchange="counterSlider('slide2');" />
                                </div>

                            </div>
                            <!-- canHdr2 -->
                            <!-- canHdr3 -->
                            <div id="canHdr3" class="canHdr" >
                                <p>
                                    This is my 3rd div with slanting line. I want to move a ball on this line when I move the slider. So as the line increases ball will also move on the line.
                                </p>

                                <div class="canOuterHdr" >
                                    <canvas id="myCanvas3" width="300" height="195" style="position: relative;">
                                        [No canvas support]
                                    </canvas>

                                </div>

                                <div id="slider3" class="newBg">
                                    <input id="slide3" type="range" min="0" max="100" step="1" value="0" onchange=" drawSlopeCurve2('slide3','100'); " />
                                </div>

                            </div>
                            <!--/ canHdr3 -->
                            <!-- canHdr4 -->
                            <div id="canHdr4" class="canHdr" >

                                <p>
                                    This is my 4th div with slanting line. I want to move a ball on this line when I move the slider. So as the line increases ball will also move on the line.
                                </p>

                                <div class="canOuterHdr" >
                                    <canvas id="myCanvas4" width="300" height="195" style="position: relative;">
                                        [No canvas support]
                                    </canvas>

                                </div>

                                <div id="slider4" class="newBg">
                                    <input id="slide4" type="range" min="0" max="100" step="1" value="0" onchange=" drawSlopeCurve1('slide4','100'); " />
                                </div>

                            </div>
                            <!--/ canHdr4 -->

                        </div>
                        <!-- /wrapper -->

                        <script type="text/javascript">
                            newSprite('myCanvas3', 16, 170);
                            quadraticCurve('myCanvas1', 18.8, 45, 28, 160, 228, 165);
                            bezierCurve('myCanvas2', 20, 75, 55.2, 150.0, 200,100, 228, 165)
                            function counterSlider(sID) {

                                var slideVal = document.getElementById(sID).value;
                                /*if (maxValue ==100){

                                 slideVal=slideVal/100;
                                 }*/
                                slideVal = slideVal / 100;

                                if (slideVal == 0) {

                                /*  erase('myCanvas2');
                                    erase('myCanvas3');
                                    erase('myCanvas4');*/
                                    //newSprite('myCanvas1b', 18.8, 45);
                                    newSprite('myCanvas3', 16, 170);

                                } else if (slideVal > 0 && slideVal <= 34) {

                                    /*erase('myCanvas1');
                                    //erase('myCanvas1b');
                                    erase('myCanvas2');
                                    erase('myCanvas3');
                                    erase('myCanvas4');*/

                                } else if (slideVal > 34 && slideVal <= 67) {

                                    /*erase('myCanvas1');

                                    erase('myCanvas2');
                                    erase('myCanvas3');
                                    erase('myCanvas4');*/

                                } else if (slideVal > 67 && slideVal <= 100) {

                                    /*erase('myCanvas1');

                                    erase('myCanvas2');
                                    erase('myCanvas3');
                                    erase('myCanvas4');*/

                                }
                            }

                            function erase(canvasId) {

                                var canvas = document.getElementById(canvasId);
                                var context = canvas.getContext("2d");
                                context.beginPath();
                                context.clearRect(0, 0, canvas.width, canvas.height);
                                canvas.width = canvas.width;

                            }

                            /**********for backgroundImage********************/

                            function quadraticCurve(canId, spx, spy, cpx, cpy, endx, endy) {

                                var canvas = document.getElementById(canId);
                                var ctx = canvas.getContext('2d');

                                ctx.beginPath();
                                ctx.moveTo(spx, spy);
                                ctx.quadraticCurveTo(cpx, cpy, endx, endy);
                                ctx.strokeStyle = "#eaca2d";
                                ctx.stroke();

                            }

                            function bezierCurve(canId, spx, spy, cpx1, cpy1, cpx2, cpy2, endx, endy) {

                                var canvas = document.getElementById(canId);
                                var ctx = canvas.getContext('2d');

                                ctx.beginPath();
                                ctx.moveTo(spx, spy);
                                ctx.quadraticCurveTo(cpx1, cpy1, cpx2, cpy2, endx, endy);
                                ctx.strokeStyle = "#eaca2d";
                                ctx.stroke();

                            }

                            function newSprite(canId, mvx, mvy) {
                                var canvas = document.getElementById(canId);
                                var ctx = canvas.getContext('2d');
                                ctx.globalCompositeOperation = 'source-over';
                                //ctx.globalCompositeOperation = "destination-over";
                                ctx.beginPath();
                                ctx.fillStyle = "#0077c1";
                                ctx.arc(mvx, mvy, 6, 0, Math.PI * 2, true);
                                ctx.closePath();
                                ctx.fill();
                            }

                            function drawSlopeCurve1(sID, maxValue) {
                                // erase('canvasTwo');

                                var canId = 'myCanvas4';
                                var slideVal = parseInt(document.getElementById(sID).value);
                                var canvas = document.getElementById(canId);
                                var context = canvas.getContext('2d');
                                canvas.width = canvas.width;
                                //line end points
                                x1 = 16;
                                y1 = 170;
                                x2 = 200;
                                y2 = 80;

                                //get slope (rise over run)
                                var m = (y2 - y1) / (x2 - x1);
                                //get y-intercept
                                var b = y1 - (m * x1);
                                //get distance between the two points
                                var distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
                                //get new x and y values
                                var x = x1 + parseInt(distance / maxValue * slideVal);
                                var y = parseInt(m * x + b);

                                context.beginPath();
                                context.moveTo(x1, y1);
                                context.lineTo(x, y);
                                context.lineWidth = 0.6;
                                context.stroke();

                                newSprite(canId, x, y);
                            }

                            function drawSlopeCurve2(sID, maxValue) {
                                // erase('canvasTwo');

                                var canId = 'myCanvas3';
                                var slideVal = parseInt(document.getElementById(sID).value);
                                var canvas = document.getElementById(canId);
                                var context = canvas.getContext('2d');
                                canvas.width = canvas.width;
                                //line end points
                                x1 = 16;
                                y1 = 170;
                                x2 = 160;
                                y2 = 72;

                                //get slope (rise over run)
                                var m = (y2 - y1) / (x2 - x1);
                                //get y-intercept
                                var b = y1 - (m * x1);
                                //get distance between the two points
                                var distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
                                //get new x and y values
                                var x = x1 + parseInt(distance / maxValue * slideVal);
                                var y = parseInt(m * x + b);

                                context.beginPath();
                                context.moveTo(x1, y1);
                                context.lineTo(x, y);
                                context.lineWidth = 0.6;
                                context.stroke();

                                newSprite(canId, x, y);
                            }

                        </script>
                    </form>
                </body>
            </html>

.包装纸{
保证金:0自动;
宽度:1000px;
}
canHdr先生{
浮动:左;
宽度:450px;
高度:400px;
边框:1px纯红;
}

这是我的第一个二次曲线div,我想在移动滑块时绘制这条曲线。我想让它动态,所以当我应该能够改变曲线点。我还想在曲线上移动一个对象,就像我在第三个div中所做的那样。

[无画布支持] 这是我的第二部。我有贝塞尔曲线。我想让它动态,所以当我应该能够改变曲线点。我还想在曲线上移动一个对象,就像我在第三个div中所做的那样。

[无画布支持] 这是我的第三个斜线div。当我移动滑块时,我想在这条线上移动一个球。所以随着线的增加,球也会在线上移动。

[无画布支持] 这是我的第四个斜线。当我移动滑块时,我想在这条线上移动一个球。所以随着线的增加,球也会在线上移动。

[无画布支持] newSprite('myCanvas3',16170); 二次曲线('myCanvas1',18.8,45,28,160,228,165); 贝塞尔曲线('myCanvas2',20,75,55.2150.012001228165) 功能计数器(sID){ var slideVal=document.getElementById(sID).value; /*如果(最大值==100){ slideVal=slideVal/100; }*/ slideVal=slideVal/100; 如果(slideVal==0){ /*擦除(“myCanvas2”); 擦除(“myCanvas3”); 擦除(“myCanvas4”)*/ //newSprite('myCanvas1b',18.8,45); newSprite('myCanvas3',16170);
}否则,如果(slideVal>0&&slideVal 34&&slideVal 67&&slideVal您应该从在函数中定义曲线开始,这样您就可以计算每个x位置的图形应该结束的位置。然后您还知道在哪里绘制结束点

我的演示函数具有在画布上绘制正弦的功能:

function calc(x){
    var y = 100 + ( 50*Math.sin(x*400));
    return y;
}
通过在点之间画一条线(而不是曲线!)可以得到图形

for (var x=0; x<=400 && (x <= slider.value); x+=3){        
    y= calc(x);
    ctx.lineTo(x, y);
}

用于(var x=0;x您尝试过什么?您已经有了绘制曲线的代码,所以只要在滑块更改时更改值,您就已经编写了滑块值更改的处理程序。非常感谢您的帮助。我已经获得了绘制曲线的代码。但是绘制曲线没有您的代码平滑。有人可以帮助使其平滑工作吗ly?我还想在同一条曲线上移动一个对象。最后一个问题是如何在bezier曲线中实现这一点。我正在工作的js fiddle链接:您的代码有多条路径(如果/否则有点集),但这并不会使它变得更简单!用
y这样的等式定义您的直线