Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 寻找最近的90度角点_Javascript_Math_Coordinates_Coordinate Systems - Fatal编程技术网

Javascript 寻找最近的90度角点

Javascript 寻找最近的90度角点,javascript,math,coordinates,coordinate-systems,Javascript,Math,Coordinates,Coordinate Systems,我已经走了很长一段路,但有些东西似乎不起作用 A = 50.88259382849774,6.003988087177277 B = 50.88269282423443,6.0036662220954895 C = 50.882530369581545,6.003847271203995 C坐标有点偏离90度线(x),我做的这个函数应该将C定位在离x线最近的地方 this.snapCoords = function(a, b, c){ var result = (b.x-a.x)*(

我已经走了很长一段路,但有些东西似乎不起作用

A = 50.88259382849774,6.003988087177277
B = 50.88269282423443,6.0036662220954895
C = 50.882530369581545,6.003847271203995

C坐标有点偏离90度线(x),我做的这个函数应该将C定位在离x线最近的地方

this.snapCoords = function(a, b, c){
    var result = (b.x-a.x)*(c.x-b.x)+(b.y-a.y)*(c.y-b.y);

    var negative = false;
    if(result < 0){
        result = result*-1;
        negative = true;
    }
    result = Math.sqrt(result);
    result = result/2;

    if(negative === false){
        var d = {x: c.x+result, y: c.y-result};
    }
    else{
        var d = {x: c.x-result, y: c.y+result};
    }

    console.log(d); // returns : 50.88246729610898,6.003910344676565
}
this.snapCoords=函数(a、b、c){
风险值结果=(b.x-a.x)*(c.x-b.x)+(b.y-a.y)*(c.y-b.y);
var负值=假;
如果(结果<0){
结果=结果*-1;
负=真;
}
结果=Math.sqrt(结果);
结果=结果/2;
如果(负===假){
var d={x:c.x+result,y:c.y-result};
}
否则{
var d={x:c.x-result,y:c.y+result};
}
console.log(d);//返回:50.88246729610898,6.003910344676565
}
它确实得到了90度(x)线,但不是最近的方式。我的功能一定还是有问题,但我想不出来

编辑:

这就是我的问题


我的函数将第三个坐标放在C上,C是90度,但不是它应该在的位置(红色点),它以某种方式延伸到另一个点。

我认为OP试图将点C投影到通过点B的直线上,并与线AB垂直。如果是这种情况,投影的数学是不正确的。您可以找到投影点D,如下所示

D=C-dot(vec(BC),vec(AB))*vec(AB)/| vec(AB)|^2

通过此计算,投影点D将为(50.8825952820492,6.00363622113846)

以下是a、B、C和D点的图片:

问题到底是什么?你的问题是:为什么“返回值:50.882467…,6.003910344…不同于上面的C=50.882430369…,6.00384727…?这很容易成为数字问题(特别是如果你使用浮点数而不是双精度).这正是我的问题。顺便说一句,我编辑了我的问题。我认为只有知道A点、B点和C点(上图中的标签)才能推断出红点的位置如果你有第四个点在梯形上的位置,那么你可以。你当然可以推断出红点所在的线,但不能推断出它与B的距离。你确实正确地理解了我,但它不起作用。这是当我把C放在你给出的坐标上时得到的坐标应该非常接近50.882531823134975,6.0038467745462185(gps谷歌地图坐标btw)当我把C点放在红点上时,它应该给我一个点的坐标,这个点垂直于AB线,就像你说的。这个坐标非常接近红点,但非常精确地位于ABNot的90度角上。不知道为什么你得到的结果和我的不同。我编辑我的帖子时,添加了一张所有a、B和C点的图片,ad投影点d。可能我解释错了,但点C应该在红色点上。正如你在图片中看到的,它应该是一个矩形,但我不能正确地得到它。所以我需要知道的是红色点的坐标。(很抱歉,我一直在试图找出它,但不能正确地得到它。)@OP:你最近的例子中D的坐标确实应该是(7,5)。我用我的公式计算得到(7,5)。这里是一些中间计算的结果,你可以验证你的结果:点(vec(BC),vec(AB))=-12。vec(AB)/| vec(AB)^2=(1/6,1/6)。因此,它们的乘积是(-2,-2)和(5,3)-(2,-2)=(7,5)。