Не работает 2D передвижение объекта к месту клика мышкой - C#
Формулировка задачи:
Суть в том, что после клика мыши объект получает координаты X и Y клика, и должен двигаться в том направлении. Координаты передаются в MoveTo, а угол высчитывается в GetAngle. В математике почти ноль, формулы с форумов.
private double GetAngle(double x1,double y1,double x2,double y2)
{
double ang = Math.Atan((x1 - x2) / (y1 - y2)) * Rad2Deg;
if ((x1 < x2) && (y1 > y2))
return ang;
else if (((x1 < x2) && (y1 < y2)) || ((x1 > x2) && (y1 < y2)))
return ang + 180d;
else
return ang + 360d;
}
public void MoveTo(double x, double y)
{
TX = x; TY = y;
Angle = GetAngle(TX, TY, X, Y);
TimerMove.Interval = 10;
TimerMove.Start();
}
private void Move(object sender, EventArgs e)
{
X += Speed * (Math.Sin(Angle * Rad2Deg));
Y += Speed * (Math.Cos(Angle * Rad2Deg));
}Решение задачи: «Не работает 2D передвижение объекта к месту клика мышкой»
textual
Листинг программы
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication254
{
public partial class Form1 : Form
{
private Bot bot = new Bot();
public Form1()
{
InitializeComponent();
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
Application.Idle += (o, e) => Invalidate();//постоянно обновляем
MouseDown += (o, e) => bot.TargetLocation = e.Location;//устанавливаем цель для бота
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
//обновляем состояние бота
bot.Update();
//рисуем бота
e.Graphics.FillRectangle(Brushes.Red, bot.Location.X-2, bot.Location.Y-2, 5, 5);
}
}
public class Bot
{
public float Speed = 0.2f;
public PointF Velocity { get; private set; }
public PointF Location = new PointF(10, 10);
public PointF TargetLocation = new PointF(100, 100);
public void Update()
{
var d = new PointF(TargetLocation.X - Location.X, TargetLocation.Y - Location.Y);//вектор движения
var length = (float) Math.Sqrt(d.X * d.X + d.Y * d.Y);
if (length < Speed)
{
Location = TargetLocation;
Velocity = new PointF(0, 0);
}
else
Velocity = new PointF(d.X * Speed / length, d.Y * Speed / length);
Location = new PointF(Location.X + Velocity.X, Location.Y + Velocity.Y);
}
}
}