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

Пересечение отрезков. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка http://www.cyberforum.ru/cpp-beginners/thread337602.html
Всем привет! #include<iostream.h> #include<conio.h> #include<string.h> enum Shape{prizm,parallelepiped,cube,pyramid,cone,cylinder}; class Body {
C++ BMP в массив и обратно (на чистом С++) Надо загнать изображение BMP, допустим, 100x200 пикселей, в двухмерный массив 100x200 (то-есть 20 000 ячеек). Чтобы потом можно было изображение обратно вогнать в файл из массива. Как лучше всего это... http://www.cyberforum.ru/cpp-beginners/thread337596.html
работа с .jpg и .mp3 C++
скажите пожалуста какие стантартные(для visual C++ 2010 expres)библиотеки позваляют просматривать .jpg и проигрывать .mp3? з.ы. в гугл не посылать я там искал,по сайту тоже искал но не чё...
непонятная конструкция, шаблоны C++
столкнулся со странной конструкцией template<typename C> static One test(int C::*); в template<typename T> class IsClassT { private: typedef char One; typedef struct { char a; } Two;...
C++ Структура отрезок. http://www.cyberforum.ru/cpp-beginners/thread337576.html
Как сделать правильней и красивее на ваш взгляд - struct tPoint { int x, y; }; struct tSegment { tPoint pt1, pt2; };
C++ Аргументы функции Вопрос на счет аргументов функции в С++. есть такая функция: void Teleport(Player* pPlayer, float array) { int i = 0; pPlayer->TeleportTo(massive, massive, massive, massive,... подробнее

Показать сообщение отдельно
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
30.07.2011, 20:20  [ТС]
grizlik78, да, конечно - http://********/?main=task&id_task=348
Вот черт, - "вывести слово "Yes", если общая точка есть".
поэтому множество точек тоже пересечение, ведь общая точка есть

Добавлено через 21 минуту
ыы, ошибка на 34 тесте

вроде все варианты рисовал, проверял, должно быть правильно, я уже не понимаю.
буду думать еще, но если вдруг у кого время будет, поглядите код, мб найдете что я не учел.

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
#include <iostream>
#include <fstream>
#include <algorithm>
 
struct tPoint {
    int x, y;
};
 
struct tSegment {
    tPoint pt1, pt2;
};
 
bool findPt (const tSegment, const tSegment); // ищет общую точку двух отрезков.
bool oneLine (const tSegment, const tSegment); // лежат ли отрезки на одной прямой.
bool commonPart (const tSegment, const tSegment); // имеется ли общая часть у отрезков.
int side (const tSegment, const tPoint); // размещение точки относительно прямой.
int down (const int); // уменьшает число, сохраняя знак.
 
int main() {
    std::ifstream ifs ("input.txt");
    std::ofstream ofs ("output.txt");
    //
    tSegment first, second;
    ifs >> first.pt1.x >> first.pt1.y;
    ifs >> first.pt2.x >> first.pt2.y;
    ifs >> second.pt1.x >> second.pt1.y;
    ifs >> second.pt2.x >> second.pt2.y;
    //
    ofs << (findPt (first, second) ? "Yes" : "No");
    //
    ifs.close();
    ofs.close();
    return 0;
}
 
bool findPt (const tSegment first, const tSegment second) {
    if (oneLine (first, second)) { // если прямые на одной прямой, смотрим,
        if (commonPart (first, second)) // имеют ли они общую часть.
            return true;
        return false;
    }
 
    int rez1 = side (first, second.pt1);
    int rez2 = side (first, second.pt2);
    int rez3 = side (second, first.pt1);
    int rez4 = side (second, first.pt2);
 
    if ((!rez1) || (!rez2) || (!rez3) || (!rez4))
        return true;
 
    return ((rez1 * rez2 < 0) && (rez3 * rez4 < 0));
}
 
bool oneLine (const tSegment first, const tSegment second) {
    return ((!side (first, second.pt1)) && (!side (first, second.pt2)));
}
 
bool commonPart (const tSegment first, const tSegment second) {
    int minx1 = std::min (first.pt1.x, first.pt2.x);
    int miny1 = std::min (first.pt1.y, first.pt2.y);
    int maxx1 = std::max (first.pt1.x, first.pt2.x);
    int maxy1 = std::max (first.pt1.y, first.pt2.y);
    int minx2 = std::min (second.pt1.x, second.pt2.x);
    int miny2 = std::min (second.pt1.y, second.pt2.y);
    int maxx2 = std::max (second.pt1.x, second.pt2.x);
    int maxy2 = std::max (second.pt1.y, second.pt2.y);
 
    // first ниже / левее second
    if ((maxx1 > minx2) || (maxy1 > miny2))
        return true;
    // first выше / правее second
    if ((maxx2 > minx1) || (maxy2 > miny1))
        return true;
 
    return false;
}
 
int side (const tSegment segment, const tPoint pt) {
    return down (((pt.x - segment.pt1.x) * (segment.pt2.y - segment.pt1.y) -
            (pt.y - segment.pt1.y) * (segment.pt2.x - segment.pt1.x)));
}
 
int down (const int x) {
    return (x > 0 ? 1 : x == 0 ? 0 : -1);
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru