Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Kot_Enot
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 33
#1

пересечение фигур - C++

26.02.2012, 17:42. Просмотров 1960. Ответов 3
Метки нет (Все метки)

Привет всем!
Как определить пересечение двух фигур: квадрата и триугольника? Квадрат задается координатами левого верхнего угла и нижнего правого, а триуголник задается координатами трёх вершин.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2012, 17:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос пересечение фигур (C++):

Пересечение фигур - C++
Даны две фигуры: Окружность с центром в точке (x0,y0) и радиусом r, и пятиугольник заданный координатами вершин. Как можно определить факт...

Пересечение двух прямых и проверка на пересечение - C++
Доброго времени суток слизал функцию проверки отсюда:/segments_intersection_checking на всякий случай у меня она выглядит так: int...

Пересечение отрезков. - C++
Решал задачу на acmp про пересечение отрезков, завалился на 20 тесте. Долго просидел, решил прочитать комментарии. Объясните мне, если...

Пересечение треугольников - C++
Здравствуйте! Подскажите, пожалуйста, как узнать пересекается треугольник или нет с другими треугольниками. Вот данные: struct...

Пересечение множеств - C++
Вход — два множества натуральных чисел. Выход — их пересечение (перечисление элементов через пробел в любом порядке без повторений)...

Пересечение треугольников в 3d - C++
Вот например 2 треугольника: (для примера) struct Point { int X; int Y; int Z; };

3
Питекантроп
248 / 142 / 6
Регистрация: 14.06.2010
Сообщений: 340
26.02.2012, 18:54 #2
нужно отследить только факт пересечения или узнать место пересечения?
0
Kot_Enot
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 33
26.02.2012, 19:25  [ТС] #3
факт пересечения
0
Питекантроп
248 / 142 / 6
Регистрация: 14.06.2010
Сообщений: 340
26.02.2012, 21:09 #4
Вот. Это на основе того, что я тебе кидал в ином посте
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "math.h"
#include "windows.h"
#include "stdio.h"
 
struct fPoint
{
        float x,y;
        fPoint() {}
        fPoint(float x, float y)
        {
                this->x = x;
                this->y = y;
        }
};
 
static void rotate_points(float angle, fPoint * array, int arr_len)
{
        if (arr_len <= 1) return;
        float cs = cos(angle),
                sn = sin(angle);
        fPoint center(0,0);
        for (int i = 0; i < arr_len; i++)
        {
                center.x += array[i].x;
                center.y += array[i].y;
        }
        center.x /= arr_len;
        center.y /= arr_len;
 
        float dx, dy;
        while (arr_len--)
        {
                dx = array[arr_len].x - center.x;
                dy = array[arr_len].y - center.y;
                array[arr_len].x = dx * cs - sn * dy + center.x;
                array[arr_len].y = dx * sn + cs * dy + center.y;
        }
}
 
static void DrawFigure(HDC hdc, fPoint * array, int len)
{
        MoveToEx(hdc,array->x,array->y,0);
        while (len--) LineTo(hdc,array[len].x,array[len].y);
}
 
static bool IsIntersect(fPoint * array_1, int len_1, fPoint * array_2, int len_2)
{
#define vectP_z(v,a,b) (((v).x-(a).x)*((v).y-(b).y)-((v).y-(a).y)*((v).x-(b).x))
        int i,j,next_i,next_j;
        for (int i = 0; i < len_1; i++)
        {
                next_i = i == len_1 - 1 ? 0 : i + 1;
                for (j = 0; j < len_2; j++)
                {
                        next_j = j == len_2 - 1 ? 0 : j + 1;
                        if ( vectP_z(array_1[next_i],array_1[i],array_2[j]) *
                                vectP_z(array_1[next_i],array_1[i],array_2[next_j]) < 0 &&
                        vectP_z(array_2[next_j],array_2[j],array_1[i]) *
                                vectP_z(array_2[next_j],array_2[j],array_1[next_i]) < 0) return true;
                }
        }
        bool a = vectP_z(array_2[0],array_2[len_2 - 1],array_1[0]) < 0;
        for (j = 1; j < len_2; j++)
                if (a != vectP_z(array_2[j],array_2[j - 1],array_1[0]) < 0) break;
        if (j == len_2) return true;
 
        a = vectP_z(array_1[0],array_1[len_1 - 1],array_2[0]) < 0;
        for (i = 1; i < len_1; i++)
                if (a != vectP_z(array_1[i],array_1[i - 1],array_2[0]) < 0) break;
        return i == len_1;
}
 
class Triangle
{
public:
        fPoint points[3];
        Triangle() {}
        Triangle(const fPoint & p1,const fPoint & p2,const fPoint & p3)
        {
                points[0] = p1;
                points[1] = p2;
                points[2] = p3;
        }
        void rotate(float angle)
        {
                rotate_points(angle,points,3);
        }
        void Draw(HDC hdc)
        {
                DrawFigure(hdc,points,3);
        }
};
 
 
 
 
int main(int argc, char* argv[])
{
        Triangle tr(fPoint(50,50),fPoint(150,50),fPoint(75,120) );
 
      //  Triangle tr1(fPoint(60,60),fPoint(120,60),fPoint(75,100) );
      //  Triangle tr1(fPoint(160,60),fPoint(220,60),fPoint(175,100) );
        Triangle tr1(fPoint(100,60),fPoint(220,60),fPoint(175,100) );
 
        HWND hwnd = GetForegroundWindow();//GetDesktopWindow();
 
        HDC hdc=GetWindowDC(hwnd);
        HPEN hPen = CreatePen(1, 3, RGB(0,0,255));
 
        SelectObject(hdc, hPen);
        tr.Draw(hdc);
        tr1.Draw(hdc);
        ReleaseDC(hwnd,hdc);
        printf(IsIntersect(tr.points,3,tr1.points,3) ? "yes" : "no" );
        getchar();
        return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2012, 21:09
Привет! Вот еще темы с ответами:

Задача на пересечение - C++
Всем доброго вечера. Помогите пожалуйста решить задачу. Я не могу понять саму структуру как должно быть.

Массив-пересечение - C++
Помогите, пожалуйста, с заданием: Дано два целочисленных массива, состоящих из не повторяющихся чисел. Сформировать новый массив, который...

Пересечение множеств - C++
Есть такое задание: Создать класс- множество. Функции-члены реализуют добавление и удаление элемента, пересечение и размность множеств. ...

пересечение множеств - C++
найти пересечение мнжества А и В. Результат вывести в другом множестве. заранее спс. извиняюсь если такое задание уже было


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru