From bba34dadbd560a99c998f831170f416e36143530 Mon Sep 17 00:00:00 2001 From: bkorecic Date: Mon, 21 Oct 2024 07:42:16 +0000 Subject: [PATCH] deploy: 76ab201298f0c66a399d381f8e9e5850fb7c32ca --- apunte/geometria/puntos/index.html | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/apunte/geometria/puntos/index.html b/apunte/geometria/puntos/index.html index a175aa27..14bc6138 100644 --- a/apunte/geometria/puntos/index.html +++ b/apunte/geometria/puntos/index.html @@ -45,13 +45,12 @@ y = _y; } }; -

Esta struct guarda simplemente las coordenadas x e y, y por defecto sus valores son cero. Tenemos dos constructores, el primero sin argumentos asigna cero, y el segundo.

Ejemplo de uso

Distintas formas de inicializar un punto y el valor que se obtiene:

Point a = Point(); // se llaman con parámetros por defecto, a = {0, 0}
+

Esta struct guarda simplemente las coordenadas x e y, y por defecto sus valores son cero. Tenemos dos constructores, el primero es sin argumentos, este asigna cero a las coordenadas, y el segundo recibe dos enteros, estos se asignan en orden a las coordenadas x e y.

Ejemplo de uso

Hay distintas formas de inicializar un punto, las ya nombradas y dos más que podrían resultarles útiles:

Point a = Point(); // se llaman con parámetros por defecto, a = {0, 0}
 Point b = Point(1, 2) // b = {1, 2}.
 Point c = {2,5}; // c = {2,5}, inicialización por copia.
 Point d{2,5}; // d = {2,5}, inicialización directa.
-
-cout << d.x << ' ' << d.y << endl; // Acceder a x e y
-

Podemos simplificar un poco el constructor usando una member initializer list. En este caso no hace tanta diferencia, pero queda más compacto (y es una buena práctica):

struct Point{
+

Además una vez creado un punto podemos acceder a sus coordenadas de la siguente forma

cout << d.x << ' ' << d.y << endl; // Acceder a x e y
+

Podemos simplificar un poco el constructor usando una member initializer list. En este caso no hace tanta diferencia, pero queda más compacto (y es una buena práctica):

struct Point{
     int x, y;
     Point(int _x=0, int _y=0) : x(_x), y(_y) {}
 };
@@ -79,6 +78,9 @@
 	// Multiplicación y división coordenada a coordenada
 	Point operator*(Point p) const { return Point(x*p.x, y*p.y); }
 	Point operator/(Point p) const { return Point(x/p.x, y/p.y); }
+	// Multiplicación y división por escalares
+	Point operator*(T lambda) const { return Point(x*lambda, y*lambda); }
+	Point operator/(T lambda) const { return Point(x/lambda, y/lambda); }
 	// Menor e igualdad. Usamos tie que retorna una tupla (y por ende compara en orden de izq. a der.)
 	bool operator<(Point p) const { return tie(x,y) < tie(p.x, p.y); }
 	bool operator==(Point p) const { return tie(x,y) == tie(p.x, p.y); }
@@ -93,10 +95,12 @@
 	// unit retorna el vector normalizado (largo 1)
 	Point unit() const { return *this/dist(); }
 	// perp obtiene un vector perpendicular, es decir rota en +90 grados
-	Point perp() const { return P(-y, x); }
-	// normal retorna un vector normal unitario
-	Point normal() const { return perp().unit(); }
-
+	Point perp() const { return Point(-y, x); }
+	// normal retorna un vector normal unitario (convencion normal a (0,0) = (inf,inf))
+	Point normal() const { return perp().unit();  }
+	// vector normal unitario (convencion normal a (0,0) = (0,0))
+	// Point normal() const { return (*this == Point()) ? *this : perp().unit(); }
+
 	// Además se puede hacer overload de operadores ">>" y "<<" para que poder leer/imprimir Point con cin/cout
 	friend istream& operator>>(istream& is, Point &p){
 		return is >> p.x >> p.y;