Soit A, B, C quelques points.
La manière la plus simple de vérifier qu'ils se trouvent sur la même ligne est de compter le produit croisé des vecteurs B-A, C-A.
Si elle est égale à zéro, ils se trouvent sur la même ligne:
// 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.
}
Une fois que vous savez que A, B, C sont situés sur la même ligne, il est facile de savoir si B se situe entre A et C jeter innerproduct des vecteurs BA et CA. Si B est entre A et C, puis (B-A) a la même direction que (C-A), et innerproduct> 0, sinon < 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.
}
moindres carrés, je suppose. Supprimez ces nœuds avec le moins de contribution à la "forme" globale. Vous devez être plus précis sur ce que vous avez "chemin" et pourquoi il serait OK pour supprimer des nœuds. Parlez-vous d'un chemin géométrique? – zerm
Oui, un polygone, – jmasterx
duplication possible de [Distance la plus courte entre un point et un segment de ligne] (http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line- segment) – Pratik