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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Напечатать в алфавитном порядке все звонкие буквы которые входят в каждое слово http://www.cyberforum.ru/cpp-beginners/thread280222.html
(СИ)дана непустая последовательность слов из строчных русских букв, между соседними словами- запятая, за последним словом- точка.Напечатать в алфавитном порядке все звонкие буквы которые входят в каждое слово.
C++ Строки Ввести предложение. Выдать его на экран, изменив порядок следования букв в каждом слове, оставив порядок следования слов в предложении прежним. вот код на паскале uses crt; var b: array of string; a: string; n, i, j, k: integer; begin clrscr; http://www.cyberforum.ru/cpp-beginners/thread280201.html
Англо-русского словарь методом дерева бинарного поиска C++
Здравствуйте! Есть задача: реализовать англо-русский словарь с помощью бинарного дерева поиска. Решаю эту задачу на примере книги "Алгоритмы на С++ Роберт Седжвик". Часть уже реализовал: Item.h - АТД (абстрактный тип данных) элемента, содержит ключ (Key) - английское слово, соответствующее ему русское слово (item) и счетчик (количество обращений к ключу) #ifndef ITEM_H #define ITEM_H ...
C++ Определить 3 точки, являющиеся вершинами треугольника, для которых разность точек вне е го и внутри является минимальной.
В одномерном массиве с четным количеством элементов(2n) находятся координаты n точек плоскости.Они распологаются в следующем порядке:x1 y1,x2 y2, x3 y3 и т.д. Определить 3 точки, являющиеся вершинами треугольника, для которых разность точек вне е го и внутри является минимальной.
C++ Русские символы в BC31 http://www.cyberforum.ru/cpp-beginners/thread280189.html
Как в Borland C++ 3.1 печатать русские буквы?? И как их считать их файла?? CharToOem не работает.
C++ Подсчет скобок в тексте проверить, имеется ли в заданном тексте баланс открывающих и закрывающих круглых скобок. Помогите пожалуйста. Заранее спасибо ! подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,662
22.04.2011, 12:06     Найти точку пересечения отрезка с прямой
Ну и реализация вышеприведенного алгоритма:
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;
    }  
}
 
Текущее время: 09:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru