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

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

Восстановить пароль Регистрация
 
relax-z
0 / 0 / 0
Регистрация: 23.09.2010
Сообщений: 32
11.10.2010, 19:47     определить положение точки как это сделать? #1
Дали задание и совсем не представляю как его делать, может кто нибудь подскажет или направит с чего начать...

Вот задание:определить положение точки M(x,y) относительно заштрихованной фигуры
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2010, 19:47     определить положение точки как это сделать?
Посмотрите здесь:

Создать записи, определяющие положение точки в декартовой и в полярной системах координат. C++
как это сделать C++
Как это сделать? C++
C++ Как это сделать?
C++ Как это сделать ? [c++]
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
11.10.2010, 21:26     определить положение точки как это сделать? #2
Какие входные данные ?

Добавлено через 23 секунды
Кстати, заштрихованных фигур вроде как две ?

Добавлено через 1 минуту
И да, положение может быть указано относительно другой точки (т.е. парой координат в двухмерном пространстве), о понятии положения относительно геометрической фигуры я не слышал.
relax-z
0 / 0 / 0
Регистрация: 23.09.2010
Сообщений: 32
13.10.2010, 08:08  [ТС]     определить положение точки как это сделать? #3
входные данные вводить с клавиатуры, что бы можно было проверить любые точки.
да заштрихованных фигур две.
С++ недавно проходить начал и такое задание дают...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.10.2010, 09:05     определить положение точки как это сделать? #4
relax-z,
К Си++ "такое задание" не относится, оно относится к школьному курсу математики/геометрии. А верх сложности при реализации - использование if-else'ов. Так что ничего сверхъестественного в задании нет.
По исходным данным: Что мы должны вводить? Радиус окружности и координаты вершин треугольника даны? Или всё надо вводить с клавиатуры?
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
13.10.2010, 17:19     определить положение точки как это сделать? #5
silent_1991, окружность, как вы заметили, вписанная в треугольник. Радиус вычисляется.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.10.2010, 17:31     определить положение точки как это сделать? #6
Andrew_Lvov,
Это я понимаю (однако ещё следует точно выяснить - окружность ли это ). Тем не менее вопрос остаётся - даны ли координаты вершин треугольника. Хотя это по сути и не важно, реализация одна... Лень только в очередной раз это писать...
relax-z
0 / 0 / 0
Регистрация: 23.09.2010
Сообщений: 32
13.10.2010, 20:30  [ТС]     определить положение точки как это сделать? #7
координаты вершин треугольника не даны, с клавиатуры всё вводить нужно.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,670
14.10.2010, 09:56     определить положение точки как это сделать? #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
/////////////////////////////////////////////////////////////////////////////////////
//  Вот задание:определить положение точки 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) ? "" : " НЕ")
                  << " принадлежит заданной области.";
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2010, 12:16     определить положение точки как это сделать?
Еще ссылки по теме:

C++ нужно создать таблицу из 3 строк и 4 столбцов и заполнить её (любой информацией,это неважно) . Как это можно сделать ?
C++ Программа, определяющая положение точки в декартовой и полярной системе координат
Положение точки относительно заданного эллипса C++

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

Или воспользуйтесь поиском по форуму:
relax-z
0 / 0 / 0
Регистрация: 23.09.2010
Сообщений: 32
24.10.2010, 12:16  [ТС]     определить положение точки как это сделать? #9
спасибо, но как новичку в этой программе много не понятного
Yandex
Объявления
24.10.2010, 12:16     определить положение точки как это сделать?
Ответ Создать тему
Опции темы

Текущее время: 03:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru