【发布时间】:2014-06-24 01:16:33
【问题描述】:
假设我有两点我知道:x1,y1 和 x2,y2。我知道我可以很容易地用毕达哥拉斯计算这条线的长度,但是如果我想计算这条线的缩短版本怎么办。例如,我希望 x,y 坐标朝向下一个点 10 个像素。有没有一个简单的公式可以在斜线上找到任何新点?
好的,这是一个 JavaScript 函数的解决方案。出于解释的目的,我故意使这个更加冗长。正如下面的 cmets 建议的那样,您必须先找到角度,然后用新的斜边计算边。
/**
* Calculates length of a line on Cartesian grid, then returns point that is X number of pixels down the line.
*
* @param {Number} fromX - starting x point
* @param {Number} fromY - starting y point
* @param {Number} toX - ending x point for vector
* @param {Number} toY - ending y point for vector
* @param {Number} pxDistance - Number of pixels down line toward ending point to return
* @return {Object} Returns x/y coords of point on line based on number of pixels given
*/
function stortenLineDistance(fromX, fromY, toX, toY, pxDistance){
//if line is vertical
if(fromX === toX)
return {x: toX, y: toY > fromY ? fromY + pxDistance : fromY - pxDistance};
//if line is horizontal
if(fromY === toY)
return {y: toY, x: toX > fromX ? fromX + pxDistance : fromX - pxDistance};
//get each side of original triangle length
var adjacent = toY - fromY;
var opposite = toX - fromX;
var hypotenuse = Math.sqrt(Math.pow(opposite, 2) + Math.pow(adjacent,2));
//find the angle
var angle = Math.acos(adjacent/hypotenuse);
//calculate new opposite and adjacent sides
var newOpposite = Math.sin(angle) * pxDistance;
var newAdjacent = Math.cos(angle) * pxDistance;
//calculate new x/y, see which direction it's going
var y = fromY - newAdjacent,
x = fromX + newOpposite;
return {y: y, x: x};
}
编辑:哇,Stackoverflow 太残酷了。如果您愿意,请随时删除此问题,但我认为这可能对陷入同一问题的人有所帮助。也许我错了。
无论如何,感谢评论者的帮助。
【问题讨论】:
-
您需要更彻底地解释并添加您的代码,以便我们了解发生了什么。
-
是的。基本的线性代数东西。
(x-x1)/(y-y1) = (x2-x1)/(y2-y1) -
将其标记为三角是一个好的开始,您知道斜率,因此您可以找到其中一个顶点的角度,我认为它是反正切。然后你需要像 1/(sine theta) 来得到 delta y 和 1/(cosine theta) 来得到 delta x。
-
实际上只是一个平方根,只涉及
x1,y1和x2,y2。我们称这两个点之间的距离(用毕达哥拉斯计算)w。从x,y到x2,y2-a的距离(在您的情况下为 10 像素)。然后a/w = (x1-x)/(y1-y)和(w-a)/w = (x2-x)/(y2-y)。只是两个线性方程组。仍然很容易解决。 -
@David 抱歉,请随时删除!我是这里的入侵者。无论如何,我得到了答案并在上面发布了解决方案。
标签: javascript geometry trigonometry