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

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

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

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

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

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

Найти точку пересечения прямой с плоскостью - C++
Зарание спасибо.)

Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки - C++
Привет! Помогите двоишнику, я же тупой батхэд :D! Есть отрезок, заданный двумя точками P1 и P2. Есть точка P3. Так вот, нужно найти...

Вычислить точку пересечения прямой и плоскости в пространстве - C++
Вычислить точки пересечения прямой, заданной уравнениями y=kx+a, z=hx+b и плоскости AX+BY+CZ+D=0 по формулам x0= - (Ba+Cb+D)/(A+Bk+Ch);...

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

Найти точки пересечения отрезка и окружности - C++
Here i go again :) Нужен код готовой функции для поиска точек пересечения отрезка и окружности в 2D, может есть у кого готовая...

Найти точку пересечения двух отрезков - C++
как найти точку пересечения двух отрезков, если даны координаты начала и конца обеих

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

Не по теме:

кэп ошибся

1
Букозяврик_она
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 / 0
Регистрация: 20.04.2011
Сообщений: 4
21.04.2011, 22:48  [ТС] #5
Аууу товарищи програмисты ну помогите пожалуйста((
а то совсем завал с этой программой((
0
IrineK
Заблокирован
21.04.2011, 23:42 #6
Используем тот факт, что угловые коэффициенты перпендикулярных прямых связаны соотношением:
k1*k2 = -1
0
IrineK
Заблокирован
22.04.2011, 03:36 #7
Нарисовался такой алгоритм:
0
Миниатюры
Найти точку пересечения отрезка с прямой  
Mr.X
Эксперт С++
3053 / 1698 / 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;
    }  
}
2
Букозяврик_она
0 / 0 / 0
Регистрация: 20.04.2011
Сообщений: 4
22.04.2011, 17:48  [ТС] #9
вау!))
огромнейшее спасибо вам))
0
22.04.2011, 17:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2011, 17:48
Привет! Вот еще темы с ответами:

Найти точки пересечения параболы и прямой - C++
Не понимаю почему программа работает некоректно. Код компилируется и работает, но программа выдает неверный результат. Собственно сам...

Найти точки пересечения прямой с окружностью - C++
Даны координаты центра (x,y) и радиус R, и коэффициенты А, В и С нормального уравнения прямой. Найти точки пересечения прямой с...

Найти точку на прямой - C++
Найти на кривой Y(X)=sin2(2X)cos(4X) точку, абсцисса которой принадлежит интервалу и сумма расстояний от которой до прямых a1x+b1y+c1=0 и...

Найти координаты точек пересечения прямой и окружности - C++
Найти координаты точек пересечения прямой y=kx+b и окружности радиуса R с центром в начале координат. В каких координатных четвертях...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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