Как изменить начальные координаты при рисовании в 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;
}
}
}