Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/263: Рейтинг темы: голосов - 263, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 52

Точка пересечения прямых

09.07.2017, 17:22. Показов 54710. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите решить задачку, пожалуйста.

На плоскости даны две прямые. Каждая прямая задается парой точек, через которые она проходит. Требуется установить, пересекаются ли эти прямые, и найти координаты точки пересечения.


Входные данные

Вводятся сначала координаты двух различных точек, через которые проходит первая прямая, а затем - координаты еще двух различных (но, быть может, совпадающих с первыми двумя) точек, через которые проходит вторая прямая. Координаты каждой точки - целые числа, по модулю не превышающие 1000.


Выходные данные

Если прямые не пересекаются, выведите одно число 0. Если прямые совпадают, выведите 2. Если прямые пересекаются ровно в одной точке, то выведите сначала число 1, а затем два вещественных числа - координаты точки пересечения.



Примеры



Входные данные
0 0 1 1
1 0 -1 2


Выходные данные
1 5.0000000E-0001 5.000000E-0001
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.07.2017, 17:22
Ответы с готовыми решениями:

Координаты пересечения 2-х прямых.
Даны числа A1, B1, C1, A2, B2, C2. Напечатать координаты пересечения прямых A1x+B1y=C1 и A2x+B2y=C2 и сообщить, что эти прямые совпадают,...

Координаты точки пересечения прямых
1.Имеются две прямые заданные уравнениями: y=a1x+b1 и y=a2x+b2 2.Написать программу,выдающую координаты точки пересечения прямых ...

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

3
 Аватар для MisterR
69 / 68 / 52
Регистрация: 28.10.2015
Сообщений: 388
09.07.2017, 17:55
Координаты точки пересечения двух прямых
1
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,630
09.07.2017, 19:20
Лучший ответ Сообщение было отмечено Linochk как решение

Решение

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
#include <iostream>
 
using namespace std;
void parall(double a1, double a2, double b1, double b2)
{
    if ((a1 / a2) == (b1 / b2))
    {
        cout << "Lines parallel!";
        system("pause");
        exit(0);
    }
}
void intersect(double a1, double a2, double b1, double b2, double c1, double c2, double& x, double& y)
{
    double det = a1 * b2 - a2 * b1;
    x = (b1 * c2 - b2 * c1) / det;
    y = (a2 * c1 - a1 * c2) / det;
}
 
int main()
{
    double a1, a2, b1, b2, c1, c2;
    double x, y, x1, y1, x2, y2, x3, y3, x4, y4;
    cout << " Input line 1 point1 point2 "; cin >> x1 >> y1 >> x2 >> y2;
    cout << " Input line 2 point1 point2 "; cin >> x3 >> y3 >> x4 >> y4;
    // line equation ax + by + c = 0
    a1 = y1 - y2;
    b1 = x2 - x1;
    c1 = x1 * y2 - x2 * y1;
    a2 = y3 - y4;
    b2 = x4 - x3;
    c2 = x3 * y4 - x4 * y3;
 
    parall(a1, a2, b1, b2);
 
    intersect(a1, a2, b1, b2, c1, c2, x, y);
    cout << "point of intersection " << x << " " << y << endl;
    system("pause");
    return 0;
}
5
0 / 0 / 0
Регистрация: 24.02.2023
Сообщений: 1
24.02.2023, 10:22
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <iostream>
#include <cmath>
#include <iomanip>
 
using namespace std;
 
static const double eps = 1e-7;
 
class Dot
{
    double x, y;
public:
    Dot(double x = 0, double y = 0) { this->x = x; this->y = y; }
    double get_x() const {return x;}
    double get_y() const {return y;}
};
 
class Vect
{
    double x, y;
public:
    Vect(double x = 0, double y = 0) { this->x = x; this->y = y; }
    Vect (const Dot & a, const Dot & b) {x = b.get_x() - a.get_x(); y = b.get_y() - a.get_y();}
    Vect operator+(const Vect & a);
 
    double get_x() const {return x;}
    double get_y() const {return y;}
    double get_mod() const {return sqrt(x * x + y * y);}
};
 
Vect Vect::operator+(const Vect & a) {
    Vect res(this->get_x() + a.get_x(), this->get_y() + a.get_y());
    return res;
}
 
Vect operator* (double a, const Vect & b) {
    Vect res(b.get_x() * a, b.get_y() * a);
    return res;
}
 
Vect operator* (const Vect & b, double a) {
    Vect res(b.get_x() * a, b.get_y() * a);
    return res;
}
 
Dot operator+ (const Dot & dot, const Vect & v) {
    return Dot(dot.get_x() + v.get_x(), dot.get_y() + v.get_y());
}
 
double scalar_product(const Vect & a, const Vect & b) {
    return (a.get_x() * b.get_x() + a.get_y() * b.get_y());
}
 
bool is_collinear(const Vect & a, const Vect & b) {
    return abs((abs(scalar_product(a, b)) - a.get_mod() * b.get_mod())) < ::eps;
}
 
 
class Line
{
    Vect dir;
    Dot dot;
public:
    Line() { dir = Vect(); dot = Dot(); }
    Line(const Dot & a, const Dot & b);
    Line(const Vect & v, const Dot & dot) {dir = v; this->dot = dot;}
    Vect get_vect() const {return dir;}
    Dot get_dot() const {return dot;}
};
 
Line::Line(const Dot & a, const Dot & b)
{
    dir = Vect(a, b);
    dot = a;
}
 
Dot
i_hate_conditions(const Line & a, const Line & b)
{
    double xa = a.get_dot().get_x(), ya = a.get_dot().get_y();
    double xc = a.get_vect().get_x(), yc = a.get_vect().get_y();
    double xb = b.get_dot().get_x(), yb = b.get_dot().get_y();
    double xd = b.get_vect().get_x(), yd = b.get_vect().get_y();
    
    double t = ((xa - xb) / xd + (yb - ya) / yc * xc / xd) / (1 - yd * xc / yc / xd);
    Dot res = b.get_dot() + t * b.get_vect();
 
    return res;
}
 
//функция вычисления точки пересечения
Dot
i_hate_conditions_new(const Line & a, const Line & b)
{
    double xa = a.get_dot().get_x(), ya = a.get_dot().get_y();
    double xc = a.get_vect().get_x(), yc = a.get_vect().get_y();
    double xb = b.get_dot().get_x(), yb = b.get_dot().get_y();
    double xd = b.get_vect().get_x(), yd = b.get_vect().get_y();
    Dot res;
    //случай, когда оба направляющих вектора параллельны двум разным осям координат
    if (((abs(xc) < ::eps) && (abs(yd) < ::eps)) || ((abs(xd) < ::eps) && (abs(yc) < ::eps))) {
        double x, y;
        if (abs(a.get_vect().get_x()) < ::eps) {
            x = a.get_dot().get_x();
            y = b.get_dot().get_y();
        } else {
            x = b.get_dot().get_x();
            y = a.get_dot().get_y();
        }
        res = Dot(x, y);
    } else if (abs(yd) < ::eps) {
        //случай, когда возможно один из векторов параллелен, этим условием выбирается тот, который не параллелен, чтобы избежать деления на 0
        double t = (xa - xb + (yb - ya) / yc * xc) / (xd - yd / yc * xc);
        res = b.get_dot() + b.get_vect() * t;
    } else {
        double k = (xa - xb - (ya - yb) / yd * xd) / (yc / yd * xd - xc);
        res = a.get_dot() + a.get_vect() * k;
    }
 
    return res;
}
 
//фунция проверки на совпадение, параллельность и просто пересечение
void intersect_lines(const Line & a, const Line & b)
{
    Vect v1 = a.get_vect();
    Vect v2 = b.get_vect();
    if (is_collinear(v1, v2)) {
        Vect dif(a.get_dot(), b.get_dot());
        if (is_collinear(dif, v1)) {
            cout << "2" << endl;
        } else {
            cout << "0" << endl;
        }
    } else {
        
        Dot res = i_hate_conditions_new(a, b);
        cout << fixed;
        cout << "1 " << setprecision(5) << res.get_x() << ' ' << res.get_y()<< endl;
    }
}
 
int main(int argc, char const *argv[])
{
    double x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    Line l1(Dot(x1, y1), Dot(x2, y2));
    cin >> x1 >> y1 >> x2 >> y2;
    Line l2(Dot(x1, y1), Dot(x2, y2));
    intersect_lines(l1, l2);
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.02.2023, 10:22
Помогаю со студенческими работами здесь

Найти координаты точки пересечения прямых
Даны вещественные числа a1,b1,c1,a2,b2,c2. Напечатать координаты точки пересечения прямых ,описываемых уравнениями a1x+b1y=c1 и a2x+b2y=c2,...

Вычислить сумму количеств точек пересечения прямых
Рассмотрим положительное целое N. Пусть A, B и C – такие неотрицательные целые числа, что A + B + C = N. Пусть на координатной оси отмечено...

Формула нахождения точки пересечения двух прямых
q all, need help! формула работает нормально вроде, всё окей. Но как узнать где эта точка пересечения, одного TRUE от формулы не хватит(( ...

Нахождение точки пересечения двух прямых в пространстве
Здрасьте. Имеется два отрезка в пространстве и координаты их концов. Как найти точку пересечения этих отрезков (если она есть)...

Найти площадь фигуры, образованной точками пересечения 4-х прямых
Помогите решить задачи по программированию найти площадь фигуры, образованной точками пересечения 4-х прямых, заданных каноническими...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru