Движение точки по линии |
Движение точки по линии |
pashist |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
Привет=) Есть линия, начало которой привязано к центру координат(х1, у1=320, 240), направленная под произвольным углом α. Нужно, чтобы черная точка прошла по всей белой линии, не выходя за её пределы толщины. Толщина точки равна толщине линии. Как это реализовать?
|
klem4 |
Сообщение
#2
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Из заданных 2-х точек прямой (центр и (x1, y1)) получаешь уравнения прямой - F(x).
Ну а далее все просто, в цикле по Х от Х(центра) до X1 выводи точку с координатами (x, F(x)); -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
pashist |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
А можно код?
|
volvo |
Сообщение
#4
|
Гость |
Цитата Из заданных 2-х точек прямой (центр и (x1, y1)) получаешь уравнения прямой - F(x). А я бы перешел в полярную систему координат... И не надо заморочек с функциями, просто увеличивать расстояние от центра до точки при заданном угле |
klem4 |
Сообщение
#5
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Можно и так
В общем вот набросок. Для наглядности отрисовывается маленькая окружность вместо точки. И через некоторый промежуток. uses Crt, Graph; -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
pashist |
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
Написал, но работает только в частном случае..( По-моему, неправильно высчитывается F(x):
Uses Graph,Crt; Нужно, чтобы система координат начиналась в центре экрана (320, 240). |
klem4 |
Сообщение
#7
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Уравнени у меня рассчитано для прямой проходящей через точки с координатами [(0, 0) ; (320, 240)] так я понял надо по заданию. Если тебе нужа универсальная программа, поищи по форуму или сам выведи как получить уравнение прямой заданной по двум точка [(x1, y1); (x2, y2)]
Вот формула : (x - x1) / (x2 - x1) = (y - y1) / (y2 - y1) -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Бродяжник |
Сообщение
#8
|
Бывалый Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
Может я чего не понимаю, но
Цитата Нужно, чтобы черная точка прошла по всей белой линии, не выходя за её пределы толщины. Так? Если рассматривать эту задачу не геометрически, а в приложении к растру монитора, то ведь у нас может быть не одна точка с координатой Х = Xi, а несколько (если прямая наклонена под углом более 45 градусов). Поэтому простой цикл по Х с вычислением Y=f(X) не проходит. Лучше использовать алгоритм Брезенхама и для вычерчивания самой линии и для последующего скольжения точки. |
Гость |
Сообщение
#9
|
Гость |
Если так, то можно допустить некоторое отклонение от линии
|
pashist |
Сообщение
#10
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
Цитата Вот формула : (x - x1) / (x2 - x1) = (y - y1) / (y2 - y1) uses graph,crt; Почему F(x) все время выдает одно и то же значение? |
volvo |
Сообщение
#11
|
Гость |
Ну, наверное, потому, что функция написана неправильно?
function F(x: Integer): integer; Почему ты делил на (y2 - y1), когда нужно умножать? |
pashist |
Сообщение
#12
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
Уряяяя!!!!! Спасибо!
|
pashist |
Сообщение
#13
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
Кадр 11 дубль 2.. Почему функция работает некорректно? Если задать в констнтах x2=639, y2=479, то точка во время движения на полпути резко смещается по y примерно на 100 пикселей вверх! В чем дело?
Сообщение отредактировано: pashist - |
volvo |
Сообщение
#14
|
Гость |
Смотря, что ты еще изменял. У меня, например, выдает вот такие значения:
340 255 (первый столбец - X, второй - Y)... Как видишь, никакого скачка. P.S. Отставить мой предыдущий пост. Он просто еще раз показывает преимущество 32-битных компиляторов. У тебя по ходу вычисления происходит переполнение. Промежуточный результат не помещается в Integer, и как результат - усечение... Вот патч: function F(x: Integer): integer; |
pashist |
Сообщение
#15
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
Еще вопрос, в тему. Есть прямая, которая крутится, начало которой закреплено в центре экрана: x1=320, y1=240. Длина прямой-20. Как найти координаты x2, y2, которые являются продолжением этой прямой до границы экрана? Нужно получить уравнение этой прямой.
|
klem4 |
Сообщение
#16
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Цитата прямая, которая крутится Ты имеешь в виду, второй конец прямой движется по окружности ? -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
pashist |
Сообщение
#17
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
Цитата Ты имеешь в виду, второй конец прямой движется по окружности ? Да. Управление с клавиатуры. |
klem4 |
Сообщение
#18
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Ну тогда соклько раз можно повторять одно и тоже.
Поиск -> "Движение окружности", "Маятник" , "Система маятников" -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
pashist |
Сообщение
#19
|
Новичок Группа: Пользователи Сообщений: 44 Пол: Мужской Репутация: 0 |
Нет, смысл не в этом. Дописываю курсовик, там в центре экрана стоит охотник и стреляет в мышек. Когда охотник правильно прицелился на мышку, тогда понятно, в какую конечную точку летит пуля-в точку координаты мышки. А если он прицелен неправильно? Куда тогда должна лететь пуля? Ружьё охотника-это прямая, которая движется по окружности, и координаты для функции рисования прямой есть: x1,y1,x2,y2, где x1,y1=320,240. То бишь нужно найти продолжение этой прямой до границы экрана, найти ту точку на границе экрана, в которую должна лететь пуля (по траектории прямой) при промахе охотника.
|
volvo |
Сообщение
#20
|
Гость |
Я тебе предлагал перейти в полярную систему координат, в которой этой проблемы вообще не возникло бы? Предлагал. Ты не захотел? Не захотел...
Вот и сиди, мучайся... |
Текстовая версия | 24.12.2024 1:04 |