我已经发布了这个问题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|
如果你的D点也可以锁定A点
- 然后找到两个位置
D1
锁定至A
和D2
锁定至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/