2017-06-20 42 views
1

我正在用坐标工作的JS写一个简单的绘图应用程序。我需要递归地找到两个点的中点,以绘制一条线(A点和B点之间的中点,然后是三个结果点之间的两个中点,依此类推)。有关更清晰的示例,请参见this GIFJS:递归地计算线的中点

这是一个基于网格/坐标的绘图应用程序,所以只需绘制一条线是不可能的。有必要获得点之间的所有坐标。

我有一个发现中点

function findMidpoint(p1,p2){ 
    return Math.floor((p1+p2)/2); 
} 

且绘制点(我还保存以前的点作为prevX和prevY功能的功能

setPoint(X,Y); 

所以我什么如下绘制中点:

setPoint(findMidpoint(X,prevX),findMidpoint(Y,prevY)); 

下一组中点:

setPoint(findMidpoint(findMidpoint(X,prevX),prevX),findMidpoint(findMidpoint(Y,prevY),prevY)); 
setPoint(findMidpoint(X,findMidpoint(X,prevX)),findMidpoint(Y,findMidpoint(Y,prevY)); 

正如您所见,这会非常迅速地变得混乱。我想有一个递归的方式来做到这一点,或者某种方式循环它给定的时间,但我似乎无法弄清楚。任何帮助将不胜感激!

+1

你得到的是一条线。你为什么需要点?您需要指定中点操作应停止的结束条件。 –

+0

这是一个基于网格/坐标的绘图应用程序,因此不可能简单地绘制线条。有必要获得点之间的所有坐标。我遇到麻烦的是创建中点操作,因此不必手动完成。 – dhdz

回答

0

只有当中点不同于左侧或右侧点时,才可以计算中点并调用recusion。

function midpoint(a, b) { 
 
    return Math.floor((a + b)/2); 
 
} 
 

 
function drawPoints(p0, p1) { 
 
    var middle = [midpoint(p0[0], p1[0]), midpoint(p0[1], p1[1])]; 
 
    ctx.beginPath(); 
 
    ctx.fillRect(middle[0], middle[1], 1, 1); 
 
    ctx.closePath(); 
 
    if ((p0[0] !== middle[0] || p0[1] !== middle[1]) && (p1[0] !== middle[0] || p1[1] !== middle[1])) { 
 
     drawPoints(p0, middle); 
 
     drawPoints(middle, p1); 
 
    } 
 
} 
 

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

 
drawPoints([0,0], [600, 20]);
<canvas id="canvas" style="border-width: 0; display: block; padding: 0; margin: 0;" width="600" height="200"></canvas>

+0

这工作很好。非常感谢! – dhdz

1
  var points = []; 
      function findMid(x,y){ 
       var mid = parseInt((x+y)/2); 
       if(x!=mid && y!=mid){ 
        points.push(mid); 
        console.log("x:"+x+" y:"+y+" mid:"+mid); 
        findMid(x,mid); 
        findMid(y,mid); 
       }  
      } 
      initialPointX = 4; 
      initialPointY = 10; 
      console.log(findMid(initialPointX,initialPointY)); 
+0

这为我工作。谢谢 – imox

0

你的每个递归递归函数应该

  1. 创建A和B之间的中点,例如c
  2. 上(A,C)和(B,C)呼叫本身
  3. 如果停止A == B或A非常接近于乙

在代码中,这将是这样的:

function placeMidPoint(Ax, Ay, Bx, By) { 
    var e = 0; // some small number, if e==0 then you're stopping when A==B 
    if((Ax - Bx) < e && (Ay - By) < e) 
    return; 
    var Cx = findMidpoint(Ax, Bx); 
    var Cy = findMidpoint(Ay, By); 
    setPoint(Cx, Cy); 

    placeMidPoint(Ax, Ay, Cx, Cy); 
    placeMidPoint(Cx, Cy, Bx, By); 
}