import math


def fvsphere():
    """formule volume sphere"""
    print("4/3*pi*r**3")


def vsphere(r):
    """volume sphere"""
    print(4 / 3 * math.pi * r ** 3)


def fpcercle():
    """formule périmetre cercle"""
    print("2*pi*r")


def pcercle(r):
    """périmetre cercle"""
    print(2 * math.pi * r)


def fadisq():
    """formule aire disque"""
    print("pi*r**2")


def adisq(r):
    """aire disque"""
    print(math.pi * r ** 2)


def fpcarre():
    """formule périmetre carré"""
    print("c*4")


def pcarre(c):
    """périmetre carré"""
    print(c * 4)


def facarre():
    """formule aire carré"""
    print("c**2")


def acarre(c):
    """aire carré"""
    print(c ** 2)


def fperectangle():
    """formule périmetre du rectangle"""
    print("(L+l)*2")


def perectangle(L, l):
    """périmetre du rectangle"""
    print((L + l) * 2)


def farectangle():
    """formule aire rectangle"""
    print("L*l")


def arectangles(L, l):
    """aire rectangle"""
    print(L * l)


def faparallel():
    """formule aire parallelogramme"""
    print("B*h")


def aparallel(B, h):
    """aire parallelogramme"""
    print(B * h)


def fatrapz():
    """formule aire trapeze"""
    print("((B+b)*h)/2")


def atrapz(B, b, h):
    """aire trapeze"""
    calc = ((B + b) * h) / 2
    print(calc)


def falosange():
    """formule aire losange"""
    print("(Diagonale*diagonale)/2")


def alosange(Diagonale, diagonale):
    """aire losange"""
    print((Diagonale * diagonale) / 2)


def fvcube():
    """formule volume cube"""
    print("c**3")


def vcube(c):
    """volume cube"""
    print(c ** 3)


def fvpave():
    """formule volume pavé droit"""
    print("L*l*h")


def vpave(L, l, h):
    """volume pavé droit"""
    print(L * l * h)


def fvprisme():
    """formule volume prisme droit"""
    print("aire_base*h")


def vprisme(aire_base, h):
    """volume prisme droit"""
    print(aire_base * h)


def fvcylindre():
    """formule volume cylindre"""
    print("pi*r**2*h")


def vcylindre(r, h):
    """volume cylindre"""
    print(math.pi * r ** 2 * h)


def fvpyramide():
    """fromule volume pyramide"""
    print("(aire_base * h) / 3")


def vpyramide(aire_base, h):
    """ volume pyramide"""
    print((aire_base * h) / 3)


def fvcone():
    """formule volume cone"""
    print("(pi*r**2*h)/3")


def vcone(r, h):
    """volume cone"""
    print((math.pi * r ** 2 * h) / 3)


# essayer de passer cette fonction en POO
# v coolineaire -> xa*yb-xb*ya=0
# à revérifier
"""======faire pour le trapèze et trapèze rectangle, isocèle ...======"""


def quadrilatere(xa, ya, xb, yb, xc, yc, xd, yd):
    """trouve le type de quadrilatere a l'aide des coordonées des 4 points abcd ATTENTION les quadrilatère concave et
    convexe ne sont pas pris en compte par ce progamme """
    vector_ab = [xb - xa, yb - ya]
    vector_dc = [xc - xd, yc - yd]
    vector_ad = [xd - xa, yd - ya]
    vector_bc = [xc - xb, yc - yb]
    collinear = xa * yb - xb * ya  # calcule coolinéarité
    # distance des segments du quadrilatère
    distance_ab = math.sqrt((xb - xa) ** 2 + (yb - ya) ** 2)
    distance_bc = math.sqrt((xc - xb) ** 2 + (yc - yb) ** 2)
    distance_cd = math.sqrt((xd - xc) ** 2 + (yd - yc) ** 2)
    distance_da = math.sqrt((xa - xd) ** 2 + (ya - yd) ** 2)
    distance_ac = math.sqrt((xc - xa) ** 2 + (yc - ya) ** 2)
    distance_bd = math.sqrt((xd - xb) ** 2 + (yd - yb) ** 2)
    pythagorean = distance_ab ** 2 + distance_da ** 2
    distance_dbcarre = distance_bd ** 2
    quadrilatere_quelconque = True
    trapeze_rectangle = False
    parallelogramme = False
    losange = False
    carre = False
    rectangle = False
    trapeze = False
    if collinear == 0:
        quadrilatere_quelconque = False
        parallelogramme = True
        if distance_ab == distance_da:
            parallelogramme = False
            losange = True
            # recherche d'un angle droit pour un carré
            if pythagorean == distance_dbcarre:
                losange = True
                carre = True
        else:  # recherche rectangle
            if pythagorean == distance_dbcarre:
                parallelogramme = False
                rectangle = True
            else:  # recherche trapèze rectangle
                # angle par angle pour une recherche de l'angle droit avec pythagore (pythagorean)

                pythagorean_angle_a = distance_ab ** 2 + distance_da ** 2
                hypotenuse_angle_a = distance_ac ** 2

                pythagorean_angle_b = distance_ab ** 2 + distance_bc ** 2
                hypotenuse_angle_b = distance_bd ** 2

                pythagorean_angle_c = distance_bc ** 2 + distance_cd ** 2
                hypotenuse_angle_c = distance_ac ** 2

                pythagorean_angle_d = distance_cd ** 2 + distance_da ** 2
                hypotenuse_angle_d = distance_bd ** 2

                if pythagorean_angle_a == hypotenuse_angle_a and pythagorean_angle_b == hypotenuse_angle_b:
                    trapeze_rectangle = True
                if pythagorean_angle_b == hypotenuse_angle_b and pythagorean_angle_c == hypotenuse_angle_c:
                    trapeze_rectangle = True
                if pythagorean_angle_c == hypotenuse_angle_c and pythagorean_angle_d == hypotenuse_angle_d:
                    trapeze_rectangle = True
                if pythagorean_angle_d == hypotenuse_angle_d and pythagorean_angle_a == hypotenuse_angle_a:
                    trapeze_rectangle = True
                else:
                    print(" ")

    # !!!ça ne fonctionne pas il affiche tout !!!
    if parallelogramme:
        print("c'est un parallelogramme")
    if losange:
        print("c'est un losange")
    if rectangle:
        print("c'est un rectangle")
    if carre:
        print("c'est un carre")
    if trapeze:
        print("c'est un trapeze quelconque")
    if quadrilatere_quelconque:
        print("c'est un quadrilatère quelconque")
    if trapeze_rectangle:
        print("c'est un trapèze rectangle")
    if __name__ == "__main__":
        question = input("voulez-vous les vecteurs ab,dc,ad,bc (y/n)")
        if question == "y" or "Y" or "yes" or "YES":
            print("vecteur ab : ", vector_ab, "vecteur ad : ", vector_ad, "vecteur bc : ", vector_bc, "vecteur dc : ",
                  vector_dc)


# détection des distances
# remplacement de ca => gcote
def triangle(xa, ya, xb, yb, xc, yc):
    """trouve le type de triangle avec les coordonnées de 3 pts !!! CA doit être le plus grand côté (pythagore)"""
    global gcote
    distance_ab = math.sqrt((xb - xa) ** 2 + (yb - ya) ** 2)
    distance_bc = math.sqrt((xc - xb) ** 2 + (yc - yb) ** 2)
    distance_ca = math.sqrt((xa - xc) ** 2 + (ya - yc) ** 2)
    if distance_ab > distance_bc and distance_ab > distance_ca:
        # ab remplace ca
        gcote = distance_ab
    if distance_bc > distance_ab and distance_bc > distance_ca:
        # ab remplace ca
        gcote = distance_bc
    if distance_ca > distance_ab and distance_ca > distance_bc:
        # rien ne change
        gcote = distance_ca
    isocele = False
    equilateral = False
    rectangle = True
    if distance_ab == distance_bc or distance_bc == gcote or gcote == distance_ab:
        isocele = True
    if distance_ab == distance_bc == gcote:
        equilateral = True
    # recherche triangle rectangle
    pythagorean = distance_ab ** 2 + distance_bc ** 2
    hypotenuse = gcote ** 2
    if pythagorean == hypotenuse:
        rectangle = True
    # print des types de triangle avec les True or False
    if equilateral:
        print("c'est un triangle equilateral")
    if isocele != True or rectangle != True:
        pass
    else:
        print("c'est un triangle isocele rectangle")
        rectangle = False
        isocele = False

    if isocele == False and equilateral == False and rectangle == True:
        print("c'est un triangle quelconque")
    if rectangle:
        print("c'est un triangle rectangle")
    if isocele:
        print("c'est un triangle isocele")


def fdist2pt():
    """distance entre deux points formule"""
    print("sqrt((xb-xa)**2+(yb-ya)**2)")


def dist2pt(xa, xb, ya, yb):
    """distance entre deux points calcul"""
    calc = math.sqrt((xb - xa) ** 2 + (yb - ya) ** 2)
    return calc


def sind(deg):
    """calcule le sinus d'un angle en degrés"""
    angle_rad = 2 * math.pi * deg / 360
    return math.sin(angle_rad)


def cosd(deg):
    """calcule le cosinus d'un angle en degrés"""
    angle_rad = 2 * math.pi * deg / 360
    return math.cos(angle_rad)


def tand(deg):
    """calcule la tangente d'un angle en degrés"""
    angle_rad = 2 * math.pi * deg / 360
    return math.tan(angle_rad)


def affine(fx1, x1, fx2, x2):
    """donne la formule de la fonction affine avec les images et leurs ordonnées"""
    a = (fx1 - fx2) / (x1 - x2)
    b = fx1 - a * x1
    print(a, "x +", b)

# Pourcentages


def fevoratevf(vi, t):
    """donne la valeur finale d'un taux d'évolution vi = valeur initiale t = taux"""
    vf = vi * (1 + t)
    return vf


def multicoef(vf, vi):
    """cm = coefficient multiplicateur vf = valeur finale vi = valeur initiale calcule le cm"""
    cm = vf / vi
    return cm


def finvalue(cm, vi):
    """cm = coefficient multiplicateur vf = valeur finale vi = valeur initiale calcule la valeur finale"""
    vf = cm * vi
    return vf


def initvalue(cm, vf):
    """cm = coefficient multiplicateur vf = valeur finale vi = valeur initiale calcule la vi"""
    vi = vf / cm
    return vi


def rate(vf, vi):
    """calcule du taux"""
    t = (vf-vi)/vi
    return t


def poly(a, b, c):
    """méthode 1 polynome du second degrés pour mettre sous la forme a(x-alpha)^2 + beta"""
    alpha = -b / (2 * a)
    beta = a * alpha ** 2 + b * alpha + c
    stalpha = str(alpha)
    stbeta = str(beta)
    fc = a, "(X-", stalpha, ")**2+", stbeta
    return fc



def polynomial2(a, b, c):
    """trouve x1 x2 ou x0 ou rien d'un polynome """
    delta = b ** 2 - 4*a*c
    if delta > 0:
        """faire x1 x2 """
        xun = (- b - math.sqrt(delta)) / (2*a)
        xdeux = (- b + math.sqrt(delta)) / (2*a)
        print("x1 = ", xun, "x2 = ", xdeux)

    if delta == 0:
        """faire x0"""
        xzero = -b / (2*a)
        print("x0", xzero)

    if delta < 0:
        print('il n\'y a pas de solutions à l\'équation')


import math


def fvsphere():
    """formule volume sphere"""
    print("4/3*pi*r**3")


def vsphere(r):
    """volume sphere"""
    print(4 / 3 * math.pi * r ** 3)


def fpcercle():
    """formule périmetre cercle"""
    print("2*pi*r")


def pcercle(r):
    """périmetre cercle"""
    print(2 * math.pi * r)


def fadisq():
    """formule aire disque"""
    print("pi*r**2")


def adisq(r):
    """aire disque"""
    print(math.pi * r ** 2)


def fpcarre():
    """formule périmetre carré"""
    print("c*4")


def pcarre(c):
    """périmetre carré"""
    print(c * 4)


def facarre():
    """formule aire carré"""
    print("c**2")


def acarre(c):
    """aire carré"""
    print(c ** 2)


def fperectangle():
    """formule périmetre du rectangle"""
    print("(L+l)*2")


def perectangle(L, l):
    """périmetre du rectangle"""
    print((L + l) * 2)


def farectangle():
    """formule aire rectangle"""
    print("L*l")


def arectangles(L, l):
    """aire rectangle"""
    print(L * l)


def faparallel():
    """formule aire parallelogramme"""
    print("B*h")


def aparallel(B, h):
    """aire parallelogramme"""
    print(B * h)


def fatrapz():
    """formule aire trapeze"""
    print("((B+b)*h)/2")


def atrapz(B, b, h):
    """aire trapeze"""
    calc = ((B + b) * h) / 2
    print(calc)


def falosange():
    """formule aire losange"""
    print("(Diagonale*diagonale)/2")


def alosange(Diagonale, diagonale):
    """aire losange"""
    print((Diagonale * diagonale) / 2)


def fvcube():
    """formule volume cube"""
    print("c**3")


def vcube(c):
    """volume cube"""
    print(c ** 3)


def fvpave():
    """formule volume pavé droit"""
    print("L*l*h")


def vpave(L, l, h):
    """volume pavé droit"""
    print(L * l * h)


def fvprisme():
    """formule volume prisme droit"""
    print("aire_base*h")


def vprisme(aire_base, h):
    """volume prisme droit"""
    print(aire_base * h)


def fvcylindre():
    """formule volume cylindre"""
    print("pi*r**2*h")


def vcylindre(r, h):
    """volume cylindre"""
    print(math.pi * r ** 2 * h)


def fvpyramide():
    """fromule volume pyramide"""
    print("(aire_base * h) / 3")


def vpyramide(aire_base, h):
    """ volume pyramide"""
    print((aire_base * h) / 3)


def fvcone():
    """formule volume cone"""
    print("(pi*r**2*h)/3")


def vcone(r, h):
    """volume cone"""
    print((math.pi * r ** 2 * h) / 3)


# essayer de passer cette fonction en POO
# v coolineaire -> xa*yb-xb*ya=0
# à revérifier
"""======faire pour le trapèze et trapèze rectangle, isocèle ...======"""


def quadrilatere(xa, ya, xb, yb, xc, yc, xd, yd):
    """trouve le type de quadrilatere a l'aide des coordonées des 4 points abcd ATTENTION les quadrilatère concave et
    convexe ne sont pas pris en compte par ce progamme """
    vector_ab = [xb - xa, yb - ya]
    vector_dc = [xc - xd, yc - yd]
    vector_ad = [xd - xa, yd - ya]
    vector_bc = [xc - xb, yc - yb]
    collinear = xa * yb - xb * ya  # calcule coolinéarité
    # distance des segments du quadrilatère
    distance_ab = math.sqrt((xb - xa) ** 2 + (yb - ya) ** 2)
    distance_bc = math.sqrt((xc - xb) ** 2 + (yc - yb) ** 2)
    distance_cd = math.sqrt((xd - xc) ** 2 + (yd - yc) ** 2)
    distance_da = math.sqrt((xa - xd) ** 2 + (ya - yd) ** 2)
    distance_ac = math.sqrt((xc - xa) ** 2 + (yc - ya) ** 2)
    distance_bd = math.sqrt((xd - xb) ** 2 + (yd - yb) ** 2)
    pythagorean = distance_ab ** 2 + distance_da ** 2
    distance_dbcarre = distance_bd ** 2
    quadrilatere_quelconque = True
    trapeze_rectangle = False
    parallelogramme = False
    losange = False
    carre = False
    rectangle = False
    trapeze = False
    if collinear == 0:
        quadrilatere_quelconque = False
        parallelogramme = True
        if distance_ab == distance_da:
            parallelogramme = False
            losange = True
            # recherche d'un angle droit pour un carré
            if pythagorean == distance_dbcarre:
                losange = True
                carre = True
        else:  # recherche rectangle
            if pythagorean == distance_dbcarre:
                parallelogramme = False
                rectangle = True
            else:  # recherche trapèze rectangle
                # angle par angle pour une recherche de l'angle droit avec pythagore (pythagorean)

                pythagorean_angle_a = distance_ab ** 2 + distance_da ** 2
                hypotenuse_angle_a = distance_ac ** 2

                pythagorean_angle_b = distance_ab ** 2 + distance_bc ** 2
                hypotenuse_angle_b = distance_bd ** 2

                pythagorean_angle_c = distance_bc ** 2 + distance_cd ** 2
                hypotenuse_angle_c = distance_ac ** 2

                pythagorean_angle_d = distance_cd ** 2 + distance_da ** 2
                hypotenuse_angle_d = distance_bd ** 2

                if pythagorean_angle_a == hypotenuse_angle_a and pythagorean_angle_b == hypotenuse_angle_b:
                    trapeze_rectangle = True
                if pythagorean_angle_b == hypotenuse_angle_b and pythagorean_angle_c == hypotenuse_angle_c:
                    trapeze_rectangle = True
                if pythagorean_angle_c == hypotenuse_angle_c and pythagorean_angle_d == hypotenuse_angle_d:
                    trapeze_rectangle = True
                if pythagorean_angle_d == hypotenuse_angle_d and pythagorean_angle_a == hypotenuse_angle_a:
                    trapeze_rectangle = True
                else:
                    print(" ")

    # !!!ça ne fonctionne pas il affiche tout !!!
    if parallelogramme:
        print("c'est un parallelogramme")
    if losange:
        print("c'est un losange")
    if rectangle:
        print("c'est un rectangle")
    if carre:
        print("c'est un carre")
    if trapeze:
        print("c'est un trapeze quelconque")
    if quadrilatere_quelconque:
        print("c'est un quadrilatère quelconque")
    if trapeze_rectangle:
        print("c'est un trapèze rectangle")
    if __name__ == "__main__":
        question = input("voulez-vous les vecteurs ab,dc,ad,bc (y/n)")
        if question == "y" or "Y" or "yes" or "YES":
            print("vecteur ab : ", vector_ab, "vecteur ad : ", vector_ad, "vecteur bc : ", vector_bc, "vecteur dc : ",
                  vector_dc)


# détection des distances
# remplacement de ca => gcote
def triangle(xa, ya, xb, yb, xc, yc):
    """trouve le type de triangle avec les coordonnées de 3 pts !!! CA doit être le plus grand côté (pythagore)"""
    global gcote
    distance_ab = math.sqrt((xb - xa) ** 2 + (yb - ya) ** 2)
    distance_bc = math.sqrt((xc - xb) ** 2 + (yc - yb) ** 2)
    distance_ca = math.sqrt((xa - xc) ** 2 + (ya - yc) ** 2)
    if distance_ab > distance_bc and distance_ab > distance_ca:
        # ab remplace ca
        gcote = distance_ab
    if distance_bc > distance_ab and distance_bc > distance_ca:
        # ab remplace ca
        gcote = distance_bc
    if distance_ca > distance_ab and distance_ca > distance_bc:
        # rien ne change
        gcote = distance_ca
    isocele = False
    equilateral = False
    rectangle = True
    if distance_ab == distance_bc or distance_bc == gcote or gcote == distance_ab:
        isocele = True
    if distance_ab == distance_bc == gcote:
        equilateral = True
    # recherche triangle rectangle
    pythagorean = distance_ab ** 2 + distance_bc ** 2
    hypotenuse = gcote ** 2
    if pythagorean == hypotenuse:
        rectangle = True
    # print des types de triangle avec les True or False
    if equilateral:
        print("c'est un triangle equilateral")
    if isocele != True or rectangle != True:
        pass
    else:
        print("c'est un triangle isocele rectangle")
        rectangle = False
        isocele = False

    if isocele == False and equilateral == False and rectangle == True:
        print("c'est un triangle quelconque")
    if rectangle:
        print("c'est un triangle rectangle")
    if isocele:
        print("c'est un triangle isocele")


def fdist2pt():
    """distance entre deux points formule"""
    print("sqrt((xb-xa)**2+(yb-ya)**2)")


def dist2pt(xa, xb, ya, yb):
    """distance entre deux points calcul"""
    calc = math.sqrt((xb - xa) ** 2 + (yb - ya) ** 2)
    return calc


def sind(deg):
    """calcule le sinus d'un angle en degrés"""
    angle_rad = 2 * math.pi * deg / 360
    return math.sin(angle_rad)


def cosd(deg):
    """calcule le cosinus d'un angle en degrés"""
    angle_rad = 2 * math.pi * deg / 360
    return math.cos(angle_rad)


def tand(deg):
    """calcule la tangente d'un angle en degrés"""
    angle_rad = 2 * math.pi * deg / 360
    return math.tan(angle_rad)


def affine(fx1, x1, fx2, x2):
    """donne la formule de la fonction affine avec les images et leurs ordonnées"""
    a = (fx1 - fx2) / (x1 - x2)
    b = fx1 - a * x1
    print(a, "x +", b)

# Pourcentages


def fevoratevf(vi, t):
    """donne la valeur finale d'un taux d'évolution vi = valeur initiale t = taux"""
    vf = vi * (1 + t)
    return vf


def multicoef(vf, vi):
    """cm = coefficient multiplicateur vf = valeur finale vi = valeur initiale calcule le cm"""
    cm = vf / vi
    return cm


def finvalue(cm, vi):
    """cm = coefficient multiplicateur vf = valeur finale vi = valeur initiale calcule la valeur finale"""
    vf = cm * vi
    return vf


def initvalue(cm, vf):
    """cm = coefficient multiplicateur vf = valeur finale vi = valeur initiale calcule la vi"""
    vi = vf / cm
    return vi


def rate(vf, vi):
    """calcule du taux"""
    t = (vf-vi)/vi
    return t


def poly(a, b, c):
    """méthode 1 polynome du second degrés pour mettre sous la forme a(x-alpha)^2 + beta"""
    alpha = -b / (2 * a)
    beta = a * alpha ** 2 + b * alpha + c
    stalpha = str(alpha)
    stbeta = str(beta)
    fc = a, "(X-", stalpha, ")**2+", stbeta
    return fc



def polynomial2(a, b, c):
    """trouve x1 x2 ou x0 ou rien d'un polynome """
    delta = b ** 2 - 4*a*c
    if delta > 0:
        """faire x1 x2 """
        xun = (- b - math.sqrt(delta)) / (2*a)
        xdeux = (- b + math.sqrt(delta)) / (2*a)
        print("x1 = ", xun, "x2 = ", xdeux)

    if delta == 0:
        """faire x0"""
        xzero = -b / (2*a)
        print("x0", xzero)

    if delta < 0:
        print('il n\'y a pas de solutions à l\'équation')


formule volume sphere volume sphere formule périmetre cercle périmetre cercle formule aire disque aire disque formule périmetre carré périmetre carré formule aire carré aire carré formule périmetre du rectangle périmetre du rectangle formule aire rectangle aire rectangle formule aire parallelogramme aire parallelogramme formule aire trapeze aire trapeze formule aire losange aire losange formule volume cube volume cube formule volume pavé droit volume pavé droit formule volume prisme droit volume prisme droit formule volume cylindre volume cylindre fromule volume pyramide volume pyramide formule volume cone volume cone # essayer de passer cette fonction en POO # v coolineaire -> xa*yb-xb*ya=0 # à revérifier ======faire pour le trapèze et trapèze rectangle, isocèle ...====== trouve le type de quadrilatere a l'aide des coordonées des 4 points abcd ATTENTION les quadrilatère concave et
     convexe ne sont pas pris en compte par ce progamme # calcule coolinéarité # distance des segments du quadrilatère # recherche d'un angle droit pour un carré # recherche rectangle # recherche trapèze rectangle # angle par angle pour une recherche de l'angle droit avec pythagore (pythagorean) # !!!ça ne fonctionne pas il affiche tout !!! # détection des distances # remplacement de ca => gcote trouve le type de triangle avec les coordonnées de 3 pts !!! CA doit être le plus grand côté (pythagore) # ab remplace ca # ab remplace ca # rien ne change # recherche triangle rectangle # print des types de triangle avec les True or False distance entre deux points formule distance entre deux points calcul calcule le sinus d'un angle en degrés calcule le cosinus d'un angle en degrés calcule la tangente d'un angle en degrés donne la formule de la fonction affine avec les images et leurs ordonnées # Pourcentages donne la valeur finale d'un taux d'évolution vi = valeur initiale t = taux cm = coefficient multiplicateur vf = valeur finale vi = valeur initiale calcule le cm cm = coefficient multiplicateur vf = valeur finale vi = valeur initiale calcule la valeur finale cm = coefficient multiplicateur vf = valeur finale vi = valeur initiale calcule la vi calcule du taux méthode 1 polynome du second degrés pour mettre sous la forme a(x-alpha)^2 + beta trouve x1 x2 ou x0 ou rien d'un polynome faire x1 x2 faire x0