Пусть A, B, C - некоторые точки.
Самый простой способ проверить, что они лежат на одной линии, - считать кросспродукт векторов B-A, C-A.
Если он равен нулю, то они лежат на одной и той же линии:
// X_ab, Y_ab - coordinates of vector B-A.
float X_ab = B.x - A.x
float Y_ab = B.y - A.y
// X_ac, Y_ac - coordinates of vector C-A.
float X_ac = C.x - A.x
float Y_ac = C.y - A.y
float crossproduct = Y_ab * X_ac - X_ab * Y_ac
if (crossproduct < EPS) // if crossprudct == 0
{
// on the same line.
} else {
// not on the same line.
}
После вы знаете, что A, B, C лежат на одной и той же линии, что легко знать, находится ли B между точками А и С броском innerproduct векторов BA и CA. Если B лежит между А и С, а затем (В-А) имеет такое же направление, как (С-А), и innerproduct> 0, в противном случае < 0:
float innerproduct = X_ab * X_ac + Y_ab * Y_ac;
if (innerproduct > 0) {
// B is between A and C.
} else {
// B is not between A and C.
}
наименьших квадратов, я думаю. Удалите эти узлы с наименьшим вкладом в общую «форму». Вам нужно уточнить, какой у вас «путь» и почему было бы хорошо удалять узлы. Вы говорите об геометрическом пути? – zerm
Да, многоугольник, – jmasterx
Возможный дубликат [Наименьшее расстояние между точкой и отрезком] (http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line- сегмент) – Pratik