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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2011, 21:51   #1
Tomogochi
Пользователь
 
Аватар для Tomogochi
 
Регистрация: 08.06.2009
Сообщений: 15
По умолчанию C#.Определить функцию, которая выясняет, пересекаются ли две фигуры

Добрый день! Нужна помощь с написанием программы на С#. Честно говоря, задание поставило меня в тупик...

Пусть есть классы Circle (окружность), Square (квадрат) и Triangle (треугольник), производные от класса Shape. Определите функцию intersect() с двумя параметрами типа Shape, которая вызывает подходящую функцию, чтобы выяснить, пересекаются ли заданные две фигуры. Для этого в указанных классах нужно определить соответствующие виртуальные функции.

Кто-то может помочь?
Tomogochi вне форума Ответить с цитированием
Старый 21.06.2011, 09:08   #2
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

А не проще ли в классе Shape определить функцию, которая сравнивает пересечение двух фигур, чтобы в каждом подклассен этим не заниматься.
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.
KobolD вне форума Ответить с цитированием
Старый 21.06.2011, 10:06   #3
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Я понял это задание так, но считаю что такая реализация мягко говоря не фонтан.
Класс Triangle я создавать не стал, он делается по образу и подобию двух предыдщих.
Инкапсулюцию я тоже делать не стал, т.к. лень
Код:
    abstract class Shape //Запрет на создание объекта класса Shape
    {
        public string Name;//Имя фигуры
        public Shape(string name)//Конструктор класса
        {
            this.Name = name;
        }
        protected virtual bool intersect(Shape shape1, Shape shape2)//Виртуальная функция которая определяет пересечение двх фигур
        {
            if (shape1 is Circle)
            {
                if (shape2 is Circle)
                    if (true) //суда вписапть условие для пересечения двух окружностей
                        return true;
                    else
                        return false;
                if (shape2 is Square)
                    if (true) //суда вписапть условие для пересечения окружности и квадрата
                        return true;
                    else
                        return false;
            }
                if (shape1 is Square)
                    ////// Сдесь все условия для квадрата.
                    return true;
                return false;
            
          
        }
    }
    sealed class Circle:Shape//Создание класса наследника, запрещаем дальнейшее наследование
    {
        public double X;//
        public double Y;//координаты центра
        public double R;//радиус
        public Circle(string name, double x, double y, double r)//Конструктор класса
            :base(name)
        {
            this.X = x;
            this.Y = y;
            this.R = r;
        }
        public override bool intersect(Shape shape1)//переопределяем метод базового класса.
        {
            return base.intersect(new Circle("", X, Y, R), shape1);
        }

    }
    sealed class Square : Shape
    {
        public double X1;
        public double Y1;
        public double X2;
        public double Y2;
        public Square(string name, double x1, double y1, double x2, double y2)
            : base(name)
        {
            this.X1 = x1;
            this.Y1 = y1;
            this.X2 = x2;
            this.Y2 = y2;
        }
        public override bool intersect(Shape shape1)
        {
            return base.intersect(new Square("", X1, Y1, X2, Y2), shape1);
        }

    }
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.
KobolD вне форума Ответить с цитированием
Старый 21.06.2011, 10:47   #4
Tomogochi
Пользователь
 
Аватар для Tomogochi
 
Регистрация: 08.06.2009
Сообщений: 15
По умолчанию

KobolD, спасибо за код. Буду разбираться.
В голову пришли только условия для пересечения двух окружностей - они очевидны. А вот пересечение квадрата и окружности-это проблематично что-то...
Спасибо!
Tomogochi вне форума Ответить с цитированием
Старый 21.06.2011, 12:41   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

размышления вслух
для квадрата есть:
- вписанная окружность;
- описанная окружность;
- четыре стороны (отрезка).
P.S.большинство фигур есть комбинация дуг (окружностей) и отрезков.

пересечение окружности и прямой.
пересечение окружности и отрезка
Отрезок есть часть прямой ограниченная с двух сторон.
взаимное расположение отрезка и окружности.
взаимное расположение отрезка и центра окружности.
взаимное расположение отрезка и перпендикуляра к данному отрезку (прямой содержащей данный отрезок) опущенному из точки (центра окружности).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.06.2011 в 12:47.
evg_m вне форума Ответить с цитированием
Старый 21.06.2011, 14:17   #6
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Tomogochi Посмотреть сообщение
А вот пересечение квадрата и окружности-это проблематично что-то...
Ну тут все просто, вот критерий пересечения прямой и окружности вместе с алгоритмом http://www.e-maxx.ru/algo/circle_line_intersection.
Надо только дописать проверку на концы отрезка т.к. у тебя не прямая а отрезок.
Теперь засовываем в эту функцию твою окружность и каждый из отрезков (сторон) квадрата т.е. функция будет вызываться 4 раза. И если хоть раз функция вернет пересечение, то значит фигуры частично перекрываются, если нет, то надо проверить не лежит ли центр окружности внутри квадрата и если лежит то одна фигура полностью перекрывает другую.
С пересечением Окружности и Треугольника надо тоже самое сделать, только проверять уже три отрезка.

evg_m
Цитата:
.S.большинство фигур есть комбинация дуг (окружностей) и отрезков.
Поэтому по большому счету тебе надо написать три функции: Определение пересечения двух окружностей, пересечения окружности и отрезка, пересечение двух отрезков.
А все остальное это комбинация этих трех функций.
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.

Последний раз редактировалось KobolD; 21.06.2011 в 14:29.
KobolD вне форума Ответить с цитированием
Старый 27.09.2015, 12:48   #7
Beggginer
 
Регистрация: 08.07.2015
Сообщений: 7
По умолчанию

Добрый день, я вот тоже пишу подобную программу, не подскажете почему какой-то из шаров в момент передвижения начинает исчезать?
Предполагаю, что проблема с рефрешем, может можно их как то синхронизировать?
Код:
private void timer1_Tick(object sender, EventArgs e)
        {
            if (x1 < pictureBox1.Width)
            {
                x1+=2;
                pictureBox1.Refresh();
                g.DrawEllipse(Pens.Black, x1, 100, 50, 50);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            x1 = 0;
            timer1.Start();
            g = pictureBox1.CreateGraphics();
            V1 = Convert.ToInt32(textBox1.Text);
            timer1.Interval = V1;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            x2 = pictureBox1.Width;
            timer2.Start();
            g = pictureBox1.CreateGraphics();
            V2 = Convert.ToInt32(textBox2.Text);
            timer2.Interval = V2;
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            if (x2 > 0)
            {
                x2-=2;
                pictureBox1.Refresh();
                g.DrawEllipse(Pens.Black, x2 - 51, 100, 50, 50);
            }
        }

Последний раз редактировалось Stilet; 27.09.2015 в 12:53.
Beggginer вне форума Ответить с цитированием
Старый 27.09.2015, 12:54   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

У pictureBox1 есть событие Paint?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.09.2015, 12:56   #9
Beggginer
 
Регистрация: 08.07.2015
Сообщений: 7
По умолчанию

Ну я знаю такое событие, но я не знаю для чего оно, поэтому нет... Подскажите пожалуйста
Beggginer вне форума Ответить с цитированием
Старый 27.09.2015, 13:31   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Подсказать могу только так: https://msdn.microsoft.com/ru-ru/lib...vs.110%29.aspx
У меня нет в наличии студии, чтоб пример набросать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу, которая выводит на экран две секторные диаграммы Lexia_nick_otin Помощь студентам 3 10.11.2010 17:39
функцию которая меняет переменные местами kseshenka Помощь студентам 6 17.10.2010 23:09
Определить вид фигуры straiker9 Паскаль, Turbo Pascal, PascalABC.NET 1 07.04.2010 07:48
Можно ли вызвать функцию потока, которая не стоит в Execute? TwiX Общие вопросы Delphi 4 12.12.2009 22:29
Пересекаются ли фигуры? XeN0N Помощь студентам 10 21.01.2009 08:34