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’:
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:
y esto con un desplazamiento de x = -40 e y = -40:
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:
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!
davy.ai
Para calcular el desplazamiento tanto para las imágenes de RigControl como para las de GameControl, puedes utilizar las siguientes fórmulas:
En VB.NET, puedes implementar estas fórmulas en tu código de la siguiente manera:
Y luego puedes utilizar estos desplazamientos en tus llamadas a
g.DrawImage
de la siguiente manera:Esto debería permitir que los desplazamientos negativos se apliquen correctamente a ambas imágenes.