如何使用 HTML5 canvas 获得黄金螺旋中一点的切线

How to get a tangent of a point in a golden spiral with HTML5 canvas

我遇到了一些 html5 canvas 问题...

我耐心地画了一个金色螺旋,上面有 X 个点(均匀分布)。 这个点必须变成一点垂直线。 垂直于什么? 在我看来,这条线必须垂直于螺旋线那个点的切线。 所以,这就是问题: - 如何获得黄金螺旋中一点的切线? - 找到切线后,如何从我的点 xy 开始画一条垂直于它的线?

主要问题是,在 canvas 中(据我所知),一行必须有已知的开始和结束,而我只有 xystart

这是带有螺旋代码的 jfiddle。 https://jsfiddle.net/MasterFO/bho3v6hs/2/

function spiral_render(){
    var c = document.getElementById('c');
    var context = c.getContext("2d");
    var centerx = (context.canvas.width / 2)+5;
    var centery = (context.canvas.height / 2)+100;
    context.clearRect(0, 0, 582, 620);
    context.moveTo(centerx, centery);
    context.beginPath();

    var dots_coordinates = [];

    a = parseFloat(0.41);
    b = parseFloat(0.23);
    var dots = 20;  //How many dots
    rounds = parseFloat(180);
    strength = parseFloat(30);

    sample = strength * 360;
    start = -rounds*(3.14);
    end = rounds*(3.14);
    step = (end - start) / sample;

    var distance = parseInt((sample/dots)/2.6);    //Distance between dots

    k = 0;
    //Draw the golden spiral
    for (var i = 1; i <= sample; i++) {
        r = start+i*step;
        t = (1/b)*Math.log(r/a);    //Phi angle of spiral

        x = centerx + r* Math.cos(t);
        y = centery + r* Math.sin(t);

        if (i % distance == 0 && k <=dots && i > 5600) {
            if(x && y){
                dots_coordinates.push([x,y]);
                k++;
            }
        }
        context.lineTo(x, y);
    }
    context.lineWidth = 0.5;
    context.strokeStyle = "#000";
    context.stroke();

    //Draw the dots in sequential mode
    context.moveTo(centerx, centery);
    var i = 0;
    inter = setInterval(function() {

        xp = Math.floor( dots_coordinates[i][0] );
        yp = Math.floor( dots_coordinates[i][1] );

        context.beginPath();
        context.lineTo(xp, yp);
        context.arc(xp, yp, 4, 0, 2 * Math.PI , false);
        context.fillStyle = '#C4071A';
        context.fill();

        i++;

        if (i == (dots_coordinates.length)) {
            clearInterval(inter);
        }

    }, 50);
}

有人知道吗?

这是在您选择的点处绘制垂直线的代码。不幸的是,此代码不适用于第一个和最后一个点。感谢 Spencer Wieczorek 在上面的评论中建议使用此方法。

为了克服只有一个起点的问题,使用 Math.sin() 和 Math.cos() 乘以您希望线条的长度。

var dotIndex = 11;
var lineLength = 50;
var myX = dots_coordinates[dotIndex-1][0]-dots_coordinates[dotIndex+1][0];
var myY = dots_coordinates[dotIndex-1][1]-dots_coordinates[dotIndex+1][1];
var theta = Math.atan2(-myY, myX);
context.beginPath();
context.moveTo(dots_coordinates[dotIndex][0],dots_coordinates[dotIndex][1]);
context.lineTo(dots_coordinates[dotIndex][0]+Math.sin(theta)*lineLength,dots_coordinates[dotIndex][1]+Math.cos(theta)*lineLength);
context.closePath();
context.stroke();