Как изменить начальные координаты при рисовании в pictureBox

Есть программа рисующая объект и траекторию его полета, но не получается рисовать с центра pictureBox

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;

namespace MatModel
{
    public partial class Form1 : Form
    {
        double pi = Math.PI;
        double Vx, Vy;
        double g = 9.8;
        double V, a, MaxX, MaxY,dt;
        int xx;
        int yy;
        const int maxHeighWindow = 502;
        //Правки
        DateTime startTime = DateTime.Now;
        //end

        public Form1()
        {
            InitializeComponent();
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
            ImageBox.Paint += PictureBox1_Paint;
            xx = ImageBox.ClientSize.Width / 2;
            yy = ImageBox.ClientSize.Height / 2;
        }

        private List<Point> _points = new List<Point>();
        public void drawBall(PaintEventArgs e)
        {
            
            _points.Add(new Point(xx, yy));
            if (_points.Count >= 3)
            {
                
               
                e.Graphics.DrawCurve(Pens.Red, _points.ToArray());

            }
            e.Graphics.FillEllipse(Brushes.Black, xx - 10, yy - 10, 20, 20);
        }

        public void beginBall()
        {
            if (yy <= maxHeighWindow)
            {
                dt = (DateTime.Now - startTime).TotalSeconds;
                xx = Convert.ToInt32(Vx * dt);
                yy = maxHeighWindow - Convert.ToInt32(Vy * dt - dt * dt * g / 2);
            }
        }

        private void Reshenie()
        {
            RasstoyanieBox.Text = "";
            VisotaBox.Text = "";
            V = Convert.ToDouble(SkorostBox.Text);
            a = Convert.ToDouble(YgolBox.Text);
            MaxX = V * V * Math.Sin(2 * pi * a / 180) / g;
            MaxY = V * V * Math.Sin(pi * a / 180) * Math.Sin(pi * a / 180) / (2 * g);
            RasstoyanieBox.Text = MaxX.ToString();
            VisotaBox.Text = MaxY.ToString();
            Vx = V * Math.Cos(pi * a / 180);
            Vy = V * Math.Sin(pi * a / 180);
        }
       
  
        private void Start_Click(object sender, EventArgs e)
        {
            if (SkorostBox.Text != "" && YgolBox.Text != "")
            {
                _points.Clear();
                a = Convert.ToDouble(YgolBox.Text);
                if (a <= 90)
                {
     
                    var alpha = pi * a / 180;
                    startTime = DateTime.Now;
                    V = Convert.ToDouble(SkorostBox.Text);
                    Vx = V * Math.Cos(alpha);
                    Vy = V * Math.Sin(alpha);
                    var t = Vy / g;
                    MaxY = t * t / (g * 2);
                    MaxX = 2 * t * Vx;
                    xx = 0;
                    yy = maxHeighWindow;
                    timer1.Enabled = true;
                    timer1.Interval = 10;
                    Reshenie();
                }
                else
                {
                    MessageBox.Show("Угол не должен быть больше 90 градусов!");
                }
            }
            else
            {
                MessageBox.Show("Введите данные!");
            }
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            beginBall();
            ImageBox.Invalidate();
        }

       

        private void ImageBox_Paint(object sender, PaintEventArgs e)
        {
            drawBall(e);
        }
        //Пикселей в одном делении оси
        const int PIX_IN_ONE = 10;
        //Длина стрелки
        const int ARR_LEN = 10;


        private void PictureBox1_Paint(object sender, PaintEventArgs e)
        {
            int w = ImageBox.ClientSize.Width / 2;
            int h = ImageBox.ClientSize.Height / 2;
            //Смещение начала координат в центр PictureBox
            e.Graphics.TranslateTransform(w, h);
            DrawXAxis(new Point(-w, 0), new Point(w, 0), e.Graphics);
            DrawYAxis(new Point(0, h), new Point(0, -h), e.Graphics);
            //Центр координат
            e.Graphics.FillEllipse(Brushes.Red, -2, -2, 4, 4);
        }

        //Рисование оси X
        private void DrawXAxis(Point start, Point end, Graphics g)
        {
            //Деления в положительном направлении оси
            for (int i = PIX_IN_ONE; i < end.X - ARR_LEN; i += PIX_IN_ONE)
            {
                g.DrawLine(Pens.Black, i, -5, i, 5);
                DrawText(new Point(i, 5), (i / PIX_IN_ONE).ToString(), g);
            }
            //Деления в отрицательном направлении оси
            for (int i = -PIX_IN_ONE; i > start.X; i -= PIX_IN_ONE)
            {
                g.DrawLine(Pens.Black, i, -5, i, 5);
                DrawText(new Point(i, 5), (i / PIX_IN_ONE).ToString(), g);
            }
            //Ось
            g.DrawLine(Pens.Black, start, end);
            //Стрелка
            g.DrawLines(Pens.Black, GetArrow(start.X, start.Y, end.X, end.Y, ARR_LEN));
        }

        //Рисование оси Y
        private void DrawYAxis(Point start, Point end, Graphics g)
        {
            //Деления в отрицательном направлении оси
            for (int i = PIX_IN_ONE; i < start.Y; i += PIX_IN_ONE)
            {
                g.DrawLine(Pens.Black, -5, i, 5, i);
                DrawText(new Point(5, i), (-i / PIX_IN_ONE).ToString(), g, true);
            }
            //Деления в положительном направлении оси
            for (int i = -PIX_IN_ONE; i > end.Y + ARR_LEN; i -= PIX_IN_ONE)
            {
                g.DrawLine(Pens.Black, -5, i, 5, i);
                DrawText(new Point(5, i), (-i / PIX_IN_ONE).ToString(), g, true);
            }
            //Ось
            g.DrawLine(Pens.Black, start, end);
            //Стрелка
            g.DrawLines(Pens.Black, GetArrow(start.X, start.Y, end.X, end.Y, ARR_LEN));
        }

        //Рисование текста
        private void DrawText(Point point, string text, Graphics g, bool isYAxis = false)
        {
            var f = new Font(Font.FontFamily, 5);
            var size = g.MeasureString(text, f);
            var pt = isYAxis
                ? new PointF(point.X + 1, point.Y - size.Height / 2)
                : new PointF(point.X - size.Width / 2, point.Y + 1);
            var rect = new RectangleF(pt, size);
            g.DrawString(text, f, Brushes.Black, rect);
        }

        //Вычисление стрелки оси
        private static PointF[] GetArrow(float x1, float y1, float x2, float y2, float len = 10, float width = 4)
        {
            PointF[] result = new PointF[3];
            //направляющий вектор отрезка
            var n = new PointF(x2 - x1, y2 - y1);
            //Длина отрезка
            var l = (float)Math.Sqrt(n.X * n.X + n.Y * n.Y);
            //Единичный вектор
            var v1 = new PointF(n.X / l, n.Y / l);
            //Длина стрелки
            n.X = x2 - v1.X * len;
            n.Y = y2 - v1.Y * len;
            result[0] = new PointF(n.X + v1.Y * width, n.Y - v1.X * width);
            result[1] = new PointF(x2, y2);
            result[2] = new PointF(n.X - v1.Y * width, n.Y + v1.X * width);
            return result;
        }
    }
}

Ответы (0 шт):