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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| import trigo
import math
import numpy as np
class Plane(object):
def __init__(self, a, b, c=None, d=None):
if c !=None :
if d != None :
self._planeFromABCD(a,b,c,d)
else :
self._planeFrom3Points(a,b,c)
else :
self._planeFromVectorPoint(a, b)
def _planeFromABCD(self, a, b,c,d):
self._plane=[a, b, c, d]
def _planeFrom3Points(self, a, b, c):
u=[a[i]- b[i] for i in range(len(a))]
v=[c[i]- b[i] for i in range(len(c))]
w=trigo.vdot(u,v)
return self.__planeFromVectorPoint(w, a)
def _planeFromVectorPoint(self, v, p):
self._plane=v+[-trigo.dot(v,p)]
def __str__(self):
plane=self._plane
return "<{:8.3f},{:8.3f},{:8.3f},{:8.3f}>".format(
plane[0], plane[1], plane[2], plane[3])
def normalize(self):
nn=self.norm()
return [self._plane[i]/nn for i in range(4)]
def norm(self):
from math import sqrt
return sqrt(sum([self._plane[i]*self._plane[i] for i in range(3)]))
def perpendicular(self):
return self._plane[:3]
def distance(self, point):
plane=self._plane
return plane[0]*point[0]+plane[1]*point[1]+plane[2]*point[2]+plane[3]
def check(self, points):
print "check distance to plane"
for v in points:
dist=self.distance(v)
print v, dist
if __name__ == "__main__":
p1=Plane([1,0,0], [1,1,1])
print "p1", p1
p=Plane(1,2,0,2)
print "p:", p
print "norme de p:", p.norm()
print "perpendiculaire a p:", p.perpendicular()
print "p normalise",p.normalize()
et là une partie donnée qu'on doit intégré mais j'ai pas réussie à faire ça
#
import trigo
import math
from plane import Plane
class PlaneMock(Plane):
def __init__(self, plane, delta=0.01, max=1000.):
Plane.__init__(self, *plane._plane)
self._points=None
self._N=Npoints
self._max=max
self._delta=delta
def generate(self, N=100):
"""generate the points randomly"""
if self._points :
return self._points
import random as rd
index=[[0,1,2], [1,0,2], [2, 0, 1]]
points=[]
plane=self._plane
#trouver le plus grand en valeur abs() a, b, c du plan P(x)=ax+by+cz+d
#et on calcul alors x=(-by-cz-d)/a si c'est a
dabc=[math.fabs(plane[0]), math.fabs(plane[1]), math.fabs(plane[2])]
mx=max(dabc)
#idx contient l'indice pour le plan 0:x; 1:y et 2:z
idx=dabc.index(mx)
plane =[val/plane[idx] for val in plane]
print " plane", plane, index[idx]
[idx0, idx1, idx2]=index[idx]
for j in xrange(self._N):
v=[0,0,0]
r=rd.random()
v[idx1]=self._max*(2*r-1.0)
r=rd.random()
v[idx2]=self._max*(2*r-1.0)
v[idx0]=-(plane[idx1]*v[idx1] + plane[idx2]*v[idx2] + plane[3])
for k in xrange(3):
v[k] +=rd.uniform(-self._delta, self._delta)
points.append(v)
self._points=points
return points
def __str__(self):
super(PlaneMock,self).__str__()
if __name__ == "__main__":
p1=Plane([1,0,0], [1,1,1])
print "p1", p1
p=Plane(1,2,0,2)
print "p:", p
print p.norm()
print p.perpendicular()
print p.normalize()
print p
mp=PlaneMock(p, 10, delta=0.01)
lst=mp.generate()
print lst
mp.check(lst) |
Partager