javascript - 获取垂直于AB的坐标

标签 javascript math geometry 2d line

enter image description here

我已经发布了这个问题here

感谢 Fang,我得到了解决方案,但问题是我需要使用的坐标是 GPS 坐标,显然 GPS 需要与笛卡尔不同的公式。

因此,我正在使用 Google Maps APIv3 多边形并具有 AB 坐标(通过使用多边形工具绘制它们),我单击位置 C,需要将其移动到垂直于 AB 的 D,而 CD 平行于 AB

所以问题是:

Having
A = 50.88269282423443,6.0036662220954895
B = 50.882753744583226,6.003803014755249
C = 50.88252571592428, 6.003832183778286

- D is perpendicular to AB
- CD is parallel to AB

求D的公式是什么

我已经尝试了很长时间来解决这个问题,但到目前为止还没有成功。

最佳答案

所以A,B,C已知“D”未知。

CD

  • cd(t1)=C+(B-A)*t1
  • 地点:
  • cd(t1) CD 上的任意一点
  • t1是区间 <-inf,+inf> 的参数

BD

  • bd(t2)=B+Q*t2
  • 地点:
  • bd(t2) BD 上的任意一点
  • t2是区间 <-inf,+inf> 的参数
  • Q向量垂直于B-A
  • 在 2D 中,您可以这样获取它:
  • Q.x=+(B-A).y
  • Q.y=-(B-A).x
  • 在 3D 中使用叉积,但您的示例暗示 2D 情况...

D点

  • BD 的交集和CD
  • 所以只需用代数方法解决这个问题:
  • I. cd(t1)=C+(B-A)*t1
  • II. bd(t2)=B+Q*t2
  • III. cd(t1)=bd(t2)
  • 在二维中,这个 ( III. ) 导致 2 个具有 2 个变量的线性方程...
  • C.x+(B.x-A.x)*t1=B.x+(B.y-A.y)*t2
  • C.y+(B.y-A.y)*t1=B.y-(B.x-A.x)*t2
  • 查找参数t1然后计算D=cd(t1)
  • t2然后计算D=bd(t2)
  • 您应该推导出两种解决方案,并使用精度更高的一种解决方案
  • 两者都会使用一些除法A1/A2所以选择了一个更大的|A2|

enter image description here

如果你的D点也可以锁定A点

  • 然后找到两个位置 D1锁定至AD2锁定至B
  • 并选择了一个更接近要点的C (min(|D1-C|,|D2-C|))
  • 为了简化这一点,您可以使用 D1+(B-A)=D2 ...

[edit2] 我在 edit1 的某个地方确实犯了一些错误,所以这里是工作版本

    double ax,ay,bx,by,cx,cy,dx,dy; // points
    double bdx,bdy,cdx,cdy;         // directions
    double t1,t2;                   // parameters
/*
    //--- intersection equations ----------------
    1. cx+cdx*t1=bx+bdx*t2;
    2. cy+cdy*t1=by+bdy*t2;

    //--- separate t1 ---------------------------
    1. t1=(bx-cx+(bdx*t2)/cdx;
    //--- substitute t1 and separate t2 ---------
    2. t2=(cy-by+((bx-cx)*cdy/cdx))/(bdy-(bdx*cdy/cdx));
    //-------------------------------------------

    //--- separate t2 ---------------------------
    1. t2=(cx-bx+cdx*t1)/bdx;
    //--- substitute t2 and separate t1 ---------
    2. t1=(by-cy+((cx-bx)*bdy/bdx))/(cdy-(cdx*bdy/bdx));
    //-------------------------------------------
*/
    // common
    cdx=bx-ax;
    cdy=by-ay;
    bdx=+cdy;
    bdy=-cdx;
    //solution 1
    t2=(cy-by+((bx-cx)*cdy/cdx))/(bdy-(bdx*cdy/cdx));
    dx=bx+bdx*t2;
    dy=by+bdy*t2;
    //solution 2
    t1=(by-cy+((cx-bx)*bdy/bdx))/(cdy-(cdx*bdy/bdx));
    dx=cx+cdx*t1;
    dy=cy+cdy*t1;
  • 只需使用不被零除的解决方案...

关于javascript - 获取垂直于AB的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27794821/

相关文章:

javascript - 如何解决使用 p5 创建板的问题

JavaScript 函数计算器

c - C中除法的奇怪结果

algorithm - 拼图 : Find largest rectangle (maximal rectangle problem)

c++ - 以有效的方式在一组边中找到现有的圆

ios - Objective-C SpriteKit – 如何制作圆形按钮

c++ - 由于标准测试失败,用于查找点是否在 2D 多边形内的替代测试

javascript - KnockOut.js 中可以进行依赖验证吗

javascript - Jquery Ajax 不适用于 Codeigniter

javascript - (不允许的方法)外部 xml 到 json