2015-07-18 4 views
1

Я хочу рассчитать расстояние от точки, заданной двумя точками.Геометрия - Расстояние до точки отсчета от линии

Я использую яваскрипт и вот что я придумал, используя Википедию: https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line

function distance(point1, point2, x0, y0) { 
    return ((Math.abs((point2.y - point1.y) * x0 - 
        (point2.x - point1.x) * y0 + 
        point2.x * point1.y - 
        point2.y * point1.x))/
      (Math.pow((Math.pow(point2.y - point1.y, 2) + 
         Math.pow(point2.x - point1.x, 2)), 
         0.5))); 
} 

Проблема заключается в том, что он, кажется, не точны, так как если я ввожу эти параметры:

alert(distance({ x: 1, y: 1 }, { x: 2, y: 2 }, 1, 0));

Он возвращает 1/sqrt(2) вместо возврата 1 (который является расстоянием между точкой (1, 0) и линией в точке (1, 1)

EDIT: Я понимаю, что код выше не делает того, что я хотел. Он caulcated от точки к линии, представленной на 2 точки, но линия INFINITE (я хотел что-то еще, как вектор, который имеет 2 оконечные)

Я нашел ответ here

+0

Результат правильный. Расстояние между точкой и линией - это кратчайшее расстояние от точки до линии или другими словами, это расстояние на перпендикулярной линии до точки. – Zimmi

+0

javascript в порядке, вашей математике нет :-) Ближайшая точка из (1,0) на линии через (1,1) и (2,2) равна (0,5,0,5). – m69

+0

Возможно, это поможет построить линию, точку и перпендикулярно от точки к линии. –

ответ

4

Я думаю, 1/SQRT (2) = 0,7071 ... совершенно правильно. Смотрите изображение: enter image description here

Edit:

var board = JXG.JSXGraph.initBoard('jxgbox', { 
 
    boundingbox: [-1, 3, 3, 0], 
 
    keepaspectratio: true, 
 
    axis: true 
 
}); 
 

 
var f1 = function(x) { 
 
    return x; 
 
}; 
 

 
board.create('functiongraph', [f1]); 
 

 
board.create('point', [1, 1], { 
 
    size: 4, 
 
    name: '1,1' 
 
}); 
 
board.create('point', [2, 2], { 
 
    size: 4, 
 
    name: '2,2' 
 
}); 
 
var p1 = board.create('point', [1, 0], { 
 
    size: 4, 
 
    name: '1,0' 
 
}); 
 
var p2 = board.create('point', [0.5, 0.5], { 
 
    size: 0, 
 
    name: '1,0' 
 
}); 
 
var li2 = board.create('line', [p1, p2], { 
 
    straightFirst: false, 
 
    straightLast: false, 
 
    strokeWidth: 2, 
 
    dash: 2 
 
});
<html> 
 

 
<head> 
 
    <link rel="stylesheet" type="text/css" href="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraph.css" /> 
 
    <script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraphcore.js"></script> 
 
</head> 
 

 
<body> 
 
    <div id="jxgbox" class="jxgbox" style="width:500px; height:600px;"></div> 
 
</body> 
 

 
</html>

+0

Просто из интереса, как вы нарисовали это изображение/сюжет? –

+2

просто нашел это сам: http://start.sketchometry.org/ круто, он? – NilsB

1

Чтобы добавить математическую точку зрения, то здесь следует математическое "доказательство" того, почему ваша функция является правильным:

Самое короткое расстояние между точкой и линией - это расстояние на перпендикулярной линии до точки. В этом случае мы знаем, что угол между линией и осью х составляет 45 градусов, и мы знаем, что расстояние от Origo (1, 0) равен 1.

Использование:

formula

... мы видим, что ваш результат правильный, поскольку sin (угол) = противоположная сторона прямоугольного треугольника/гипотенузы.