Mathématiques avec Python et Ruby/Droites en Ruby
La droite peut être définie à partir d'une de ses équations, mais aussi à partir de deux points. Et comme on a vu précédemment comment on peut créer en Ruby un objet point, on va voir comment on peut s'en servir pour gérer des droites sous Ruby.
Définition
Là encore, on va définir une classe Droite possédant, lors de son instanciation, deux points:
class Droite
def initialize(a,b)
@a,@b=a,b
end
Vecteurs
Vecteur directeur
def directeur
@a.vecteur(@b)
end
On obtient le vecteur directeur de d par d.directeur
Alignement
Pour savoir si le point m est sur la droite d, on peut rajouter ce test:
def IsOnLine(d)
vecteur(d.a).colin(d.directeur)
end
mais on le rajoute dans l'objet Point, puisque c'est une propriété du point...
Vecteur normal
Le vecteur normal s'obtient en choisissant ses coordonnées pour que le produit scalaire avec le vecteur directeur soit nul:
def normal
Vecteur.new(-self.directeur.y,self.directeur.x)
end
Le vecteur normal s'obtient avec d.normal et permet facilement d'avoir l'équation cartésienne ci-dessous.
Équations
Équation cartésienne
def cartesienne
'('+self.normal.x.to_s+')x+('+self.normal.y.to_s+')y='+(self.normal.x*@a.x+self.normal.y*@a.y).to_s
end
Pour afficher l'équation cartésienne de d, on entre
puts(d.cartesienne)
Équation réduite
Comme il y a des divisions à effectuer, on a intérêt à faire appel à mathn':
require 'mathn'
Coefficient directeur
def cd
self.directeur.y/self.directeur.x
end
Ordonnée à l'origine
def oalo
@a.y-self.cd*@a.x
end
Équation
L'équation réduite se définit par
def reduite
'y='+self.cd.to_s+'x+('+self.oalo.to_s+')'
end
et s'obtient par d.reduite.
Comparaison de deux droites
Parallélisme
Deux droites sont parallèles lorsque leurs vecteurs directeurs sont colinéaires. Mais aussi (sous réserve qu'elles en aient) lorsqu'elles ont le même coefficient directeur:
def parallele(d)
self.cd==d.cd
end
Pour savoir si deux droites d1 et d2 sont parallèles, on fait
puts(d1.parallele(d2))
Perpendicularité
Deux droites sont perpendiculaires si et seulement si leurs vecteurs normaux sont orthogonaux:
def perpendiculaire(d)
self.normal.ortho(d.normal)
end
On aurait aussi pu chercher si le produit de leurs coefficients directeurs est égal à -1.
Intersection
Pour calculer les coordonnées du point d'intersection de deux droites, on résout un système.
Exemple
Dans l'exemple des chapitres précédents, on peut regarder si les deux droites (CA) et (CB) sont perpendiculaires:
a=Point.new(-1,3)
b=Point.new(5,1)
c=Point.new(1,5)
d1=Droite.new(c,a)
d2=Droite.new(c,b)
puts(d1.perpendiculaire(d2))