Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 21.12.2018
Сообщений: 6

Столкновение повернутого объекта

08.05.2019, 18:52. Показов 1203. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В image находится битмап, поворачивающийся на произвольный угол. Как проверить пересечение непрозрачной части битмапа с рандомно расположенными вертикальными/горизонтальными линиями черного цвета? (На image черные только эти линии)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2019, 18:52
Ответы с готовыми решениями:

Столкновение объектов
Нужна помощь по столкновению. Нашол код столкновения в инете, и вставил в свой код. Столкновение работает как бы, но если два препядствия...

Столкновение объекта и стены
Есть куб, к которому привязано управление с клавиатуры, есть стена. Как правильно прописать управление кубу, чтоб при столкновении со...

Реализовать столкновение объекта с преградой
делаю программу, в которой движется объект по произвольной траектории и сделал ему так бы сказать "преграду" ...

4
place status here
 Аватар для gunslinger
3187 / 2221 / 640
Регистрация: 20.07.2013
Сообщений: 6,017
09.05.2019, 01:03
С помощью формул из школьной геометрии (например, нахождение координат точки пересечения линии с окружностью в зависимости от угла наклона линии, проходящей из центра окружности).
Вычисляешь расстояние до края повернутого битмапа и сравниваешь со значениями координат линий.
Нужен более полный ответ - предоставь более полное описание задачи (желательно с кодом, если он имеется).
0
0 / 0 / 0
Регистрация: 21.12.2018
Сообщений: 6
10.05.2019, 12:24  [ТС]
Тестовая версия:
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Graphics::TBitmap *basnya;
Graphics::TBitmap *korpys;
TRect rect;
int x=20, y=20; // Начальные координаты
int ygl=0, ygl2=0; // Углы поворота
int s1=2, s2=3; // Скорости поворота
Image1->Canvas->MoveTo(10, 200);
Image1->Canvas->LineTo(300,200);
// Линия для примера, их много и их координаты неизвестны,
// но на image чёрными будут только они
// image1 - невидимый, на нём хранится фон 
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
x+=1;
y+=1;
Image2->Picture=Image1->Picture; // Заменяем картинку на видимом image на фон
SetViewportOrgEx( Image2->Canvas->Handle, x+20, y+20, NULL ); 
// Перемещаем начало координат в точку центра будущего места битмапа
RotateDC( Image2->Canvas->Handle, ygl); // Поворачиваем координатную плоскость
Image2->Canvas->StretchDraw(Rect(-20,-20,20,20),korpys); // Рисуем корпус
//Возвращаем координатную плоскость в исходное положение 
SetViewportOrgEx( Image2->Canvas->Handle, 0, 0, NULL ); 
RotateDC( Image2->Canvas->Handle, 0);
// С башней аналогично
SetViewportOrgEx( Image2->Canvas->Handle, x+20, y+20, NULL );
RotateDC( Image2->Canvas->Handle, -ygl2+ygl);
Image2->Canvas->StretchDraw(Rect(-20,-20,20,20),basnya);
SetViewportOrgEx( Image2->Canvas->Handle, 0, 0, NULL );
RotateDC( Image2->Canvas->Handle, 0);
// Увеличиваем угол поворота
ygl+=s1;
ygl2+=s2;
}
//------------------------------------------------------------
// Функция поворота, писал не я
void TForm1::RotateDC( HANDLE dc, float angle )
{
    XFORM xform;
 
    angle = angle * 3.1416 / 180.0;
    xform.eDx = 0.0f;
    xform.eDy = 0.0f;
    xform.eM11 = cos( angle );
    xform.eM12 = sin( angle );
    xform.eM21 = -sin( angle );
    xform.eM22 = cos( angle );
 
    SetGraphicsMode(dc, GM_ADVANCED );
    SetWorldTransform(dc, &xform );
}
И теперь вопрос: как проверить столкновение танчика с линией?
0
0 / 0 / 0
Регистрация: 21.12.2018
Сообщений: 6
10.05.2019, 12:31  [ТС]
P.S: Как понимаю, нужно получить рамки объекта и проверить их на наличие (столкновение) черного пикселя?
0
place status here
 Аватар для gunslinger
3187 / 2221 / 640
Регистрация: 20.07.2013
Сообщений: 6,017
10.05.2019, 18:04
Да, примерно так.
Зная размеры битмапа, вычисляешь по теореме Пифагора радиус R описанной вокруг объекта окружности. Далее через sin (a) * R и cos (a) * R, где a - угол поворота объекта, находишь размеры "рамки". Учитываешь координаты (центра) объекта и сравниваешь с положением линии.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2019, 18:04
Помогаю со студенческими работами здесь

Как сделать столкновение объекта с формой
Пожалуйста помогите мне со столкновением объекта с формой Добавлено через 38 минут Вот как я делаю столкновение (Верно это или нет?)...

Движение объекта, препятствия на экране, столкновение объектов
Всем привет! Нужно написать программу на Turbo Pascal 7. Задача Под управлением курсорных клавиш по полю движется объект, на поле...

Столкновение объекта с другим объектом. Его поведение
Доброго времени суток. Как сделать так, чтобы объект при соприкосновении с каким - то другим объектом (например с поверхностью, парящей в...

Как проверить столкновение объекта с другим объектом проверяя тег (я новичок)
Проблема такая. У меня есть шар и шип, при столкновении шара с шипом должно происходить какое либо событие. Но шип должен быть с...

Найти крайние точки (описать прямоугольник) повернутого эллипса
Всем привет! удалено] Есть эллипс, задан координатами центра, координатами крайней точки длинной оси и отношением длин осей. Но это не...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru