"""  Croisement (exercice 2.30)     """

def droite(xa,ya,xb,yb): # question 1
    a=yb-ya
    b=xa-xb
    c=xa*(ya-yb)+ya*(xb-xa)
    return a,b,c

def intersection(a1,b1,c1,a2,b2,c2): # question 2
    """ ne traite que du cas des droites sécantes
        les droites parallèles (disjointes ou confondues) retournent 'none' """
    if a1*b2==a2*b1: # cas des droites parallèles
        return None,None
    y=(a1*c2-a2*c1)/(a2*b1-a1*b2)
    x=-(b1*y+c1)/a1
    return x,y

def interieur(xa,ya,xb,yb,xo,yo): # question 3
    """ renvoie True si le point O(xo,yo) appartient au segment [AB] """
    vec1=(xo-xb,yo-yb) #coordonnées du vecteur BO
    vec2=(xo-xa,y0-ya) #coordonnées du vecteur AO
    produit_scalaire=vec1[0]*vec2[0]+vec1[1]*vec2[1]
    if produit_scalaire<0 :
        return True
    return False

def coupe(xa,ya,xb,yb,xc,yc,xd,yd): # question 4
    """ renvoie True si [CD] coupe [AB] """
    a1,b1,c1=droite(xa,ya,xb,yb)
    a2,b2,c2=droite(xc,yc,xd,yd)
    x0,y0=intersection(a1,b1,c1,a2,b2,c2)
    if x0 != None and interieur(xa,ya,xb,yb,x0,y0):
        return True
    return False
    
# question 1    
a1,b1,c1=droite(1,1,5,2) # coordonnées de A et B
print("equation de la droite (AB):",a1,"x+",b1,"y+",c1,"=0")
#reponse : equation de la droite (AB): 1 x+ -4 y+ 3 =0 
a2,b2,c2=droite(5,1,4,4) # coordonnées de C et D
print("equation de la droite (CD):",a2,"x+",b2,"y+",c2,"=0")
#reponse : equation de la droite (CD): 3 x+ 1 y+ -16 =0

# question 2
print("coordonnées de l'intersection entre (AB) et (CD):")
x0,y0=intersection(a1,b1,c1,a2,b2,c2)
print("x0=",x0,"y0=",y0)
#reponse : x0= 4.6923076923076925 y0= 1.9230769230769231

# question 3
print(interieur(1,1,5,2,x0,y0))
#reponse : True

# question 4
print()
print(coupe(1,1,5,2,5,1,4,4))
print(coupe(1,1,5,2,1,2,4,4))
print(coupe(1,1,5,2,1,2,3,2.5))
print(coupe(1,1,4,2,5,1,4,4))#jeu de test supplémentaire
#reponses : True False False False
