html5-canvas move object on line(html5-canvas 在线移动对象)
问题描述
我想在斜线上移动一个对象.我已经给出了我的代码.在我的第三个 div 的代码中,当我移动滑块时,我在这条线上画了一条斜线,我想移动一个对象.我在我的第一个 div 中做类似的事情.我在曲线上移动物体的地方.我正在寻找一些函数,我将在其中提供点并且对象将跟随这些点.这是我的代码.此代码仅适用于 chrome,因为我试图将其仅用于 safari 和 chrome 浏览器.
I want to move a object on a slanting line. I have given my code. In my code in my 3rd div as I move the slider I am drawing a slanting line on this line I want to move an object. Similar thing I am doing in my 1st div. Where I am moving an object on curve. I am looking for some function in which I will provide the points and the object will follow the points. Here is my code. This code works only in chrome as I am trying to make this only for safari and chrome browsers.
        <!DOCTYPE HTML>
            <html>
            <head>
   <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 bezier curve the curve is getting drawn as slider moves and also a ball in moving on that . 
            </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
            </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">
        function counterSlider(sID) {
            var slideVal = document.getElementById(sID).value;
            /*if (maxValue ==100){
             slideVal=slideVal/100;
             }*/
            slideVal = slideVal / 100;
            var position = slideVal;
            var startPt = {
                x : 18.8,
                y : 45
            };
            var controlPt = {
                x : 28,
                y : 160
            };
            var endPt = {
                x : 228,
                y : 165
            };
            var startPt2 = {
                x : 20,
                y : 75
            };
            var controlPt2 = {
                x : 28,
                y : 160
            };
            var endPt2 = {
                x : 228,
                y : 165
            };
            if (slideVal == 0) {
                erase('myCanvas2');
                erase('myCanvas3');
                erase('myCanvas4');
                //newSprite('myCanvas1b', 18.8, 45);
                drawBezier2('myCanvas1', new Array({
                    x : 18.8,
                    y : 45
                }, {
                    x : 28,
                    y : 160
                }, {
                    x : 228,
                    y : 165
                }), slideVal);
                drawBezier2('myCanvas2', new Array({
                    x : 20,
                    y : 75
                }, {
                    x : 28,
                    y : 160
                }, {
                    x : 228,
                    y : 165
                }), slideVal);
            } else if (slideVal > 0 && slideVal <= 34) {
                erase('myCanvas1');
                //erase('myCanvas1b');
                erase('myCanvas2');
                erase('myCanvas3');
                erase('myCanvas4');
                drawBezier2('myCanvas1', new Array({
                    x : 18.8,
                    y : 45
                }, {
                    x : 28,
                    y : 160
                }, {
                    x : 228,
                    y : 165
                }), slideVal);
                drawBezier2('myCanvas2', new Array({
                    x : 20,
                    y : 75
                }, {
                    x : 28,
                    y : 160
                }, {
                    x : 228,
                    y : 165
                }), slideVal);
                drawNextPoint('myCanvas1', startPt, controlPt, endPt, position);
                drawNextPoint('myCanvas2', startPt2, controlPt2, endPt2, position);
            } else if (slideVal > 34 && slideVal <= 67) {
                erase('myCanvas1');
                erase('myCanvas2');
                erase('myCanvas3');
                erase('myCanvas4');
                drawBezier2('myCanvas1', new Array({
                    x : 18.8,
                    y : 45
                }, {
                    x : 28,
                    y : 160
                }, {
                    x : 228,
                    y : 165
                }), slideVal);
                drawBezier2('myCanvas2', new Array({
                    x : 20,
                    y : 75
                }, {
                    x : 28,
                    y : 160
                }, {
                    x : 228,
                    y : 165
                }), slideVal);
                drawNextPoint('myCanvas1', startPt, controlPt, endPt, position);
                drawNextPoint('myCanvas2', startPt2, controlPt2, endPt2, position);
            } else if (slideVal > 67 && slideVal <= 100) {
                erase('myCanvas1');
                erase('myCanvas2');
                erase('myCanvas3');
                erase('myCanvas4');
                drawBezier2('myCanvas1', new Array({
                    x : 18.8,
                    y : 45
                }, {
                    x : 28,
                    y : 160
                }, {
                    x : 228,
                    y : 165
                }), slideVal);
                drawBezier2('myCanvas2', new Array({
                    x : 20,
                    y : 75
                }, {
                    x : 28,
                    y : 160
                }, {
                    x : 228,
                    y : 165
                }), slideVal);
                drawNextPoint('myCanvas1', startPt, controlPt, endPt, position);
                drawNextPoint('myCanvas2', startPt2, controlPt2, endPt2, position);
            }
        }
        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 _getQBezierValue(t, p1, p2, p3) {
            var iT = 1 - t;
            return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;
        }
        function getQuadraticCurvePoint(startX, startY, cpX, cpY, endX, endY, position) {
            return {
                x : _getQBezierValue(position, startX, cpX, endX),
                y : _getQBezierValue(position, startY, cpY, endY)
            };
        }
        function drawNextPoint(canId, startPt, controlPt, endPt, position) {
            var pt = getQuadraticCurvePoint(startPt.x, startPt.y, controlPt.x, controlPt.y, endPt.x, endPt.y, position);
            position = (position + 0.006) % 1.0;
            var canvas = document.getElementById(canId);
            var ctx = canvas.getContext('2d');
            //ctx.globalCompositeOperation = 'source-atop';
            //ctx.globalCompositeOperation = "destination-over";
            ctx.beginPath();
            ctx.fillStyle = "#0077c1";
            ctx.arc(pt.x, pt.y, 6, 0, Math.PI * 2, true);
            ctx.closePath();
            ctx.fill();
        }
        function newSprite(canId, mvx, mvy) {
            var canvas = document.getElementById(canId);
            var ctx = canvas.getContext('2d');
            ctx.globalCompositeOperation = 'source-atop';
            //ctx.globalCompositeOperation = "destination-over";
            ctx.beginPath();
            ctx.fillStyle = "#0077c1";
            ctx.arc(mvx, mvy, 6, 0, Math.PI * 2, true);
            ctx.closePath();
            ctx.fill();
        }
        function drawBezier2(canId, points, slideVal) {
            var canvas = document.getElementById(canId);
            var context = canvas.getContext("2d");
            //context.globalCompositeOperation = 'source-atop';
            //context.strokeStyle = "rgb(113, 113, 213)";
            context.strokeStyle = "#000";
            context.lineWidth = 0.6;
            context.beginPath();
            // Label end points
            //context.fillStyle = "rgb(0, 0, 0)";
            // Draw spline segemnts
            context.moveTo(points[0].x, points[0].y);
            for (var t = 0; t <= slideVal; t += 0.1) {
                context.lineTo(Math.pow(1 - t, 2) * points[0].x + 2 * (1 - t) * t * points[1].x + Math.pow(t, 2) * points[2].x, Math.pow(1 - t, 2) * points[0].y + 2 * (1 - t) * t * points[1].y + Math.pow(t, 2) * points[2].y);
            }
            // Stroke path
            context.stroke();
        }
        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();
        }
        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();
        }
    </script>
        </form>
    </body>
    </html>
提前致谢.我的 jsfiddle 链接:http://jsfiddle.net/g7hWD/1/
Thanks in Advance. my jsfiddle link: http://jsfiddle.net/g7hWD/1/
推荐答案
需要在函数drawSlopeCurve1()和drawSlopeCurve2().最简单的方法是先修复函数 newSprite() 然后使用它(避免一遍又一遍地复制相同的代码块).
You need to add the drawing code at the very end of functions drawSlopeCurve1() and drawSlopeCurve2(). The simplest way is to fix function newSprite() first and then use it (to avoid copying identical code-blocks over and over).
在函数newSprite()中:
// Change that:
ctx.globalCompositeOperation = 'source-atop';
// To this:
ctx.globalCompositeOperation = "source-over";
(有关 globalCompositeOperation 的更多详细信息,请参阅 这里.)
(For more details on globalCompositeOperation see here.)
函数结束时drawSlopeCurve1/2():
// Append this:
newSprite(canId, x, y);
另请参阅此修改后的演示.
See, also, this modified demo.
这篇关于html5-canvas 在线移动对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:html5-canvas 在线移动对象
				
        
 
            
        基础教程推荐
- Node.js 有没有好的索引/搜索引擎? 2022-01-01
 - 为什么我在 Vue.js 中得到 ERR_CONNECTION_TIMED_OUT? 2022-01-01
 - 如何使用 CSS 显示和隐藏 div? 2022-01-01
 - 每次设置弹出窗口的焦点 2022-01-01
 - jQuery File Upload - 如何识别所有文件何时上传 2022-01-01
 - WatchKit 支持 html 吗?有没有像 UIWebview 这样的控制器? 2022-01-01
 - 如何使用sencha Touch2在单页中显示列表和其他标签 2022-01-01
 - 如何在特定日期之前获取消息? 2022-01-01
 - Javascript 在多个元素上单击事件侦听器并获取目标 2022-01-01
 - 什么是不使用 jQuery 的经验技术原因? 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
						
						
						
						
						
				
				
				
				