elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Perfect Pixel Collision ayuda
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Perfect Pixel Collision ayuda  (Leído 2,369 veces)
AlexPro

Desconectado Desconectado

Mensajes: 40


Ver Perfil WWW
Perfect Pixel Collision ayuda
« en: 7 Julio 2012, 22:43 pm »

Hola, he hecho el siguiente método para comprobar si colisionan dos imagenes por los pixeles:
Código
  1.        private bool CheckPixelCollision(int Image1_x, int Image1_y, int Image2_x, int Image2_y, Bitmap Image1, Bitmap Image2)
  2.        {
  3.            bool intersected = false;
  4.  
  5.           for (int i = 0; i < Image1.Width; i++)
  6.           {
  7.               for (int j = 0; j < Image1.Height; j++)
  8.               {
  9.  
  10.                   for (int k = 0; k < Image2.Width; k++)
  11.                   {
  12.                       for (int l = 0; l < Image2.Height; l++)
  13.                       {
  14.                           Color Image1_color = Image1.GetPixel(i, j);
  15.                           Color Image2_color = Image2.GetPixel(k, l);
  16.                           if (Image1_color.A != 0 & Image2_color.A != 0)
  17.                           {
  18.                               if (Image1_x+i == Image2_x+k & Image1_y+j == Image2_y+l)//Vemos si colisionan los pixeles
  19.                               {
  20.                                   intersected = true;
  21.  
  22.  
  23.                               }
  24.                           }
  25.                       }
  26.                   }
  27.               }
  28.           }
El código funciona y devuelve true, el problema es que el programa va muy lento cuando se ejecuta esta función. Alguien tiene otra forma de hacer Perfect Pixel Collision?
PD: utilizo gdi+ para el código


« Última modificación: 7 Julio 2012, 22:47 pm por AlexPro » En línea

AlexPro

Desconectado Desconectado

Mensajes: 40


Ver Perfil WWW
Re: Perfect Pixel Collision ayuda
« Respuesta #1 en: 8 Julio 2012, 12:06 pm »

Lo he conseguido corregir de la siguiente forma... Saludos
Código
  1. //Metodo para ver si colisionan dos objetos según los píxeles
  2.        private bool CheckPixelCollision(int Image1_x, int Image1_y, int Image2_x, int Image2_y, Bitmap Image1, Bitmap Image2)
  3.        {
  4.            bool intersected = false;//Por defecto no colisionaran
  5.  
  6.            //Se va a realizar la comprobación píxel por píxel
  7.           for (int i = 0; i < Image1.Width; i++)
  8.           {
  9.               for (int j = 0; j < Image1.Height; j++)
  10.               {
  11.                   Color Image1_color = Image1.GetPixel(i, j);
  12.                   if (Image1_color.A != 0)//Se comprueba primero si el pixel de la imagen 1 no es transparente
  13.                   {
  14.  
  15.                       for (int k = 0; k < Image2.Width; k++)
  16.                       {
  17.                           if (Image1_x + i == Image2_x + k)//Vemos si colisionan los pixeles
  18.                           {
  19.                               for (int l = 0; l < Image2.Height; l++)
  20.                               {
  21.  
  22.                                   Color Image2_color = Image2.GetPixel(k, l);
  23.                                   if (Image2_color.A != 0)//Comprobamos si no es transparente el píxel de la imagen 2
  24.                                   {
  25.                                       if (Image1_y + j == Image2_y + l)//Vemos si colisionan los pixeles
  26.                                       {
  27.                                           intersected = true;
  28.  
  29.  
  30.                                       }
  31.                                   }
  32.  
  33.                               }
  34.                           }
  35.                       }
  36.                   }
  37.              }
  38.           }
  39.  
  40.           if (intersected == true)
  41.           {
  42.               return true;//Devuelve true si colisionan
  43.           }
  44.           else
  45.           {
  46.               return false; //Si no colisionan devuelve false
  47.           }
  48.  
  49.  
  50.  
  51.  
  52.  
  53.        }


En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Perfect Pixel Collision ayuda
« Respuesta #2 en: 17 Julio 2012, 00:41 am »

¿Colisionan en que sentido?, porque tienes la Clase Region, que tiene una función para obtener los rectángulos que la conforman de una manera muy precisa y luego realizarle a cada rectángulo .Contains para verificar que existe un par de coordenadas en su área.

La recursividad nunca es el mejor camino, imagina una imagen de 1000x1000 a compararse con otra de 500x500.

Serían 250 mil millones de vueltas del bucle :S
« Última modificación: 17 Julio 2012, 00:44 am por Keyen Night » En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
AlexPro

Desconectado Desconectado

Mensajes: 40


Ver Perfil WWW
Re: Perfect Pixel Collision ayuda
« Respuesta #3 en: 17 Julio 2012, 16:10 pm »

Gracias, lo tendré en cuenta.
Un saludo.
En línea

spiritdead

Desconectado Desconectado

Mensajes: 296


Ver Perfil
Re: Perfect Pixel Collision ayuda
« Respuesta #4 en: 17 Julio 2012, 17:16 pm »

te recomiendo usar poligonos rectangulares y ecuaciones de interseccion de rectas
por ahi mas o menos deberias ir dandole

por ciclos lo que haras es saturar el CPU y consumiras mas RAM y por lo tanto tu app sera mas lenta a la larga
En línea

Facilitador De Tareas - Task Simplifier (FDT)
Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Perfect Pixel Collision ayuda
« Respuesta #5 en: 17 Julio 2012, 23:45 pm »

Si las imágenes A y B tienen una posición X y Y y un alto y ancho, una intercepta a la otra siempre que el rectángulo formado por alguna de las 2 imágenes contenga al menos un punto del rectángulo de la imagen contraria.

De no ser posiciones rectangulares es que se complica más, ahora escribo un código de ejemplo para que se vea con mayor claridad.

Aquí esta es un proyecto vació de WindowsForm el siguiente código:

Código
  1. Imports System.Drawing.Drawing2D
  2.  
  3. Public Class Form1
  4.  
  5.    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
  6.  
  7.        Dim A As New GraphicsPath
  8.        Dim B As New GraphicsPath
  9.  
  10.        'Las coordenadas y tamaños son solo de ejemplo'
  11.        A.AddRectangle(New Rectangle(10, 50, 100, 200))
  12.        B.AddRectangle(New Rectangle(30, 69, 200, 100))
  13.  
  14.        'Se dibujan los rectangulos de ejemplo'
  15.        e.Graphics.FillPath(Brushes.Green, A)
  16.        e.Graphics.FillPath(Brushes.Red, B)
  17.  
  18.        'Se guardan las regiones de los rectangulos'
  19.        Dim RegionA As New Region(A)
  20.        Dim RegionB As New Region(B)
  21.  
  22.        'Se guarda en RegionA la intercepción que existe entre A y B'
  23.        RegionA.Intersect(RegionB)
  24.  
  25.        'Se pinta la region intercepta'
  26.        e.Graphics.FillRegion(Brushes.Blue, RegionA)
  27.  
  28.        Dim Punto As PointF = RegionA.GetBounds(e.Graphics).Location
  29.  
  30.        'Si la region no esta vacia, entonces estamos en presencia'
  31.        'de una intercepcion, ya que hemos logrado pintarla'
  32.        If Not RegionA.IsEmpty(e.Graphics) Then
  33.            e.Graphics.DrawString("Intercepción", Me.Font, Brushes.Red, Punto.X, Punto.Y)
  34.        End If
  35.  
  36.    End Sub
  37.  
  38. End Class
« Última modificación: 18 Julio 2012, 00:10 am por Keyen Night » En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿como dibujar un circulo pixel a pixel? VB 6.0
Programación Visual Basic
AlxSpy 6 13,260 Último mensaje 28 Mayo 2011, 18:48 pm
por AlxSpy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines