Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127

Пересекаются ли две фигуры, или нет?

19.12.2015, 17:27. Показов 4575. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дана абстрактный класс Shape и производных от него классы (Point, Triangle, Circle...). Надо написать функцию которая принимает две фигуры( Shape*), и выяснить пересекаются ли они, или нет?. Например сначала пишу эту функцию для класса Point(находится ли точка в фигуре, или нет?). Ну если второй аргумент будет круг, все ясно будет(если расстояние от центра круга до этой точки больше чем радиус круга, то ответ нет, если меньше то ответ да), или если вторая фигура будет треугольник, то тоже понятно, но как определить для общего случая?
C++
1
2
3
bool Point::intersect(Shape* P, Shape* S) {
    P=this; //??
    S->     //??
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
52
53
54
55
#include <iostream>
#include <math.h>
class Shape {
public:
    virtual void print()=0;
    virtual double area()=0;
    virtual Shape* move(int, int)=0;
    virtual bool intersect(Shape*, Shape*);
    virtual~ Shape() {}
};
class Point :public Shape {
public:
    double x;
    double y;
    Point(double X=0, double Y=0) {x=X; y=Y;}
    double get_xP()const {return x;}
    double get_yP()const {return y; }
    double area() { return 0;}
    friend double distance(Point , Point );
    bool intersect(Shape*, Shape*);
    Point* move(int x1, int y1) {x=x1; y=y1; return this;}
    void print() {std::cout<<"Print point : ("<<x<<","<<y<<")\n";}
};
double distance(Point a, Point b) { 
    double x=abs(b.get_yP()-a.get_yP()); 
    double y=abs(b.get_xP()-a.get_xP()); 
    return sqrt(x*x+y*y);
}
bool Point::intersect(Shape* P, Shape* S) {
    P=this;
    S->
class Triangle : public Shape {
    Point a;
    Point b;
    Point c;
public:
    Triangle () : a(0), b(0), c(0) {}
    Triangle (Point a1, Point b1, Point c1) : a(a1), b(b1), c(c1) {}
    Triangle(const Triangle&);
    double area();
    Triangle* move(int, int) {return this;}
    void print() {std::cout<<"Print Triangle : ";a.print(); b.print(); c.print(); }
};
Triangle::Triangle(const Triangle& T) {
 
    a=T.a;
    b=T.b;
    c=T.c;
}
double Triangle::area() {
 
    double p= (distance(b,a)+distance(c,a)+distance(c,b))/2;
    double s=sqrt(p*(p-distance(b,a))*(p-distance(b,c))*(p-distance(c,a)));
    return s;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2015, 17:27
Ответы с готовыми решениями:

ООП: принять две фигуры Shape*, и проверить, пересекаются ли они
Вот задания но я просто 0 в С ++, только начал изучать, может кто знает как? 1. При наличии класса Circle (круг) Square (квадрат) і...

ООП: принять две фигуры Shape*, и проверить, пересекаются ли они
Вот задания: 1. При наличии класса Circle (круг) Square (квадрат) і Triangle(треугольник) походный от Shape (фигура) определить функцию...

Определить пересекаются две прямые, параллельны или совпадают.Две прямые заданы уравнениями: ax+by+c=0, px+qy+r=0
Определить пересекаются две прямые, параллельны или совпадают. Две прямые заданы уравнениями: ax+by+c=0, px+qy+r=0

8
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
19.12.2015, 18:03
нужно перегрузить функции, потому что для каждой фигуры своя формула.
0
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127
19.12.2015, 18:42  [ТС]
_Valera_, , _Valera_, Не позволяет. Не понимаю, вот так например?
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
#include <iostream>
#include <math.h>
class Shape {
public:
    virtual void print()=0;
    virtual double area()=0;
    virtual Shape* move(int, int)=0;
    virtual bool intersect(Shape*, Shape*)=0;
    virtual~ Shape() {}
};
class Point :public Shape {
public:
    double x;
    double y;
    Point(double X=0, double Y=0) {x=X; y=Y;}
    double get_xP()const {return x;}
    double get_yP()const {return y; }
    double area() { return 0;}
    bool intersect(Point*, Triangle*); // ??
    bool intersect(Point*, Circle*); //??
    friend double distance(Point , Point );
    Point* move(int x1, int y1) {x=x1; y=y1; return this;}
    void print() {std::cout<<"Print point : ("<<x<<","<<y<<")\n";}
};
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
19.12.2015, 18:44
Цитата Сообщение от DavidTs Посмотреть сообщение
но как определить для общего случая?
Никак. Для разных фигур будут разные вычисления. Может помочь двойная диспетчеризация.
0
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127
19.12.2015, 19:15  [ТС]
Croessmah, А как это реализовать?

Добавлено через 27 минут
Кто нибудь может помочь?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.12.2015, 19:41
Цитата Сообщение от DavidTs Посмотреть сообщение
А как это реализовать?
http://rextester.com/BHLUE2255

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
#include <boost/variant.hpp>
 
#include <iostream>
using namespace std;
 
 
// допустим, это наши какие то фигуры
struct line {};
struct arc {};
 
 
// тогда механизм выявления их пересечений будет:    
struct intersects_algo : boost::static_visitor<bool> {
    bool operator()( const line& l1, const line& l2 ) const {
        cout<<"line vs line\n"; return true;
    }
 
    bool operator()( const arc& a1, const arc& a2 ) const {
        cout<<"arc vs arc\n"; return true;
    }
 
    bool operator()( const line& l, const arc& a ) const {
        cout<<"line vs arc\n"; return true;
    }
    bool operator()( const arc& a, const line& l ) const {
        return this->operator()( l, a );
    }
};
 
 
// порождаем вариативный тип данных
// который умеет наши фигуры
using element = boost::variant<line, arc>;
 
bool intersects( const element& e1, const element& e2 ) {
    return boost::apply_visitor(intersects_algo(), e1, e2 );
}
 
 
 
// пример использования:
int main() {
 
    element e1 = line{};
    element e2 = arc{};
 
    bool result = intersects(e1, e2);
}
так же можете глянуть:
Как узнать, какого типа объект находится по указателю
0
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127
19.12.2015, 19:55  [ТС]
hoggy, Спасибо, но с boost совсем не знаком, а есть ли простой метод, чтобы в этой
Цитата Сообщение от DavidTs Посмотреть сообщение
bool intersect(Shape*, Shape*);
функции узнать конкретный тип второго аргумента shape*?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.12.2015, 20:20
Лучший ответ Сообщение было отмечено DavidTs как решение

Решение

Цитата Сообщение от DavidTs Посмотреть сообщение
функции узнать конкретный тип второго аргумента shape*?

если совсем по тупому, можно сделать сравнительный анализ:

http://rextester.com/AUJXK56341

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//Title of this code
//g++  4.9.2
 
#include <iostream>
 
struct Shape
{
    virtual ~Shape(){}
    
    virtual bool intersect(const Shape&)const = 0;
    
};
 
struct Triangle;
struct Rect;
 
 
struct Triangle: Shape
{
    bool intersect(const Shape& obj)const;
};
 
struct Rect: Shape
{
    bool intersect(const Shape& obj)const;
};
 
bool Triangle::intersect(const Shape& obj)const 
{
    if( dynamic_cast<const Triangle*>(&obj))
        std::cout<<"triange vs triange\n";
    else if (dynamic_cast<const Rect*>(&obj))
        std::cout<<"triange vs rect\n";
    else
        std::cout<<"triange vs unkown\n";
    return true;
}
 
bool Rect::intersect(const Shape& obj)const 
{
    if( dynamic_cast<const Triangle*>(&obj))
        std::cout<<"rect vs triange\n";
    else if (dynamic_cast<const Rect*>(&obj))
        std::cout<<"rect vs rect\n";
    else
        std::cout<<"rect vs unkown\n";
    return true;
}
 
 
 
 
void intersect(const Shape& obj1, const Shape& obj2)
{
    obj1.intersect(obj2);
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    Rect rect;
    Triangle triangle;
    
    intersect(rect, triangle);
    
}
0
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127
19.12.2015, 20:28  [ТС]
hoggy, Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2015, 20:28
Помогаю со студенческими работами здесь

Определить пересекаются две прямые, параллельны или совпадают
Две прямые заданы уравнениями: ax+by+c=0, px+qy+r=0

Определить пересекаются две прямые, параллельны или совпадают
прямые заданы уравнениями: ax+by+c=0, px+qy+r=0 Добавлено через 8 минут вроде сделал но не знаю как сделать так, что окно не...

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

Написать программу, проверяющую, пересекаются ли окружность и прямая, или они касаются друг друга, или не пересекаются и не касаются
Заданы окружность радиуса R с центром в начале координат и прямая, проходящая через точки А (х; у) и В (х; - у). Написать программу,...

Пересекаются ли отрезки [A,B] и [C,D], где A,B,C,D – координаты отрезков на числовой оси (ответ- да или нет)
Написать функцию, организовать ее вызов в главной функции программы. Используя перегрузку, осуществите ее работу с целыми и вещественными...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru