Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
16 / 9 / 7
Регистрация: 16.09.2013
Сообщений: 41

Движение вектора на плоскости

02.12.2021, 08:12. Показов 2007. Ответов 0

Студворк — интернет-сервис помощи студентам
Господа, столкнулся со следующей задачей, очень нужна помощь, уже который день ищу проблему.

Мой скрипт на Python подключается к визуалке, где мне нужно перемещать объект, пока просто на плоскости. Очевидно, что для этого я использую AB вектор. К сожалению, в линейной алгебре не силён, но вроде как нужные формулы нашёл.

Представим себе следующую простую задачу в цикле:

1. Двигаем вектор вперёд на 0.1 (движение у объекта постоянное)
2. Нормализуем вектор, т.к. он увеличился после движения.
2. Поворачиваем его (вектор) на 1 градус.

Т.е. получаем такое вот круговое движение. На данный момент имею следующие 3 функции под движение, нормализацию и поворот:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from math import sin, cos, sqrt, pow, radians
 
def forward(v: list, distance: float = 0.1) -> list:
    vector_direction = [v[1][0] - v[0][0], v[1][1] - v[0][1]]
    cos_dir = vector_direction[0] / sqrt(pow(vector_direction[0], 2) + pow(vector_direction[1], 2))
    sin_dir = vector_direction[1] / sqrt(pow(vector_direction[1], 2) + pow(vector_direction[1], 2))
    new_x, new_y = (distance * cos_dir) + v[1][0], (distance * sin_dir) + v[1][1]
 
    return [v[0], [new_x, new_y]]
 
 
def normalization(v: list) -> list:
    len_vec = sqrt((v[1][0] - v[0][0]) ** 2 + (v[1][1] - v[0][1]) ** 2)
    kv = (len_vec - 1) / len_vec
    return [[v[0][0] + (v[1][0] - v[0][0]) * kv, v[0][1] + (v[1][1] - v[0][1]) * kv], v[1]]
 
 
def turn(v: list, direction: bool) -> list:
    ONE_GRAD = -radians(1) if direction else radians(1)
 
    new_x = -sin(ONE_GRAD) * (v[1][1] - v[0][1]) + cos(ONE_GRAD) * (v[1][0] - v[0][0]) + v[0][0]
    new_y = cos(ONE_GRAD) * (v[1][1] - v[0][1]) + sin(ONE_GRAD) * (v[1][0] - v[0][0]) + v[0][1]
 
    return [v[0], [new_x, new_y]]
Далее пробую всё это дело тестировать, например вот так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from matplotlib import pyplot as plt
from vector_displacement import normalization, forward, turn
 
START = 0
 
vector = [[START, START], [15, 15]]
 
fig = plt.figure(figsize=(6, 6))
ax = plt.axes(xlim=(0, 40), ylim=(0, 40))
 
 
def draw_vectors(vector_a: list):
    # plt.plot([vector_a[0][0], vector_a[1][0]], [vector_a[0][1], vector_a[1][1]])
    ax.plot(vector_a[1][0], vector_a[1][1], "go", markersize=1)
 
 
for number in range(360):
    draw_vectors(vector)  # Отрисовка вектора на графике
    vector = forward(vector)  # Двигаем вперёд
    draw_vectors(vector)  # Отрисовка вектора на графике
    vector = normalization(vector)  # Нормализовали
    vector = turn(vector, False)  # Повернули
 
 
plt.savefig('./dir/graph{}.png'.format("result5"))
Т.е. должно получиться круговое движение. А получается по этому коду вот это:


В другую сторону и с векторами разных знаков получается примерно то же самое. Т.е. в какой то момент он перестаёт поворачиваться:


Экспериментов за это время была масса, и со специалистом по линейной алгебре я тоже консультировался, но его расчёты на первый цикл полностью совпали с моими. Думаю, может где-то глупая ошибка затесалась, которую не вижу. В районе 30 градусов он поворачивать не хочет. По сути наблюдаю в логах постоянное уменьшение угла поворота, вплоть до мизерных значений, что приводит к остановке.

Поворот без движения и нормализации - работает:


Движение с поворотом без нормализации - тоже работает:


Если нормализовать и поворачивать, но без движения - аналогично всё работает:


Буду благодарен за любую помощь и подсказку.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.12.2021, 08:12
Ответы с готовыми решениями:

Вектор на плоскости: координаты вектора на плоскости (x1, y1, x2, y2). Вычислить координаты середины вектора. Равен ли у
Создать класс с полями, Реализовать в классе методы: - конструктор по умолчанию; - деструктор для освобождения памяти (с сообщением...

Создать класс Вектор на плоскости (поля-координаты начала и конца вектора).Реализовать для него методы:конструктор,вычисление координат самого вектора
Создать класс Вектор на плоскости (поля-координаты начала и конца вектора).Реализовать для него методы:конструктор,вычисление координат...

Найти координаты точки плоскости в системе координат A, вектора AB, вектора AC, если известны ее координаты
В треугольнике ABC точка D лежит на стороне BC, а точка E лежит на продолжении стороны AC за точку C, причем |BD|:|DC|=1/2, |AC|:|CE|=3/1 ....

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2021, 08:12
Помогаю со студенческими работами здесь

Движение по определенной плоскости
Нужен C# или JS скрипит, при котором будет появляться объект . Есть всего три полосы. И надо, чтобы рандомно появлялся на одной из них...

Движение по плоскости с ускорением
Всем привет! Есть следующая задача: дана плоскость (ограниченная прямоугольником), положение объекта и его начальная скорость. Нам нужно,...

Движение по наклонной плоскости
Здравствуйте, дорогие форумчане. Хотел попросить вас помочь мне с заданием "Разработать программу, демонстрирующую движение тела по...

Движение на координатной плоскости
допустим я знаю чему равен косинус от 0 до 180 (я просто таблицу в объект перефаршировал) вот код обрабатывающий это движение, сразу...

Движение точки в замкнутой плоскости.
Христа ради поможите бедному студенту! Задание курсовой: Описать движение точки в замкнутой произвольной плоскости... Я даже ни знаю с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru