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

определить положение точки как это сделать? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Умножение матриц http://www.cyberforum.ru/cpp-beginners/thread175148.html
Вычислить: q = min(2*MA*MB) где MA, MB – матрицы размером N1xN2. Числа N1 и N2 задаются пользователем в начале работы программы. Все элементы матриц заполнить случайными целыми числами в...
C++ поиск корня методом касательных Задача: найти корень уравнения, используя метод касательных. Точность e=0.0001 (в принципе она не нужна, так как я ввожу ее самостоятельно); x принадлежит промежутку (те a и b, тоже ввожу их... http://www.cyberforum.ru/cpp-beginners/thread175136.html
классы C++
нужно разобратся с перегрузками и класами задача для класса А, компонентай-данным которого является пара целых чисел, создать несколько обьектов(например, A a(1,3), b(3,1)). реализовать для...
C++ компилятор и др
Теоретически в С++ все более или менее понятно, а вот практически ну вообще ничего! Нужно написать програмку в текстовом редакторе, откомпилировать, что то еще и запустить. А расскажите пожалуиста...
C++ Перегрузка функций http://www.cyberforum.ru/cpp-beginners/thread175048.html
Здравствуйте уважаемые програмисты:) У меня вот такое задание: В классе необходимо перегрузить нижеследующие операции, при этом две функции-операции должны быть реализованы как методы класса, а...
C++ Сумма ряда с заданной точностью Помогите пожалуйста, уже не знаю что и делать, неправильно решает программа... Для х ( -25 < x < 25) составить функцию, которая вычисляет сумму ряда с заданной точностью 0<eps<=1 . Считать, что... подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
14.10.2010, 09:56
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
/////////////////////////////////////////////////////////////////////////////////////
//  Вот задание:определить положение точки M(x,y) относительно заштрихованной фигуры
//
//                        *
//                      *   *
//                    *  ***  *  K
//                  **         ** 
//                **         *   **
//              * *        *      ***
//            *   *       *       *****
//          *     *       *****   *******
//        *        *      ********   ******
//      *            *    ******          ***
//    *****************************************
//
/////////////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
/////////////////////////////////////////////////////////////////////////////////////
typedef  double  T_real;
/////////////////////////////////////////////////////////////////////////////////////
template<class T>
bool  equal_to_for_real(T a, T b) 
{
    const T  coef = 10;
    return abs(a - b) < std::numeric_limits<T>::epsilon() * coef;
}
/////////////////////////////////////////////////////////////////////////////////////
template<class T>
bool  greater_for_real(T a, T b) 
{
    return a > b
           && !equal_to_for_real(a, b);
}
/////////////////////////////////////////////////////////////////////////////////////
template<class T>
bool  less_for_real(T a, T b) 
{
    return a < b
           && !equal_to_for_real(a, b);
}
/////////////////////////////////////////////////////////////////////////////////////
template<class T>
bool  greater_equal_for_real(T a, T b) 
{
    return !less_for_real(a, b);
}
/////////////////////////////////////////////////////////////////////////////////////
template<class T>
bool  less_equal_for_real(T a, T b) 
{
    return !greater_for_real(a, b);
}
/////////////////////////////////////////////////////////////////////////////////////
bool  point_belongs_to_area
    (
        T_real  mx, 
        T_real  my, 
        T_real  x0, 
        T_real  y0
    )
{
    //Заданные области лежат в первом квадранте, поэтому:    
    if(less_for_real(mx, 0.0) || less_for_real(my, 0.0))
    {
        return false;
    }
 
    //Находим радиус вписанной окружности треугольника:
    T_real  S = x0 * y0;                     //Площадь треугольника.
    T_real  hip = sqrt(x0 * x0 + y0 * y0);   //Длина правой стороны треугольника.
    T_real  p = x0 + hip;                    //Полупериметр треугольника.
    T_real  r = S / p;                       //Радиус вписанной окружности треугольника.
        
    if(
          less_equal_for_real
              (
                  mx * mx + (my - r) * (my - r), 
                  r * r
              )
      )
    {
        //Точка M лежит внутри окружности радиуса r, следовательно
        //она должна лежать не выше прямой, заданной отрезками x0 и r.
        //Эта прямая имеет уравнение в отрезках x / x0 + y / r = 1, 
        //т.е. y = r * (1 - x / x0),
        //откуда условие того, что точка M лежит не выше этой прямой, имеет вид:
        //my <= r * (1 - mx / x0)        
        return  less_equal_for_real(my,  r * (1 - mx / x0)); 
    }
    else
    {
        //Точка M лежит вне окружности, следовательно должны выполняться три условия:
        //1)Точка M должна лежать не ниже прямой, заданной отрезками x0 и r, т.е.
        //my >= r * (1 - mx / x0).
        //
        //2)Точка M должна лежать не выше прямой, заданной отрезками x0 и y0,
        //уравнение которой имеет вид x / x0 + y / y0 = 1, следовательно
        //my <= y0 * (1 - mx / x0).
        //
        //3)Точка M должна лежать не выше точки K, в которой вписанная окружность
        //касается правой стороны треугольника. Очевидно, что Ky = r + r * cos(a), 
        //где из подобия треугольников cos(a) = x0 / hip, т.е.
        //Ky = r * (1 + cos(a)) = r * (1 + x0 / hip), откуда
        //my <= r * (1 + x0 / hip).
        //Объединяя эти три условия, получим:
        return  greater_equal_for_real( my, r* (1 - mx/x0) )
                && less_equal_for_real( my, y0*(1 - mx/x0) )
                && less_equal_for_real( my, r*(1 + x0/hip) );      
    }
}
/////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    //Пусть мы имеем равнобедренный треугольник, лежащий основанием на оси X,
    //а его верхняя вершина лежит на оси Y.
    //Тогда мы можем задать этот треугольник координатой x0 правой нижней вершины
    //и координатой y0 верхней вершины.
    //Тогда радиус r вписанной окружности будет равен:
    //  r = S / p, где S - площадь треугольника, а p - его полупериметр, т.е.
    //  S = x0 * y0,
    //  p = x0 + sqrt(x0^2 + y0^2).
    std::cout << "Введите длины отрезков, которые отсекает на осях координат"
              << std::endl
              << "правая сторона равнобедренного треугольника:"
              << std::endl;
 
    T_real  x0 = 0;
    do
    {
        std::cout << "x0 = ";
        std::cin >> x0;    
    }while(less_equal_for_real(x0, 0.0));
       
    T_real  y0 = 0;
    do
    {
        std::cout << "y0 = ";
        std::cin >> y0;    
    }while(less_equal_for_real(y0, 0.0));  
    
    for(;;)
    {
        std::cout << std::endl
                  << std::endl
                  << std::endl
                  << std::endl
                  << std::endl
                  << "Введите координаты точки M:"
                  << std::endl
                  << "\tMx = ";
        T_real  mx = 0;
        std::cin >> mx;
        std::cout << "\tMy = ";
        T_real  my = 0;
        std::cin >> my;
 
        std::cout << "Точка"
                  << (point_belongs_to_area(mx, my, x0, y0) ? "" : " НЕ")
                  << " принадлежит заданной области.";
    }
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru