У меня есть изображение карты и меньший элемент управления PictureBox.
Я получаю информацию от моего приятеля. Моя картинка снимает изображение вверх и влево
Adn X на самом деле вращает изображение ..
Моя проблема в том, что когда я поворачиваю изображение, ось Y вращается вместе с ним, поэтому, когда я снова двигаюсь вверх, он не будет действительно подниматься ... он будет идти в новом направлении, на который указывает и ось Y ..
Вот мой код, если бы вы могли понять мою проблему ..
public void UpdateTurret()
{
while (js != null)
{
js.GetData();
Thread.Sleep(80);
MapY += js.State.Y;
MapRotation += js.State.X;
{
Image map = Properties.Resources.Map;
Bitmap bmp = (Bitmap)map.Clone();
Graphics g = Graphics.FromImage((Image)bmp);
g.TranslateTransform((float)bmp.Width / 2, (float)bmp.Height / 2 - (MapY / 2));
g.RotateTransform(MapRotation);
g.TranslateTransform(-(float)bmp.Width / 2, -(float)bmp.Height / 2 + (MapY / 2));
g.DrawImage(bmp, 0, 0);
Graphics gfx = Graphics.FromImage((Image)bmp);
gfx.DrawPie(new Pen(Color.Blue, 5), bmp.Width/2 - 5, bmp.Height/2 - 5, 5, 5, 0, 360);
gfx.DrawImage(bmp, 0, MapY);
picBoxMap.Image = (Image)bmp;
float rot = MapRotation;
rot = (float)Math.Abs((rot - 360*Math.Ceiling(rot / 360)));
DrawString = (rot).ToString() + "° Y:" + MapY.ToString();
}
}
}
Моя проблема сейчас в том, что точка вращения всегда центрирована, я хочу, чтобы моя точка вращения была новой позицией, которую я достиг.
Итак, я понял, что это должно быть так:
g.TranslateTransform((float)bmp.Width / 2, (float)bmp.Height / 2 - MapY);
g.RotateTransform(MapRotation);
g.TranslateTransform(-(float)bmp.Width / 2, -(float)bmp.Height / 2 + MapY);
Но это вызывает еще одну ошибку. Теперь, когда я поворачиваю изображение, ось Y вращается вместе с ним, поэтому, когда я снова двигаюсь вверх, он не будет действительно подниматься ... он будет идти в новом направлении, на которое указывает и ось Y ...
У кого-нибудь есть идеи по решению этой проблемы?
EDIT
Вот мой новый код:
public void UpdateTurret()
{
while (js != null)
{
js.GetData();
Thread.Sleep(80);
MapY += js.State.Y;
MapRotation += js.State.X;
{
Image map = Properties.Resources.Map;
Size mapSize = map.Size;
Bitmap bmp = (Bitmap)map.Clone();
Graphics g = Graphics.FromImage((Image)bmp);
Matrix transformMatrix = new Matrix();
transformMatrix.Translate(-mapSize.Width / 2, -mapSize.Height / 2, MatrixOrder.Append);
transformMatrix.Rotate(MapRotation, MatrixOrder.Append);
transformMatrix.Translate(mapSize.Width / 2, mapSize.Height / 2, MatrixOrder.Append);
transformMatrix.Translate(0, MapY, MatrixOrder.Append);
g.Transform = transformMatrix;
g.DrawImage(bmp, 0,0);
picBoxMap.Image = (Image)bmp;
float rot = MapRotation;
rot = (float)Math.Abs((rot - 360*Math.Ceiling(rot / 360)));
DrawString = (rot).ToString() + "° Y:" + MapY.ToString();
}
}
//Draw Cross
Graphics gfx = picBoxMap.CreateGraphics();
Rectangle rc = picBoxMap.ClientRectangle;
gfx.DrawLine(Pens.Red, rc.Width / 2, rc.Height / 2 + 10, rc.Width / 2, rc.Height / 2 - 10);
gfx.DrawLine(Pens.Red, rc.Width / 2 + 10, rc.Height / 2, rc.Width / 2 - 10, rc.Height / 2);
}
Моя проблема в том, что после того, как я переместил карту по оси Y, точка вращения остается в центральной точке.
И позаботьтесь о том, чтобы я только повернул карту:
Вы можете видеть, что я не сдвинул ось Y, но она изменилась .. потому что точка вращения находится в центре изображения, а не там, где находится красный крест.
Мне нужно, чтобы точка вращения находилась в том же положении, что и красный крест.