es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo dibujar imágenes superpuestas con desplazamientos variables con GDI

Las matemáticas me están eludiendo en este caso. Tengo un área de un tamaño específico que no puede cambiar (digamos 100,100). Normalmente esto contiene una imagen ‘RigControl’:

enter image description here

Estoy buscando implementar la funcionalidad para superponer una imagen ‘GameControl’ encima de esto con un porcentaje de desplazamiento x e y variables separados que pueden ser negativos. Por ejemplo, esto sería con un desplazamiento de x = 40 e y = 40:

enter image description here

y esto con un desplazamiento de x = -40 e y = -40:

enter image description here

Podría lograrlo con este código:

Dim nImg As New Bitmap(CInt(containerSize.Width + (containerSize.Width * Math.Abs(xOffsetPercentage) / 100)),
                        CInt(containerSize.Height + (containerSize.Height * Math.Abs(yOffsetPercentage) / 100)),
                            PixelFormat.Format32bppArgb)

Using g As Graphics = Graphics.FromImage(nImg)

g.DrawImage(RigControlImg, New Rectangle(0, 0, containerSize.Width, containerSize.Height))

g.DrawImage(GameControlImage, New Rectangle(CInt(containerSize.Width * xOffsetPercentage / 100),
                                        CInt(containerSize.Height * yOffsetPercentage / 100),
                                        containerSize.Width, containerSize.Height))
End Using

Sin embargo, cuando uso números negativos, se corta de esta manera:

enter image description here

Sé por qué, por supuesto: cuando x o y son negativos, el origen de la imagen ‘RigControl’ debe ajustarse y el ‘GameControl’ se queda en 0,0. Así que lo reduje a tablas de entrada y salida, pero no puedo discernir la función para devolver estos valores (funciona para ambas coordenadas x e y, por supuesto):

Desplazamiento RigControl GameControl
-100 100 0
100 0 100
-200 200 0
200 0 200

¡Realmente estoy teniendo dificultades con las matemáticas en este caso! ¡Seguro que me arrepentiré cuando se resuelva!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para calcular el desplazamiento tanto para las imágenes de RigControl como para las de GameControl, puedes utilizar las siguientes fórmulas:

    • Desplazamiento de RigControl = offset – (offset * 2)
    • Desplazamiento de GameControl = 0 si el offset es positivo, tamaño del contenedor * (offset / 100) si el offset es negativo

    En VB.NET, puedes implementar estas fórmulas en tu código de la siguiente manera:

    Dim rigOffset As Integer = xOffsetPercentage - (xOffsetPercentage * 2)
    Dim gameOffset As Integer = If(xOffsetPercentage < 0, CInt(containerSize.Width * (xOffsetPercentage / 100)), 0)
    

    Y luego puedes utilizar estos desplazamientos en tus llamadas a g.DrawImage de la siguiente manera:

    g.DrawImage(RigControlImg, New Rectangle(rigOffset, rigOffset, containerSize.Width, containerSize.Height))
    
    g.DrawImage(GameControlImage, New Rectangle(gameOffset, If(yOffsetPercentage < 0, CInt(containerSize.Height * (yOffsetPercentage / 100)), 0),
                                                containerSize.Width, containerSize.Height))
    

    Esto debería permitir que los desplazamientos negativos se apliquen correctamente a ambas imágenes.

Comments are closed.