javascript-将坐标外推到画布对象的边缘
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-将坐标外推到画布对象的边缘,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1898字,纯文字阅读大概需要3分钟。
内容图文
![javascript-将坐标外推到画布对象的边缘](/upload/InfoBanner/zyjiaocheng/696/455f38ff6d1c4a8491e4443a21201c64.jpg)
我正在编写一个浏览器应用程序,试图发现图像中的兴趣点.
一旦计算出这些点,便在它们之间画一条线.
我的应用程序需要将这些线条外推到画布的边缘.
有没有人在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}]);
})();
https://jsfiddle.net/y87a0dec/
非常感谢.
解决方法:
p =(px,py)和q =(qx,qy)之间的线段可以扩展到线y-py = a *(x-px),其中a是斜率(py-qy)/(px -qx). (如果p.x = q.x,这是无效的,但这是我们可以单独处理的特殊情况.)
通过求解y和x,我们得到等价公式:y = a *(x-p.x)p.y和x =(y-p.y)/ ap.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];
}
在下面的jsfiddle中,drawExtended将来自extend的结果传递到drawLine中.顶部和左侧部分已扩展到画布边缘:
https://jsfiddle.net/y87a0dec/1/
内容总结
以上是互联网集市为您收集整理的javascript-将坐标外推到画布对象的边缘全部内容,希望文章能够帮你解决javascript-将坐标外推到画布对象的边缘所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。