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

По координатам отрезков определить, пересекаются ли они - C++

Восстановить пароль Регистрация
 
Naomi Aori
0 / 0 / 0
Регистрация: 11.08.2016
Сообщений: 10
29.09.2016, 12:58     По координатам отрезков определить, пересекаются ли они #1
Добрый день! По координатам отрезков требуется определить пересекаются ли они. У меня на 5-ом тесте валится, помогите, пожалуйста, найти ошибку
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
// Example program
#include <iostream>
#include <string>
 
using namespace std;
int main()
{
 double x1, y1, x2, y2, x3,y3,x4,y4;
 double xx1, yy1, xx2, yy2, xx3, yy3, xx4, yy4;
 cin>> x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
 bool check1=false, check2 = false;
 xx2=x2-x1;
 yy2=y2-y1;
 
 xx3=x3-x1;
 yy3=y3-y1;
 
 xx4=x3-x1;
 yy4=y4-y1;
 
 if ((xx2*yy3-yy3*xx3)*(xx2*yy4-yy2*xx4)<0 || (xx2*yy3-yy3*xx3)*(xx2*yy4-yy2*xx4)==0) check1=true;
 xx1=x1-x2;
 yy1=y1-y2;
 
 xx3=x3-x2;
 yy3=y3-y2;
 
 xx4=x3-x2;
 yy4=y4-y2;
 
 if ((xx1*yy3-yy1*xx3)*(xx1*yy4-yy1*xx4)<=0) check2=true;
 
 if (check1==true && check2==true)
 cout<<"Yes";
 else cout<<"No";
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2016, 12:58     По координатам отрезков определить, пересекаются ли они
Посмотрите здесь:

C++ Определить, пересекаются ли прямая и окружность
C++ Определить, пересекаются ли парабола и прямая
Даны длины четырёх отрезков. Определить, могут ли они быть сторонами параллелограма C++
Вычисление площади треугольника по координатам концов отрезков с ++ C++
Даны два отрезка действительной прямой. Определить, пересекаются ли они C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Apostol584
235 / 141 / 71
Регистрация: 26.11.2012
Сообщений: 365
Завершенные тесты: 2
29.09.2016, 15:16     По координатам отрезков определить, пересекаются ли они #2
Цитата Сообщение от Naomi Aori Посмотреть сообщение
У меня на 5-ом тесте валится
можно ваши тесты?

Добавлено через 1 час 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//g++  4.9.3
 
#include <iostream>
 
bool cross(float ax1, float ay1,float ax2, float ay2, 
           float bx1, float by1, float bx2, float by2)
{
   float v1 = (bx2 - bx1)*(ay1 - by1) - (by2 - by1)*(ax1 - bx1);
   float v2 = (bx2 - bx1)*(ay2 - by1) - (by2 - by1)*(ax2 - bx1);
   float v3 = (ax2 - ax1)*(by1 - ay1) - (ay2 - ay1)*(bx1 - ax1);
   float v4 = (ax2 - ax1)*(by2 - ay1) - (ay2 - ay1)*(bx2 - ax1);
   return (v1*v2 < 0 && v3*v4 < 0);
}
 
 
int main()
{
    std::cout << (cross(1, 1, 5, 5, 1, 2, 3, 1)? "true" : "false") << std::endl;
    std::cout << (cross(1, 1, 1, 1, 1, 1, 1, 1)? "true" : "false") << std::endl;
    std::cout << (cross(1, 1, 4, 1, 1, 1, 4, 1)? "true" : "false") << std::endl;
    
    return 0;
}
SpBerkut
Объявлятель переменных
 Аватар для SpBerkut
905 / 231 / 113
Регистрация: 24.09.2011
Сообщений: 874
Завершенные тесты: 2
29.09.2016, 15:47     По координатам отрезков определить, пересекаются ли они #3
Apostol584, Ваш вариант не отлавливает пересечения на краю отрезков. cross(0, 0, 0, 2, 0, 1, 1, 1) выдаёт false, хотя есть пересечение в точке (0;1).
Apostol584
235 / 141 / 71
Регистрация: 26.11.2012
Сообщений: 365
Завершенные тесты: 2
29.09.2016, 22:56     По координатам отрезков определить, пересекаются ли они #4
SpBerkut, у меня с математикой не очень

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
#include <iostream>
#include <cmath>
 
bool cross(float ax1, float ay1,float ax2, float ay2, 
           float bx1, float by1, float bx2, float by2)
{
 
    float dx1 = ax2 - ax1, dy1 = ay2 - ay1; 
    float dx2 = bx2 - bx1, dy2 = by2 - by1; 
    float dxx = ax1 - bx1, dyy = ay1 - ay1;
    
   if ((dy2*dx1 - dx2*dy1) == 0) 
        return false;
    
    if ((dx1*dyy - dy1*dxx) < 0)
        return false; 
    if ((dx2*dyy - dy2*dxx) < 0)
        return false; 
        
   return true;
}
 
int main()
{
    std::cout << (cross(1, 1, 1, 1, 1, 1, 1, 1)? "true" : "false") << std::endl;//no
    std::cout << (cross(1, 1, 4, 1, 1, 1, 4, 1)? "true" : "false") << std::endl;//no
    std::cout << (cross(0, 0, 0, 2, 0, 1, 0, 2)? "true" : "false") << std::endl;//no
    std::cout << (cross(1, 1, 5, 5, 1, 2, 3, 1)? "true" : "false") << std::endl;//yes
    std::cout << (cross(0, 0, 0, 2, 0, 1, 1, 1)? "true" : "false") << std::endl;//yes
    std::cout << (cross(0, 0, 0, 2, 0, 0, 1, 1)? "true" : "false") << std::endl;//yes
    std::cout << (cross(0, 0, 0, 2, 0, 1, 1, 2)? "true" : "false") << std::endl;//yes
    
    return 0;
}
Добавлено через 18 секунд
вроде работает
Yandex
Объявления
29.09.2016, 22:56     По координатам отрезков определить, пересекаются ли они
Ответ Создать тему

Метки
С++ для начинающих
Опции темы

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