查找线段上距离某点最近的点的坐标

mee*_*een 6 javascript cesiumjs

我需要计算从点 P 到线段 AB 绘制的垂直线的脚。我需要点 C 的坐标,其中 PC 是从点 P 到线 AB 垂直绘制的。

在此输入图像描述

我在这里找到了很少的答案,但矢量乘积过程对我不起作用。这是我尝试过的:

function nearestPointSegment(a, b, c) {
   var t = nearestPointGreatCircle(a,b,c);
   return t;
}

function nearestPointGreatCircle(a, b, c) {
  var a_cartesian = normalize(Cesium.Cartesian3.fromDegrees(a.x,a.y))
  var b_cartesian = normalize(Cesium.Cartesian3.fromDegrees(b.x,b.y))
  var c_cartesian = normalize(Cesium.Cartesian3.fromDegrees(c.x,c.y))
  var G = vectorProduct(a_cartesian, b_cartesian);
  var F = vectorProduct(c_cartesian, G);
  var t = vectorProduct(G, F);
  t = multiplyByScalar(normalize(t), R);
  return fromCartesianToDegrees(t);
}

function vectorProduct(a, b) {
    var result = new Object();
    result.x = a.y * b.z - a.z * b.y;
    result.y = a.z * b.x - a.x * b.z;
    result.z = a.x * b.y - a.y * b.x;
    return result;
}

function normalize(t) {
    var length = Math.sqrt((t.x * t.x) + (t.y * t.y) + (t.z * t.z));
    var result = new Object();
    result.x = t.x/length;
    result.y = t.y/length;
    result.z = t.z/length;
    return result;
}

function multiplyByScalar(normalize, k) {
    var result = new Object();
    result.x = normalize.x * k;
    result.y = normalize.y * k;
    result.z = normalize.z * k;
    return result;
}

function fromCartesianToDegrees(pos) {
  var carto  = Cesium.Ellipsoid.WGS84.cartesianToCartographic(pos);     
  var lon = Cesium.Math.toDegrees(carto.longitude); 
  var lat = Cesium.Math.toDegrees(carto.latitude); 
  return [lon,lat];
}
Run Code Online (Sandbox Code Playgroud)

我在这方面缺少什么?

小智 8

\n

这是一种基于矢量的方式:

\n

\r\n
\r\n
function foot(A, B, P) {\n  const AB = {\n    x: B.x - A.x,\n    y: B.y - A.y\n  };\n  const k = ((P.x - A.x) * AB.x + (P.y - A.y) * AB.y) / (AB.x * AB.x + AB.y * AB.y);\n  return {\n    x: A.x + k * AB.x,\n    y: A.y + k * AB.y\n  };\n}\n\nconst A = { x: 1, y: 1 };\nconst B = { x: 4, y: 5 };\nconst P = { x: 4.5, y: 3 };\nconst C = foot(A, B, P);\nconsole.log(C);\n\n// perpendicular?\nconst AB = {\n  x: B.x - A.x,\n  y: B.y - A.y\n};\nconst PC = {\n  x: C.x - P.x,\n  y: C.y - P.y\n};\nconsole.log((AB.x * PC.x + AB.y * PC.y).toFixed(3));
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n理论:\n

在此输入图像描述

\n

我从从 A 到 B 的向量 A\xe2\x9e\x9eB 开始。通过将该向量乘以标量 k 并将其与点 AI 相加,可以得到直线 AB 上的任意点 C。

\n

I) C = A + k \xc3\x97 A\xe2\x9e\x9eB

\n

接下来我需要建立 90\xc2\xb0 角度,这意味着 A\xe2\x9e\x9eB 和 P\xe2\x9e\x9eC 的点积为零。

\n

II) A\xe2\x9e\x9eB \xc2\xb7 P\xe2\x9e\x9eC = 0

\n

现在求解 k。

\n