JS:递归计算线的中点

时间:2017-06-20 07:02:43

标签: javascript coordinates draw

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

这是一个基于网格/坐标的绘图应用程序,因此无法简单地绘制线条。有必要获得各点之间的所有坐标。

我有一个找到中点的函数

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));

正如你所看到的,这很快就会变得混乱。我想有一种递归方式可以做到这一点,或者某种方式将它循环一段时间,但我似乎无法弄明白。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

只有当中点不同于左点或右点之一时,你才可以计算中点并调用回归。



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>
&#13;
&#13;
&#13;

答案 1 :(得分: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));

答案 2 :(得分:0)

每次递归的递归函数应该

  1. 创建A和B之间的中点,比如说C
  2. 自行调用(A,C)和(B,C)
  3. 如果A == B或A非常接近B
  4. ,则停止

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

    name