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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.62
Букозяврик_она
0 / 0 / 0
Регистрация: 20.04.2011
Сообщений: 4
#1

Найти точку пересечения отрезка с прямой - C++

20.04.2011, 17:58. Просмотров 5060. Ответов 8
Метки нет (Все метки)

Найти точку пересечения отрезка, заданного точками (х1;y1) и (x2;y2) с прямой, перпендикулярной данному отрезку, проходящей через точку (x3;y3). Точки x1,y1,x2,y2,x3,y3 вводятся с клавиатуры.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2011, 17:58     Найти точку пересечения отрезка с прямой
Посмотрите здесь:

C++ Найти точку пересечения двух отрезков
Найти точку пересечения прямой с плоскостью C++
Найти точку принадлежащую прямой C++
Написать функцию булевского типа, определяющую наличие пересечения заданной прямой и заданного отрезка. C++
Найти координаты точек пересечения прямой и окружности C++
C++ Равнобедренная трапеция - найти точку пересечения боковых сторон
Найти точки пересечения параболы и прямой C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mimicria
return (true);
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
20.04.2011, 18:10     Найти точку пересечения отрезка с прямой #2
Цитата Сообщение от Букозяврик_она Посмотреть сообщение
Найти точку пересечения отрезка, заданного точками (х1;y1) и (x2;y2) с прямой, перпендикулярной данному отрезку, проходящей через точку (x3;y3). Точки x1,y1,x2,y2,x3,y3 вводятся с клавиатуры.
Точка пересечения будет с координатами (x3;y3)
Ваш кэп
prazuber
20.04.2011, 18:13
  #3

Не по теме:

кэп ошибся

Букозяврик_она
0 / 0 / 0
Регистрация: 20.04.2011
Сообщений: 4
20.04.2011, 19:34  [ТС]     Найти точку пересечения отрезка с прямой #4
Цитата Сообщение от mimicria Посмотреть сообщение
Точка пересечения будет с координатами (x3;y3)
Ваш кэп
какбэ остроумно)

Добавлено через 1 час 7 минут
Цитата Сообщение от Букозяврик_она Посмотреть сообщение
Найти точку пересечения отрезка, заданного точками (х1;y1) и (x2;y2) с прямой, перпендикулярной данному отрезку, проходящей через точку (x3;y3). Точки x1,y1,x2,y2,x3,y3 вводятся с клавиатуры.
если не совсем корректно написала, то поясню точка х3,у3 произвольная и через нее идет прямая, и х3,у3 не являются точной пересечения отрезка и прямой))
Букозяврик_она
0 / 0 / 0
Регистрация: 20.04.2011
Сообщений: 4
21.04.2011, 22:48  [ТС]     Найти точку пересечения отрезка с прямой #5
Аууу товарищи програмисты ну помогите пожалуйста((
а то совсем завал с этой программой((
IrineK
Заблокирован
21.04.2011, 23:42     Найти точку пересечения отрезка с прямой #6
Используем тот факт, что угловые коэффициенты перпендикулярных прямых связаны соотношением:
k1*k2 = -1
IrineK
Заблокирован
22.04.2011, 03:36     Найти точку пересечения отрезка с прямой #7
Нарисовался такой алгоритм:
Миниатюры
Найти точку пересечения отрезка с прямой  
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
22.04.2011, 12:06     Найти точку пересечения отрезка с прямой #8
Ну и реализация вышеприведенного алгоритма:
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/////////////////////////////////////////////////////////////////////////////////////////
//Найти точку пересечения отрезка, заданного точками (х1;y1) и (x2;y2) с прямой, 
//перпендикулярной данному отрезку, проходящей через точку (x3;y3). 
//Точки x1,y1,x2,y2,x3,y3 вводятся с клавиатуры. 
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef double       T_coord;
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
bool  get_segment_and_line_intersection_point
    (
        T_coord   Ax, 
        T_coord   Ay,
 
        T_coord   Bx, 
        T_coord   By,
 
        T_coord   Cx,
        T_coord   Cy,
 
        T_coord&  Ix,
        T_coord&  Iy
    )
{
    //Если отрезок горизонтален, т.е. Ay = By:
    if(Ay == By)
    {
        if(    Cx                < std::min(Ax, Bx)
            || std::max(Ax, Bx)  < Cx               )
        {
            return  false;
        }
        else
        { 
            Ix = Cx;
            Iy = Ay;
            return  true;
        }    
    }
 
    //Если отрезок вертикален, т.е. Ax = Bx:
    if(Ax == Bx)
    {
        if(    Cy                < std::min(Ay, By)
            || std::max(Ay, By)  < Cy               )
        {
            return  false;
        }
        else
        { 
            Ix = Ax;
            Iy = Cy;
            return  true;
        }    
    }
    //Уравнение прямой AB, содержащей отрезок, имеет вид
    //  y = k_otr * x + b_otr,                                                        (1)
    //или 
    //  (y - Ay) / (By - Ay) = (x - Ax) / (Bx - Ax),
    //откуда
    //  (y - Ay) = (By - Ay) / (Bx - Ax) * (x - Ax),                                  (2)
    //т.е.
    //  k_otr = (By - Ay) / (Bx - Ax)                                                 (3)
    //и из (2) получим:
    //  y - Ay = k_otr * (x - Ax);
    //  y - Ay = k_otr * x - k_otr * Ax;
    //  y = k_otr * x - k_otr * Ax + Ay,
    //откуда, учитывая (1),
    //  b_otr = Ay - k_otr * Ax;                                                      (4)  
    //
    //Уравнение прямой, проходящей через точку C, и перпендикулярной AB имеет вид:
    //  y = k_pr * x + b_pr                                                           (5)
    //или
    //  (y - Cy) = k_pr(x - Cx);
    //  y - Cy = k_pr * x - k_pr * Cx;
    //  y  = k_pr * x - k_pr * Cx + Cy,
    //откуда, учитывая (5),
    //  b_pr = Cy - k_pr * Cx.                                                        (5a)
    //Из условия перпендикулярности имеем
    //k_otr * k_pr = -1,
    //т.е.
    //  k_pr = -1 / k_otr;                                                            (6)
    //Находим точку I пересечения прямых (1) и (5):
    //  k_otr * Ix + b_otr = k_pr * Ix + b_pr,
    //откуда
    //  (k_otr - k_pr) * Ix = b_pr - b_otr,
    //откуда, учитывая (3), (4), (5a) и (6):
    //  Ix = (b_pr - b_otr) / (k_otr - k_pr) = (b_pr - b_otr) / (k_otr + 1 / k_otr) =
    //     = (Cy + 1 / k_otr * Cx - Ay + k_otr * Ax) / (k_otr + 1 / k_otr).            (7)
 
    //Из (3):
    T_coord  k_otr = (By - Ay) / (Bx - Ax);
    //Из (7):
    Ix = (Cy + Cx / k_otr - Ay + k_otr * Ax) / (k_otr + 1 / k_otr);
 
    //Если точка пересечения лежит вне отрезка, то:
    if(    Ix                < std::min(Ax, Bx)
        || std::max(Ax, Bx)  < Ix               )
    {
        return  false;
    }
    else
    {
        //Из (1) и (4) находим
        Iy = k_otr * Ix + Ay - k_otr * Ax;
    }
    return  true;
}
/////////////////////////////////////////////////////////////////////////////////////////
T_coord  input_coord(const T_str&  prompt)
{
    std::cout  << prompt;
    T_coord  coord = 0;
    std::cin   >> coord;    
    return  coord;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите координаты концов отрезка:"
              << std::endl;
 
    T_coord  Ax = input_coord("\tAx = ");
    T_coord  Ay = input_coord("\tAy = ");
 
    std::cout << std::endl;
 
    T_coord  Bx = input_coord("\tBx = ");
    T_coord  By = input_coord("\tBy = ");
 
    std::cout << "Введите координаты точки, через которую проходит прямая, "
              << std::endl
              << "перпендикулярная отрезку:"
              << std::endl;
 
    T_coord  Cx = input_coord("\tCx = ");
    T_coord  Cy = input_coord("\tCy = ");
 
    T_coord  Ix = 0;
    T_coord  Iy = 0;
    if(
        get_segment_and_line_intersection_point
            (
                Ax, 
                Ay,
 
                Bx, 
                By,
 
                Cx,
                Cy,
 
                Ix,
                Iy
            )
      )
    {
        std::cout << "Прямая пересекает отрезок в точке ("
                  << Ix
                  << ", "
                  << Iy
                  << ")."
                  << std::endl;
    }
    else
    {
        std::cout << "Прямая НЕ пересекает отрезок."
                  << std::endl;
    }  
}
Добавлено через 38 минут
То же самое через комплексные числа:
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
/////////////////////////////////////////////////////////////////////////////////////////
//Найти точку пересечения отрезка, заданного точками (х1;y1) и (x2;y2) с прямой, 
//перпендикулярной данному отрезку, проходящей через точку (x3;y3). 
//Точки x1,y1,x2,y2,x3,y3 вводятся с клавиатуры. 
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <complex>
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef double                 T_coord;
typedef std::complex<T_coord>  T_point;
typedef std::string            T_str;
/////////////////////////////////////////////////////////////////////////////////////////
bool  get_segment_and_line_intersection_point
    (
        T_point   A,
        T_point   B,
        T_point   C,
 
        T_point&  I
    )
{
    //Поворачиваем отрезок и прямую вокруг начала координат в положение, при котором
    //отрезок горизонтальный.
    T_point  factor = (B - A) / abs(B - A);
    A /= factor;
    B /= factor;
    C /= factor;
 
    //Находим точку пересечения:
    if(    C.real()                      < std::min(A.real(), B.real()) 
        || std::max(A.real(), B.real())  < C.real()                     )
    {
        return  false;
    }
    else
    {
        I = T_point(C.real(), A.imag());
        I *= factor;
    }
    return  true;
}
/////////////////////////////////////////////////////////////////////////////////////////
T_coord  input_coord(const T_str&  prompt)
{
    std::cout  << prompt;
    T_coord  coord = 0;
    std::cin   >> coord;    
    return  coord;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите координаты концов отрезка:"
              << std::endl;
 
    T_coord  Ax = input_coord("\tAx = ");
    T_coord  Ay = input_coord("\tAy = ");
 
    std::cout << std::endl;
 
    T_coord  Bx = input_coord("\tBx = ");
    T_coord  By = input_coord("\tBy = ");
 
    std::cout << "Введите координаты точки, через которую проходит прямая, "
              << std::endl
              << "перпендикулярная отрезку:"
              << std::endl;
 
    T_coord  Cx = input_coord("\tCx = ");
    T_coord  Cy = input_coord("\tCy = ");
 
    T_point  I;    
    if(
        get_segment_and_line_intersection_point
            (
                T_point(Ax, Ay),
                T_point(Bx, By),
                T_point(Cx, Cy),
                I                
            )
      )
    {
        std::cout << "Прямая пересекает отрезок в точке "
                  << I
                  << "."
                  << std::endl;
    }
    else
    {
        std::cout << "Прямая НЕ пересекает отрезок."
                  << std::endl;
    }  
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2011, 17:48     Найти точку пересечения отрезка с прямой
Еще ссылки по теме:

Найти точку на прямой C++
Вычислить точку пересечения прямой и плоскости в пространстве C++
Найти точки пересечения отрезка и окружности C++
Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки C++
Найти точки пересечения прямой с окружностью C++

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

Или воспользуйтесь поиском по форуму:
Букозяврик_она
0 / 0 / 0
Регистрация: 20.04.2011
Сообщений: 4
22.04.2011, 17:48  [ТС]     Найти точку пересечения отрезка с прямой #9
вау!))
огромнейшее спасибо вам))
Yandex
Объявления
22.04.2011, 17:48     Найти точку пересечения отрезка с прямой
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru