【问题标题】:Find new coordinates of point on line in javascript [closed]在javascript中在线查找点的新坐标[关闭]
【发布时间】: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,y1x2,y2。我们称这两个点之间的距离(用毕达哥拉斯计算)w。从 x,yx2,y2 - a 的距离(在您的情况下为 10 像素)。然后a/w = (x1-x)/(y1-y)(w-a)/w = (x2-x)/(y2-y)。只是两个线性方程组。仍然很容易解决。
  • @David 抱歉,请随时删除!我是这里的入侵者。无论如何,我得到了答案并在上面发布了解决方案。

标签: javascript geometry trigonometry


【解决方案1】:

我创建了一个利用相应边的比例的小提琴。将变量smallerLen 调整为任何单位,以查看该点跨线移动。

http://jsfiddle.net/3SY8v/

【讨论】:

  • 是的。似乎是相同的方法。
  • 太棒了。我是由比例决定的,有道理。谢谢大家。
  • 完美运行!谢谢:D
  • 感谢您的示例,感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
相关资源
最近更新 更多