Reto - Intersección de 2 cubos

Iniciado por [D4N93R], 19 Agosto 2010, 18:10 PM

0 Miembros y 1 Visitante están viendo este tema.

[D4N93R]

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

raul338

#1
Ahora si

Código (csharp) [Seleccionar]


using System;

namespace InterCubos
{
   class Program
   {
       static void Main(string[] args)
       {
           Console.WriteLine("Cubo al cubo!" + System.Environment.NewLine);
           Cubo cubo1 = new Cubo();
           Cubo cubo2 = new Cubo();

           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()
       {
           ubicacion = new Punto();
           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

[D4N93R]

Raul, no estás mostrando el VOLUMEN resultante de la intersección!

ghastlyX

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í:
Citar4
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).
Código (cpp) [Seleccionar]
#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;
}

[D4N93R]

Muy bien, ya tenemos el de C++, y C# está encaminado, esperamos por los demás!