Título: Reto - Intersección de 2 cubos
Publicado por: [D4N93R] en 19 Agosto 2010, 18:10 pm
Continuando con el post de retos de RNA, en C++, quiero hacer este, para que los que quieran resolverlo en otros lenguajes puedan hacerlo.
Reglas: - Toda respuesta tiene que tener código - Si tienen dudas SOBRE LA DESCRIPCIÓN del reto, pueden entrar al IRC o enviarme un MP. - No se pueden utilizar liberías para hacer los calculos, todo debe ser hecho a mano.
Ahora si, vamos:
La aplicación debe permitir al usuario ingresar dos coordenadas de dos cubos, es decir, X, Y y Z, además de la dimensiones de cada uno, obviamente una sola, ya que es un cubo :D. El resultado será el volumen de la intersección en caso de que sea afirmativa, y sino decir que no hay intersección alguna.
Pondré los resultados acá, habrá un ganador por cada lenguaje :)
RESULTADOS
C++: ghastlyX
Título: Re: Reto - Intersección de 2 cubos
Publicado por: raul338 en 19 Agosto 2010, 21:09 pm
Ahora si using System; namespace InterCubos { class Program { static void Main(string[] args) { Console.WriteLine("Cubo al cubo!" + System.Environment.NewLine); int temp; Console.WriteLine("Ingrese datos del primer cubo: "); Console.Write("X:"); while (!int.TryParse(Console.ReadLine(), out temp)) { Console.WriteLine("ERROR: ingrese un valor numerico entero"); Console.Write("X:"); } cubo1.ubicacion.x = temp; Console.Write("Y:"); while (!int.TryParse(Console.ReadLine(), out temp)) { Console.WriteLine("ERROR: ingrese un valor numerico entero"); Console.Write("Y:"); } cubo1.ubicacion.y = temp; Console.Write("Z:"); while (!int.TryParse(Console.ReadLine(), out temp)) { Console.WriteLine("ERROR: ingrese un valor numerico entero"); Console.Write("Z:"); } cubo1.ubicacion.z = temp; Console.Write("Tamaño:"); while (!int.TryParse(Console.ReadLine(), out temp)) { Console.WriteLine("ERROR: ingrese un valor numerico entero"); Console.Write("Tamaño:"); } cubo1.tamaño = temp; Console.WriteLine("Ingrese datos del segundo cubo: "); Console.Write("X:"); while (!int.TryParse(Console.ReadLine(), out temp)) { Console.WriteLine("ERROR: ingrese un valor numerico entero"); Console.Write("X:"); } cubo2.ubicacion.x = temp; Console.Write("Y:"); while (!int.TryParse(Console.ReadLine(), out temp)) { Console.WriteLine("ERROR: ingrese un valor numerico entero"); Console.Write("Y:"); } cubo2.ubicacion.y = temp; Console.Write("Z:"); while (!int.TryParse(Console.ReadLine(), out temp)) { Console.WriteLine("ERROR: ingrese un valor numerico entero"); Console.Write("Z:"); } cubo2.ubicacion.z = temp; Console.Write("Tamaño:"); while (!int.TryParse(Console.ReadLine(), out temp)) { Console.WriteLine("ERROR: ingrese un valor numerico entero"); Console.Write("Tamaño:"); } cubo2.tamaño = temp; if (cubo1.isCollisioning(cubo2)) Console.WriteLine("Los cubos estan chocando!"); else Console.WriteLine("Los cubos no estan ni cerca ¬¬"); Console.ReadLine(); } } class Cubo { public Punto ubicacion { get; set; } public int tamaño { get; set; } public Cubo() { tamaño = 0; } public bool isCollisioning(Cubo elCubo) { if (entre(elCubo.ubicacion.x, this.ubicacion.x, this.ubicacion.x + this.tamaño, elCubo.ubicacion.x + elCubo.tamaño)) return true; if (entre(elCubo.ubicacion.y, this.ubicacion.y, this.ubicacion.y + this.tamaño, elCubo.ubicacion.y + elCubo.tamaño)) return true; if (entre(elCubo.ubicacion.z, this.ubicacion.z, this.ubicacion.z + this.tamaño, elCubo.ubicacion.z + elCubo.tamaño)) return true; return false; } private bool entre(int i, int valor, int d) { return entre(i, valor, valor, d); } private bool entre(int i, int valorMin, int valorMax, int d) { // Cambiar por esta linea si se quiere saber si esta un cubo dentro de otro // return (valorMin >= i) && (valorMax <= d); return (valorMin >= i) || (valorMax <= d); } } class Punto { public int x { get; set; } public int y { get; set; } public int z { get; set; } public Punto() { x = y = z = 0; } } }
Fixed :P No se que proponer como reto :P :xD
Título: Re: Reto - Intersección de 2 cubos
Publicado por: [D4N93R] en 19 Agosto 2010, 21:28 pm
Raul, no estás mostrando el VOLUMEN resultante de la intersección!
Título: Re: Reto - Intersección de 2 cubos
Publicado por: ghastlyX en 19 Agosto 2010, 21:28 pm
Pongo la mía, en C++. El formato de entrada es la longitud del lado del cubo y a continuación las coordenadas del vértice con coordenadas más pequeñas. Por ejemplo, si se quiere la intersección del cubo de lado 4 con vértice de menores coordenadas en (0,0,0) con el cubo de lado 3 con vértice de menores coordenadas en (-1,-1,-1), la entrada sería así: 4 0 0 0 3 -1 -1 -1 Y la salida devuelve el volumen de la intersección (devuelve 0 si la intersección es vacía). #include <iostream> #include <vector> using namespace std; void lee(vector<int>& v) { int len; cin >> len; for (int i = 0; i < 3; ++i) { cin >> v[i]; v[i + 3] = v[i] + len; } } int main() { vector<int> A(6), B(6); int res = 1; lee(A); lee(B); for (int i = 0; i < 3; ++i) A[i] = max(A[i], B[i]); for (int i = 3; i < 6; ++i) A[i] = min(A[i], B[i]); for (int i = 0; i < 3; ++i) res *= max(0, A[3 + i] - A[i]); cout << res << endl; }
Título: Re: Reto - Intersección de 2 cubos
Publicado por: [D4N93R] en 19 Agosto 2010, 21:36 pm
Muy bien, ya tenemos el de C++, y C# está encaminado, esperamos por los demás!
|