Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/47: Рейтинг темы: голосов - 47, средняя оценка - 4.72
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
1

Пересекаются ли прямые, и, если да, то найти координаты точки пересечения

07.05.2017, 22:13. Показов 9751. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ввод состоит из координат точек прямых (две точки - первая прямая, ещё две - вторая прямая).

Так как это прямые, то ситуаций может быть три:
1. Прямые совпадают
2. Прямые параллельны
3. Прямые пересекаются
С первой ситуацией вопросов нет, а вот со второй и третьей проблемы. Я решил взять за признак пересечения прямых разность угловых коэффициентов. Чтобы его вычислить, нужно из уравнения прямой (Ax + By + C) поделить коэффициент A на B. Единственное "но" в этом случае - это когда B = 0. Я отработал это как частный случай. Всем известно, что если B = 0, то прямая будет параллельна оси Y, а это, в свою очередь, значит, что если только одна из прямых параллельна оси Y, то прямые пересекаются, а если у обеих B = 0, то они параллельны. Проблема состоит в том, что тестировочная система не принимает задачу на 100%, а я никак не могу придумать тест, на котором программа не пойдёт.

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
#include <iostream>
#include <iomanip>
#include <cmath>
 
using namespace std;
 
double x, y;
long long x1, y_1, x2, y2, x3, y3, x4, y4;
long long A1, B1, C1, A2, B2, C2;
 
void calcCoef () {
  A1 = y2 - y_1;
  B1 = x1 - x2;
  C1 = x1 * (y_1 - y2) + y_1 * (x2 - x1);
 
  A2 = y4 - y3;
  B2 = x3 - x4;
  C2 = x3 * (y3 - y4) + y3 * (x4 - x3);
}
 
void calcPoint () {
  x = (double)(B1 * C2 - B2 * C1) / (double)(B2 * A1 - B1 * A2);
  y = (double)(A1 * C2 - A2 * C1) / (double)(A2 * B1 - A1 * B2);
  cout << x << ' ' << y << endl;
}
 
void solve () {
  calcCoef();
  long long p1 = x3 * (y2 - y_1) + y3 * (x1 - x2) + x1 * (y_1 - y2) + y_1 * (x2 - x1); 
  long long p2 = x4 * (y2 - y_1) + y4 * (x1 - x2) + x1 * (y_1 - y2) + y_1 * (x2 - x1);
  long long p3 = x1 * (y4 - y3) + y_1 * (x3 - x4) + x3 * (y3 - y4) + y3 * (x4 - x3);
  long long p4 = x2 * (y4 - y3) + y2 * (x3 - x4) + x3 * (y3 - y4) + y3 * (x4 - x3);
  if (p1 == 0 && p2 == 0 && p3 == 0 && p4 == 0) { //Проверка на то, что прямые совпадают
    cout << 2 << endl;
    return;
  }
 
  if (!B1 || !B2) { //То, о чём я писал
    if (!B1 && !B2) {
      cout << 0 << endl;
      return;
    } else {
      cout << 1 << ' ';
      calcPoint();
      return;
    }
  }
 
  if ((double)(A1 / B1) != (double)(A2 / B2)) {
    cout << 1 << ' ';
    calcPoint();
  } else {
    cout << 0 << endl;
  }
  /*
  Поясняю вывод
  0 - прямые параллельны (не пересекаются)
  1 - прямые пересекаются, далее идут координаты
  2 - прямые совпадают
  */
}
 
 
 
int main () {
  cout << scientific;
  cin >> x1 >> y_1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;
  solve();
  return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2017, 22:13
Ответы с готовыми решениями:

Доказать, что прямые пересекаются и найти координаты точки пересечения
Доказать, что прямые L_1: \frac {x-1} {2} = \frac {y+2} {-1} = \frac {z} {-2} и L_2: \frac {x+1}...

Указать, совпадают прямые, параллельны или пересекаются, если пересекаются, то найти точку пересечения
Указать, совпадают прямые, параллельны или пересекаются, если пересекаются, то найти точку...

Две прямые описываются уравнениями напечатать координаты точки пересечения этих прямых, либо сообщить что эти прямые совпада
Две прямые описываются уравнениями а1x+b1y+c1=0 a2x+b2y+c2=0 напечатать координаты точки...

При каком значении прямые пересекаются? Найти точку пересечения
Здравствуйте! Помогите решить задачу

5
21 / 21 / 10
Регистрация: 11.09.2015
Сообщений: 103
07.05.2017, 23:04 2
SaynorPRO, когда-то точку пересечения 2-х прямых или её отсутствие определяли решением системы 2-х линейных уравнений.

Добавлено через 10 минут
Прямые A1x + B1y + C1 = 0; A2x + B2y + C2 = 0; параллельны, если A2/A1 = B2/B1.
0
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
08.05.2017, 09:23  [ТС] 3
Kudryashov_R_D, впервые такое вижу. Я же написал, что определяю параллельность прямых через угловой коэффициент (A1 / B1)
0
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
08.05.2017, 10:42 4
Лучший ответ Сообщение было отмечено SaynorPRO как решение

Решение

http://www.matematicus.ru/publ... h/11-1-0-3

Замечание 3.
1
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
08.05.2017, 21:35  [ТС] 5
мановар, Решение пошло, спасибо. А почему идея с коэффициентами оказалась нерабочей?
0
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
09.05.2017, 04:59 6
SaynorPRO, надо в программе разбираться, но зачем, если есть путь короче.
1
09.05.2017, 04:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2017, 04:59
Помогаю со студенческими работами здесь

Определить, пересекаются ли параболы y = ax2+bx+c и y = dx2+mx+n. Если пересекаются, то найти точку пересечения
Определить, пересекаются ли параболы y = ax2+bx+c и y = dx2+mx+n. Если пересекаются, то найти...

Найти параметр a, где прямые пересекаются и найти точку их пересечения
Заданы 2 прямые в параметрической форме: L1:= (-1,1,-2)+t(2,1,3) L2:= (0,0,2)+p(a,2,a) ...

Если прямые попарно пересекаются и образуют треугольник, то найти его площадь
три прямые на плоскости заданы уравнениями акх+bky=ck (к=1,2,3) если прямые попарно пересекаются и...

Если прямые пересекаются и образуют треугольник, тогда найти его площадь
Три прямые заданы на плоскости уравнениями Ax+By=C.Если эти прямые пересекаются и образуют...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru