zoukankan      html  css  js  c++  java
  • PIXI 根据点走地图(8)

    先了解下数学公式例如:

    图已知:a、b两点的坐标, c到a的距离d 。求c点的坐标。
     
    求 cy 可以根据d / a到b距离 = a到c垂直距离 / a 到 b的垂直距离。
     
    首先求a到b的距离
    r = sqrt((x1- x2)*(x1 - x2) +(y1 - y2)*(y1 - y2));
     
    cy = (d*(y2-y1))/r + y1;
     
    同理可得

    cx = (d*(x2-x1))/r + x1;

    思路也是根据这个公式来进行的借用下。

    下图,运动坐标点,红色是运动物体,虚点是路径

     1、定义坐标点:A、B、C、D  ...取到每个坐标点的值

     var pointArr = [
        {x: 342, y: 702},
        {x: 171, y: 532},
        {x: 335, y: 415},
        {x: 172, y: 285}
      ];

    2、 指定变量,例如:AB两点假定距离为200(每段距离固定), 行走的步数为 500

     // 假设两点之间距离步数
      var targetStep = 200;
    
      // 行走步数
      var walkingStep = 500;

    3、计算500属于地图上那个一段

      /**
       *
       * @param stepNum 已走步数
       * @param val   区间值固定值 200
       */
      function sectionVal(stepNum, val){
        return stepNum%val==0?stepNum/val:Math.ceil(stepNum/val)
      }

    4、返回两点距离

      /**
       *
       * @param pointA 起始点
       * @param pointB 第二个点
       * @returns {number}  两点距离
       */
      function pointDist(pointA, pointB){
    //   return  Math.sqrt((x1- x2)*(x1 - x2) +(y1 - y2)*(y1 - y2));
       return  Math.sqrt((pointA.x- pointB.x)*(pointA.x - pointB.x) +(pointA.y - pointB.y)*(pointA.y - pointB.y));
      }

    5、两点之间,d点的距离

      function posPoint(walkCount, r){
        var nextPos = walkCount / (targetStep / r);
        return nextPos
      }

    例如:

    a点到b点假定为:200步;

    a点到b点实际为100长

    走100步, ab实际位置应该:100/(200/100)

      function posPoint(walkCount, r){
        var nextPos = walkCount / (targetStep / r);
        return nextPos
      }

     6、根据ab点上行走实际步数d, 

      function nextDis(pointA, pointB, d, r){
        cx = (d*(pointB.x-pointA.x))/r + pointA.x;
        cy = (d*(pointB.y-pointA.y))/r + pointA.y;
        return {
          x: cx,
          y: cy
        }
      }
      // TODO 开始行走步数 300
    
      // =========属于那个区间?=========
      var sectionVal = sectionVal(walkingStep, targetStep);
      console.log(sectionVal); // 2
      var idx = 1;
    
      // 开始执行动画
      startSpeed(targetStep);
    
      function startSpeed(step){
        var r = pointDist(pointArr[idx-1], pointArr[idx]);
    //    var d = posPoint(200, r); // 行走步数、 r两点距离  返回:直线的距离
    
        if(idx != sectionVal){
          var d = posPoint(step, r); // 行走步数、 r两点距离  返回:直线的距离
          var movePoint = nextDis(pointArr[idx-1], pointArr[idx], d, r); //d 距离; r两点之间距离
          $('.sportPoint').animate({
            left: movePoint.x,
            top: movePoint.y
          },2000, 'linear',function(){
            idx++;
            startSpeed(targetStep);
          });
        }else{
          var residualValue = walkingStep%targetStep == 0? targetStep : walkingStep%targetStep;
    
          var d1 = posPoint(residualValue, r);
          var movePoint1 = nextDis(pointArr[idx-1], pointArr[idx], d1, r); //d 距离; r两点之间距离
          $('.sportPoint').animate({
            left: movePoint1.x,
            top: movePoint1.y
          },2000, 'linear',function(){
    //        alert('end')
          });
        }
      }

    ------------------------------------------------

    初始步数,从指定步数移动点

    首先,根据初始步数,知道该步数在那一个路线上(1区间)。例如100步数

    ab 两点距离为100, 200ab两点的目标步数

    var step = 100/(200/100 ); // 50是 100步,在ab两点行走的距离d;

    知道,ab两点距离及d 能求出d点的坐标。就是该点。

    从d点坐标执行下个点移动,也就是当前点,

    举例

    100在第一区间,值为 1 ,在数组中表示为 [ 0 ]  , [ 1 ],   找到区间中间坐标点。开始向下个点移动 [ 1 ] ,也就是值 1;

    先这样理解这。

    在PIXI表现也是一样的。创建舞台添加进舞台上,让坐标点移动。

    实现上 。。。。。想到那就写到那。。。不是很好。但实现上可以运行参考。

    <!DOCTYPE html>
    <html>
    <head lang="en">
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
      <title>地图坐标</title>
      <script src="jquery-2.1.4.min.js"></script>
    
      <style>
        *{
          margin: 0;
          padding: 0;
        }
        .bg{
          background: url(map.jpg) no-repeat;
           500px;
          height: 800px;
          position: relative;
          font-size: 30px;
        }
        .pointA{
          position: absolute;
          top: 702px;
          left:342px;
          border: 1px solid blue;
          display: inline-block;
        }
    
        .pointB{
          position: absolute;
          top: 532px;
          left:171px;
          border: 1px solid blue;
          display: inline-block;
        }
    
    
        .pointC{
          position: absolute;
          top: 419px;
          left:335px;
          border: 1px solid blue;
          display: inline-block;
        }
        .pointD{
          position: absolute;
          top: 288px;
          left:176px;
          border: 1px solid blue;
          display: inline-block;
        }
        .sportPoint{
           5px;
          height: 5px;
          border: 2px solid red;
          background: red;
          position: absolute;
          border-radius: 50%;
          display: inline-block;
          top: 702px;
          left:342px;
        }
      </style>
    </head>
    <body>
      <div class="bg">
         <span class="pointA"><b>A</b></span>
         <span class="pointB"><b>B</b></span>
         <span class="pointC"><b>C</b></span>
         <span class="pointD"><b>D</b></span>
        <span class="sportPoint"></span>
      </div>
    
    <script>
      var pointArr = [
        {x: 342, y: 702},
        {x: 171, y: 532},
        {x: 335, y: 415},
        {x: 172, y: 285}
      ];
    
      // 共600步 ,每一段 200
    
      // 假设两点之间距离步数
      var targetStep = 200;
    
      // 行走步数
      var walkingStep = 500;
    
    
      //0. 计算步数属于那个区间
      /**
       *
       * @param stepNum 已走步数
       * @param val   区间值固定值 200
       */
      function sectionVal(stepNum, val){
        return stepNum%val==0?stepNum/val:Math.ceil(stepNum/val)
      }
    
    
      /**
       *
       * @param pointA 起始点
       * @param pointB 第二个点
       * @returns {number}  两点距离
       */
      function pointDist(pointA, pointB){
    //   return  Math.sqrt((x1- x2)*(x1 - x2) +(y1 - y2)*(y1 - y2));
       return  Math.sqrt((pointA.x- pointB.x)*(pointA.x - pointB.x) +(pointA.y - pointB.y)*(pointA.y - pointB.y));
      }
    
      // 2、知道"距离"求下个点坐标
      function posPoint(walkCount, r){
        var nextPos = walkCount / (targetStep / r);
        return nextPos
      }
    
    
      //  3、根据距离,知坐标点
      function nextDis(pointA, pointB, d, r){
        cx = (d*(pointB.x-pointA.x))/r + pointA.x;
        cy = (d*(pointB.y-pointA.y))/r + pointA.y;
        return {
          x: cx,
          y: cy
        }
      }
    
      // TODO 开始行走步数 300
    
      // =========属于那个区间?=========
      var sectionVal = sectionVal(walkingStep, targetStep);
      console.log(sectionVal); // 2
      var idx = 1;
    
      // 开始执行动画
      startSpeed(targetStep);
    
      function startSpeed(step){
        var r = pointDist(pointArr[idx-1], pointArr[idx]);
    //    var d = posPoint(200, r); // 行走步数、 r两点距离  返回:直线的距离
    
        if(idx != sectionVal){
          var d = posPoint(step, r); // 行走步数、 r两点距离  返回:直线的距离
          var movePoint = nextDis(pointArr[idx-1], pointArr[idx], d, r); //d 距离; r两点之间距离
          $('.sportPoint').animate({
            left: movePoint.x,
            top: movePoint.y
          },2000, 'linear',function(){
            idx++;
            startSpeed(targetStep);
          });
        }else{
          var residualValue = walkingStep%targetStep == 0? targetStep : walkingStep%targetStep;
    
          var d1 = posPoint(residualValue, r);
          var movePoint1 = nextDis(pointArr[idx-1], pointArr[idx], d1, r); //d 距离; r两点之间距离
          $('.sportPoint').animate({
            left: movePoint1.x,
            top: movePoint1.y
          },2000, 'linear',function(){
    //        alert('end')
          });
        }
      }
    
      // 从指定点开始移动,假设B点
    
    </script>
    </body>
    </html>
    

      

  • 相关阅读:
    jQuery 与 prototype 共存
    我写的javascript常用静态方法类,分享给大家
    css控制固定表头,兼容行列合并
    JQuery之拖拽插件
    css小贴士备忘录
    助你简化开发的 jQuery 插件
    jQuery学习之:Validation表单验证插件
    CSS3圆角,阴影,透明
    fastclick 源码注解及一些基础知识点
    按钮点击效果(水波纹)
  • 原文地址:https://www.cnblogs.com/congxueda/p/9506809.html
Copyright © 2011-2022 走看看