Javascript 将坐标外推到画布对象的边
我正在编写一个浏览器应用程序,试图发现图像中的兴趣点 一旦我计算了这些点,我就在它们之间画一条线 我的应用程序需要将这些线外推到画布的边缘 有人有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
(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