Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2008, 08:44   #1
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
Вопрос Столкновение тел

В общем то мне нужно узнать момент столкновения тел не квадратной формы. Эти объекты представлены допустем как Image со свойством transporent:=true; Ну или как то иначе, но это плоские двумерные изображения. Вот они летят друг на друга, причем могут подлететь с любой стороны и мне нужно зафиксировать тот момент когда они сталкиваются и выполнить кекоторый код.... Так думаю наверное надо обращаться к пикселям?
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 06.12.2008, 10:55   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Как вариант - создать регионы по контуру и проверять пересечение регионов.
alexBlack вне форума Ответить с цитированием
Старый 08.12.2008, 09:04   #3
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

не могли бы по подробнее? хотя бы маленький наглядный пример где ударяются два круглых тела?
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 08.12.2008, 11:07   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Пример столкновения двух окружностей.

Код:
    public partial class Form1 : Form
    {
        // Центры окружностей
        private Point p1 = new Point(100, 100);
        private Point p2 = new Point(200, 200);

        // Радиусы окружностей
        private int r1 = 50;
        private int r2 = 50;

        Region or1;
        Region or2;

        public Form1()
        {
            GraphicsPath p = new GraphicsPath();
            p.AddEllipse(p1.X, p1.Y, r1 * 2, r1 * 2);
            or1 = new Region(p);

            p = new GraphicsPath();
            p.AddEllipse(p2.X, p2.Y, r2 * 2, r2 * 2);
            or2 = new Region(p);

            DoubleBuffered = true;
            InitializeComponent();
        }

        // Скорости окружностей (пикселей в секунду)
        private double v1 = 50;                      
        private double v2 = 50;                      

        // Вектора скоростей (угол относительно оси x)
        private double a1 = 0;
        private double a2 = Math.PI/2;

        private void timer1_Tick(object sender, EventArgs e)
        {
            // Вызывается 10 раз в секунду
            // Перемещение объектов 
            int dx = (int)(v1 / 10 * Math.Cos(a1));
            int dy = -(int)(v1 / 10 * Math.Sin(a1));
            or1.Translate(dx, dy);
            p1.X += dx; p1.Y += dy;

            dx = (int)(v2 / 10 * Math.Cos(a2));
            dy = -(int)(v2 / 10 * Math.Sin(a2));
            or2.Translate(dx, dy);
            p2.X += dx; p2.Y += dy;

            // Проверка столкновения 
            Region t = or1.Clone();
            t.Intersect(or2);
            Graphics g = Graphics.FromHwnd(this.Handle);
            label1.Text = t.IsEmpty(g).ToString();
            if (!t.IsEmpty(g))
            {
                // Есть пересечение 
                // Меняем направление и скорости 
                // В общем случае нужно будет делать расчет
                // Здесь просто установим уже известные значения: 
                v1 = 50;
                v2 = 50;
                a1 = Math.PI / 2;
                a2 = 0;
            }

            // Отображение объектов 
            this.Refresh();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            
            g.FillEllipse(Brushes.Blue, p1.X, p1.Y, r1 * 2, r1 * 2);
            g.FillEllipse(Brushes.Blue, p2.X, p2.Y, r2 * 2, r2 * 2);
        }
    }
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Столкновение объектов [Smarik] Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 27.09.2008 16:54
Столкновение двух Манжосов Денис :) Помощь студентам 13 10.09.2008 22:01
Как пометить в форме номера тел. так что бы..... beliy-dis Microsoft Office Access 3 08.07.2008 23:11
СТолкновение обектов ZhekON Общие вопросы Delphi 3 19.04.2008 21:25