Задать вопрос
@Tlatelolko

Некорректное движение по диагонали (чистый С#, Winforms, векторная графика)?

Ребята, хоть убейте, не пойму в чём проблема. В C# двигаю пикачбокс в чекпоинт с использованием векторной математики. Использую её для того, чтобы пикачбокс двигался строго по диагонали, без рывков и без движения "лесенкой".

Но он, зараза, двигается как-то странно. В зависимости от изменения скорости он двигается сначала чисто по оси Х, потом на каком-то этапе по диагонали к чекпоинту.

Я уже много чего перепробовал, понимаю, что где-то я неправильно что-то сделал, но не могу понять, где.

Вот код:
// 1. Вычисление вектора направления
    // Разница между целью и текущей позицией
    float deltaX = targetPosition.X - currentPosition.X;
    float deltaY = targetPosition.Y - currentPosition.Y;

    // 2. Вычисление расстояния
    float distance = (float)Math.Sqrt(deltaX * deltaX + deltaY * deltaY);
    
    // Проверка на то, достигли ли мы цели
    if (distance < Speed) 
    {
        // Цель почти достигнута. Перемещаем юнит точно в цель и останавливаем таймер.
        currentPosition = targetPosition;
        moveTimer.Stop();
    }
    else
    {
        // 3. Нормализация вектора и применение скорости
        // Нормализованный вектор направления (единичный вектор)
        float unitX = deltaX / distance;
        float unitY = deltaY / distance;

        // Вектор движения за один тик (Направление * Скорость)
        float moveStepX = unitX * Speed;
        float moveStepY = unitY * Speed;

        // 4. Обновление позиции
        currentPosition.X += moveStepX;
        currentPosition.Y += moveStepY;
    }
    // 5. Обновление отображения PictureBox
    unitPictureBox.Location = new Point((int)currentPosition.X, (int)currentPosition.Y);
}

Ах да, забыл добавить. На всякий случай - всё делаю в Винформс, так как лично мне именно здесь видится чистый C#. Предполагаю, что ошибка совсем детская, но вот блин не могу понять, где она.

Спасибо!
  • Вопрос задан
  • 71 просмотр
Подписаться 2 Простой 3 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия C#-разработчик
    12 месяцев
    Далее
  • Merion Academy
    C# разработчик с нуля
    4 месяца
    Далее
  • Stepik
    PRO C#. Профессия "Backend разработчик"
    4 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если у вас currentPosition определена как Point из System.Drawing, то currentPosition.X и currentPosition.Y - целочисленные.
Как по вашему, что будет, если moveStepX или moveStepY меньше единицы?
А просто в операциях
currentPosition.X += moveStepX;
currentPosition.Y += moveStepY;

соответствующая координата не изменится вообще.
Так что определяйте свою структуру с вещественными X и Y или придумывайте другой алгоритм движения.
Ответ написан
Комментировать
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
float moveStepX = unitX * Speed;
float moveStepY = unitY * Speed;

Пальцем в потолок: скорость по обеим осям одинаковая при движении под углом в 45 градусов, а вот для всех остальных углов она будет различаться.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы