Простой математический алгоритм: центральная точка линии - PullRequest
5 голосов
/ 11 ноября 2011

У меня есть следующий алгоритм для нахождения центра линии (средней точки).

public DoublePoint getMidPoint() {
    return new DoublePoint((origin.x + endPoint.x) / 2, (origin.y + endPoint.y) / 2);
}

Кажется, работает для любых значений. Но я, кажется, помню гораздо более сложный алгоритм, включающий два круга, радиус которых равен длине линии, а центральные точки - это концы линии. Линия, проведенная от пересечения этих окружностей, будет пересекать отрезок, который вы тестируете, давая среднюю точку линии. Я точно знаю, что алгоритм работает 100% времени. Не уверен насчет моего более простого алгоритма, который кажется слишком простым.

Ответы [ 5 ]

14 голосов
/ 11 ноября 2011

То, что вы помните, - это геометрический метод построения перпендикулярного биссектрисы отрезка, используя только компас и линейку. Рассмотрим, например:

enter image description here

Это было хорошо для древних греков, но есть и другие методы (например, тот, который вы кодировали), которые лучше работают для компьютеров.

3 голосов
/ 11 ноября 2011

Алгоритм, который вы смутно помните, - это использовать линейку и компас, чтобы получить среднюю точку.Нарисуйте две окружности с равным радиусом, центрированные на двух концах отрезка, таким образом, чтобы они пересекались - длина отрезка будет достаточной.Используйте линейку, чтобы соединить точки, где пересекаются круги.Там, где эта линия пересекает исходный отрезок, это середина.Необычная анимация на http://www.mathopenref.com/constbisectline.html

2 голосов
/ 11 ноября 2011

Ваш простой алгоритм является полностью правильным. Метод с кругами - это нахождение средней точки с парой компасов.

2 голосов
/ 11 ноября 2011

Алгоритм и код, который вы используете, - это самый простой и лучший способ сделать это.

1 голос
/ 11 ноября 2011

Ваш алгоритм упрощает перевод строки в начало координат, поиск вектора, представленного этой линией, деление его пополам, а затем перевод обратно в исходную строку. Упрощение допустимо, а алгоритм верен.

...