Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将坐标外推到画布对象的边_Javascript_Math_Canvas_Graph - Fatal编程技术网

Javascript 将坐标外推到画布对象的边

Javascript 将坐标外推到画布对象的边,javascript,math,canvas,graph,Javascript,Math,Canvas,Graph,我正在编写一个浏览器应用程序,试图发现图像中的兴趣点 一旦我计算了这些点,我就在它们之间画一条线 我的应用程序需要将这些线外推到画布的边缘 有人有javascript中线性图计算的经验吗 我搞了一场示威 (function(){ function drawLine(points){ context.beginPath(); points.forEach(function(point){ context.lineTo(point.x

我正在编写一个浏览器应用程序,试图发现图像中的兴趣点

一旦我计算了这些点,我就在它们之间画一条线

我的应用程序需要将这些线外推到画布的边缘

有人有javascript中线性图计算的经验吗

我搞了一场示威

(function(){

    function drawLine(points){
        context.beginPath();
        points.forEach(function(point){
            context.lineTo(point.x, point.y);   
        });
        context.stroke();
    }

    var canvas = document.createElement('canvas');
    canvas.setAttribute('width', 500);
    canvas.setAttribute('height', 300);
    document.body.appendChild(canvas);
    context = canvas.getContext("2d");

    // top
    drawLine([{x: 100, y: 40}, {x: 400, y: 10}]);
    // bottom
    drawLine([{x: 50, y: 220}, {x: 300, y: 290}]);
    // left
    drawLine([{x: 40, y: 20}, {x: 80, y: 260}]);
    // right
    drawLine([{x: 490, y: 60}, {x: 440, y: 290}]);

})();


非常感谢。

可以将
p=(p.x,p.y)
q=(q.x,q.y)
之间的线段扩展到
y-p.y=a*(x-p.x)
,其中
a
是斜率
(p.y-q.y)/(p.x-q.x)
。(如果
p.x=q.x
,这是无效的,但这是一种特殊情况,我们可以单独处理。)

通过求解
y
x
,我们得到了等价的公式:
y=a*(x-p.x)+p.y
x=(y-p.y)/a+p.x
。将画布边插入这些等式中,可以得到延长线与画布相交的点

通过适当的案例分析,我们可以确定延长线与四条画布边中的哪两条相交。以下是扩展到画布中的
p
q
之间的线段的一般情况的实现
[x0,x1]
×
[y0,y1]

function extend(p, q, x0, x1, y0, y1) {
    var dx = q.x - p.x;
    var dy = q.y - p.y;
    if (dx === 0) return [{x: p.x, y: y0}, {x: p.x, y: y1}];
    var slope = dy / dx;

    var y_at_x0 = slope * (x0 - p.x) + p.y;
    var y_at_x1 = slope * (x1 - p.x) + p.y;
    var x_at_y0 = (y0 - p.y) / slope + p.x;
    var x_at_y1 = (y1 - p.y) / slope + p.x;

    var r, s;
    if (y_at_x0 < y0) r = {x: x_at_y0, y: y0};
    else if (y_at_x0 <= y1) r = {x: x0, y: y_at_x0};
    else r = {x: x_at_y1, y: y1};

    if (y_at_x1 < y0) s = {x: x_at_y0, y: y0};
    else if (y_at_x1 <= y1) s = {x: x1, y: y_at_x1};
    else s = {x: x_at_y1, y: y1};

    return [r, s];
}
函数扩展(p,q,x0,x1,y0,y1){ var dx=q.x-p.x; var dy=q.y-p.y; 如果(dx==0)返回[{x:p.x,y:y0},{x:p.x,y:y1}]; var斜率=dy/dx; 在x0=斜率*(x0-p.x)+p.y时的var y; 在_x1处的var y_=斜率*(x1-p.x)+p.y; var x_at_y0=(y0-p.y)/斜率+p.x; var x_at_y1=(y1-p.y)/斜率+p.x; var r,s; 如果(y_at_x0否则,如果(y_at_x0),那绝对是令人惊讶的!我想给你+100。谢谢!