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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| import numpy
import math
# P1 et P2 sont représentés par des listes sous la forme :
P1=[[0 ,0],[10 ,0],[20,10],[10,20],[0,20],[-10,10],[-10,0]] #[A,B]
P2=[[0 ,0 ],[0 ,10 ],[5,10],[0,0]]
m=len(P1)
n=len(P2)
A=P1[:] #on prend tout P1 dans A puisqu'on a besoin du dernier vecteur pour retourner à [0,0]
B=P1[1:] #on doit placer le dernier point B à l'origine
B.append([0,0]) #on ajoute donc [0,0] à la fin de la liste B
C=P2[:] #on prend tout P2 dans C puisqu'on a besoin du dernier vecteur pour retourner à [0,0]
D=P2[1:] #on doit placer le dernier point D à l'origine
D.append([0,0]) #on ajoute donc [0,0] à la fin de la liste D
def Orientation (M,N,P):
angle_rad=[]
for i in range (len(P)): # P permet d'utiliser la fonction pour P1 et P2
angle_rad.append(math.atan2(N[i][1]-M[i][1],N[i][0]-M[i][0])) #retourne atan(y / x). Le vecteur du plan allant de lorigine vers le point (x, y) forme cet angle avec laxe X positif.
return angle_rad
def Norme (M,N,P):
norme=[]
for i in range (len(P)): # P permet d'utiliser la fonction pour P1 et P2
norme.append(math.sqrt((N[i][0]-M[i][0])**2+(N[i][1]-M[i][1])**2))
return norme
#Q11
segNFP=[]
for i in range (m):
segNFP.append([Orientation(A,B,P1)[i], Norme(A,B,P1)[i]])
for i in range (n):
segNFP.append([Orientation(C,D,P2)[i], Norme(C,D,P2)[i]])
print ('segNFP=''\n',numpy.around(segNFP,3))
#tri par insertion des segments
def tri_ins(L):
for k in range(1,len(L)):
temp=L[k]
j=k
while j>0 and temp<L[j-1]:
L[j]=L[j-1]
j-=1
L[j]=temp
print ('liste triée','\n',numpy.around(L,3))
return L
segNFP_tri=tri_ins(segNFP)
# Q14
n=len(segNFP_tri)
NFP=[]
coord=[]
for i in range(n):
angle=segNFP_tri[i][0] # on reprend les angles et les normes dans le tableau
norme=segNFP_tri[i][1] #des segments triés à la question précédente
coord.append([[norme*math.cos(angle)],[norme*math.sin(angle)]]) #calcul du point suivant
NFP.append([coord[i][0],coord[i][1]])#on ajoute les coordonnées (x,y) dans un tableau NFP
print ('coordonnées des points du polygone''\n',numpy.around(NFP))
#Q16
def TestPoly(poly1,poly2):
n=len(poly1) #n points
angle_tot=0
for i in range(n-1): #n-1 segments
angle_deb=Orientation(poly2[i],poly1[i],poly1) #si un point est strictement à lintérieur dun polygone, alors la somme des angles orientés formés par ce point et chacun des sommets consécutifs du polygone est nulle (ou égale à 2pi)
angle_fin=Orientation(poly2[i],poly1[i+1],poly1)
angle_tot=angle_tot+(angle_fin-angle_deb)
resultat=False #valeur de resultat par défaut
if abs(angle_tot)<1e-10 or abs(angle_tot-2*pi)<1e-10: #valeur proche de 0 ou 2.pi a cause des erreurs d'arrondis
resultat=True
return resultat
TestPoly(P2,P1) |