1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| # -*- coding: cp1252 -*-
import math
# calcule la distance du point M de coordonnées xM,yM, au segment BE
# B coordonnées xB,yB E cordonnes xE,yE
# en utilisant la puissance d'un point par rapport à une droite
def distance(xB,yB,xE,yE,xM,yM):
# coordonnées a,b du vecteur EB
a=xE-xB
b=yE-yB
# équation de la perpendiculaire D1 en B à (EB): ax+by+w1
w1=-a*xB-b*yB
# équation de la perpendiculaire D2 en E à (EB): ax+by+w2
w2=-a*xE-b*yE
# équation de la droite (EB) : bx-ay+w3
w3= a*yB-b*xB
#puissance de M par rapport à D1
PMD1=a*xM+b*yM+w1
# puissance de M par rapport à D2
PMD2=a*xM+b*yM+w2
#puissance de B par rapport à D2
PBD2=a*xB+b*yB+w2
#puissance de E par rapport à D1
PED1=a*xE+b*yE+w1
# A ce stade encore ni racine ni quotient
if PMD1*PED1 <0: #M et E de part et d'autre de D1
return math.sqrt((xM-xB)*(xM-xB)+(yM-yB)*(yM-yB)) # pas de quotient
if PMD2*PBD2 <0: #M et B de part et d'autre de D2
return math.sqrt((xM-xE)*(xM-xE)+(yM-yE)*(yM-yE)) # idem
# sinon
return abs(b*xM-a*yM+w3)/math.sqrt(a*a+b*b) # là rien à faire
def main():
xB=yB=1
xE=yE=2
xM=yM=0
print distance(xB,yB,xE,yE,xM,yM)
xM=1
print distance(xB,yB,xE,yE,xM,yM)
xM=2
print distance(xB,yB,xE,yE,xM,yM)
xM=3
print distance(xB,yB,xE,yE,xM,yM)
if __name__ == '__main__':
main() |
Partager