def rota(self, p:Punto2D, angulo:float) -> Poligono2D: return Poligono2D.of([x.rota(p,angulo) for x in self.vertices]) def traslada(self, v:Vector2D) -> Poligono2D: return Poligono2D.of([x.traslada(v) for x in self.vertices]) def homotecia(self, p:Punto2D, factor:float) -> Poligono2D: return Poligono2D.of([x.homotecia(p,factor) for x in self.vertices]) def proyecta_sobre_recta(self,r:Recta2D) -> set[Punto2D]: return Poligono2D.of([x.proyecta_sobre_recta(r) for x in self.vertices]) def simetrico_con_respecto_a_recta(self, r:Recta2D) -> Poligono2D: return Poligono2D.of([x.simetrico_con_respecto_a_recta(r) for x in self.vertices]) @property def shape(self)->Patch: return Draw.shape_multiline([[p.x,p.y] for p in self.vertices],closed=True) if __name__ == '__main__': v = Vector2D.of(1., 0.) pol = Poligono2D.cuadrado(Punto2D.origen(),v) print(pol) print(pol.area) print(pol.perimetro) print(pol.rota(Punto2D.of(1.,1.), pi/2)) r = Poligono2D.rectangulo(Punto2D.of(1.,1.),v,2.) print(r) print("{0:.2f}".format(r.area))
vector: Vector2D @staticmethod def of(p: Punto2D, v: Vector2D) -> Recta2D: return Recta2D(p, v) @staticmethod def of_puntos(p1: Punto2D, p2: Punto2D) -> Recta2D: return Recta2D(p1, p2.vector_to(p1)) def __str__(self) -> str: return '({0},{1})'.format(str(self.punto), str(self.vector)) def punto_en_recta(self, factor: float = 0.) -> Punto2D: return self.punto + self.vector * factor def paralela(self, p: Punto2D) -> Recta2D: return Recta2D.of(p, self.vector) def ortogonal(self, p: Punto2D) -> Recta2D: return Recta2D.of(p, self.vector.ortogonal) if __name__ == '__main__': p1 = Punto2D.origen() p2 = Punto2D.of(0., 1.) r = Recta2D.of_puntos(p1, p2) print(r) p3 = Punto2D.of(1.0, 7.0) print(p3.proyecta_sobre_recta(r)) print(p3.simetrico_con_respecto_a_recta(r))