Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Kot_Enot
 Аватар для Kot_Enot
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 33
26.02.2012, 17:42     пересечение фигур #1
Привет всем!
Как определить пересечение двух фигур: квадрата и триугольника? Квадрат задается координатами левого верхнего угла и нижнего правого, а триуголник задается координатами трёх вершин.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2012, 17:42     пересечение фигур
Посмотрите здесь:

C++ Пересечение фигур
C++ Массив-пересечение
Пересечение множеств C++
Задача на пересечение C++
Пересечение множеств C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Питекантроп
 Аватар для Питекантроп
246 / 140 / 6
Регистрация: 14.06.2010
Сообщений: 340
26.02.2012, 18:54     пересечение фигур #2
нужно отследить только факт пересечения или узнать место пересечения?
Kot_Enot
 Аватар для Kot_Enot
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 33
26.02.2012, 19:25  [ТС]     пересечение фигур #3
факт пересечения
Питекантроп
 Аватар для Питекантроп
246 / 140 / 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;
}
Yandex
Объявления
26.02.2012, 21:09     пересечение фигур
Ответ Создать тему
Опции темы

Текущее время: 11:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru