Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
ambruciy
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 7
1

Геометрия в С++

28.04.2016, 21:42. Просмотров 869. Ответов 8
Метки нет (Все метки)

Даны две вершины прямоугольного треугольника A,B,так же известны угол A и угол B.Нужно найти третью вершину треугольника.Пробывал решать все через уравнение окружностей и получается,но можем ли найти неизвестную вершину,без применения системы уравнений?
Столкнулся с проблемой можем ли мы запрограммировать систему уравнений?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2016, 21:42
Ответы с готовыми решениями:

Геометрия
Г Е О М Е Т Р И Ч Е С К И Е З А Д А Ч И -> Здесь выкладываем условия и/или...

геометрия
Решите пожалуйста, ребят ( Решить задачу, используя структуру point для...

геометрия
:help::help: Даны действительные числа x, y. Вычислить расстояние от точки...

Геометрия в С++.
Здравствуйте. Помогите решить задчу: "Даны два множества точек на плоскости....

Простая геометрия
Недавно решал пачку задач на геометрию, но с одной не справился, даже сейчас не...

8
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
28.04.2016, 21:45 2
Сначала аналитическое решение сделай, а после формулу запрограммируешь.
0
ambruciy
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 7
28.04.2016, 21:49  [ТС] 3
Да у меня все формулы записаны на листочке,суть решения и алгоритм есть.Но преподаватель сказал,что запрограммировать это не возможно
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
28.04.2016, 21:53 4
Говоришь же, что решил, значит, конечные формулы есть?
0
ambruciy
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 7
28.04.2016, 22:00  [ТС] 5
Да,верно.Затрудняюсь запрограммировать систему уравнений
0
Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 308
Завершенные тесты: 1
28.04.2016, 22:07 6
Цитата Сообщение от ambruciy Посмотреть сообщение
Да,верно.Затрудняюсь запрограммировать систему уравнений
ну хотя бы формулы с листочка сюда напиши
0
ambruciy
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 7
28.04.2016, 22:22  [ТС] 7
Геометрия в С++
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4606 / 2421 / 673
Регистрация: 18.10.2014
Сообщений: 4,132
29.04.2016, 00:44 8
Лучший ответ Сообщение было отмечено ambruciy как решение

Решение

Цитата Сообщение от ambruciy Посмотреть сообщение
но можем ли найти неизвестную вершину,без применения системы уравнений?
Если AB - это именно гипотенуза нашего треугольника, а С - искомая вершина (при угле 90), то высота, опущенная из точки C на гипотенузу AB разрежет эту гипотенузу точкой D. При этом

|AD| = |AB| * cos2 α

где α - угол при вершине A. Или, альтернативно,

|BD| = |AB| * cos2 β

где β - угол при вершине B.

А расстояние |CD| может быть вычислено множеством разных способов:

|CD| = |AD| * tg α = |AB| * cos α * sin α
|CD| = sqrt(|AC|2 - |AD|2) = sqrt(|AB|2 * cos2 α - |AD|2) = sqrt(|AB| * |AD| - |AD|2)
и т.д.

Получаем алгоритм построения точки C
1. Вычислить |AD| = |AB| * cos2 α
2. Вычислить |CD|
3. Отложить на отрезке AB расстояние |AD|, тем самым получив точку D
4. Построить перпендикуляр к AB, проходящий через точку D
5. Отложить вдоль этого перпендикуляра расстояние |CD| (в любую сторону), тем самым получив искомую точку C

Добавлено через 25 минут
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
#include <iostream>
#include <cmath>
 
int main()
{
  double xA = 0, yA = 0;                       // Точка A - (0,0)
  double xB = 100, yB = 100;                   // Точка B - (100, 100)
  double aA = 30 * 3.14159 / 180;              // Угол при A - 30 градусов
 
  double 
    dxAB = xB - xA, 
    dyAB = yB - yA;
 
  double lenAB = std::sqrt(dxAB * dxAB + dyAB * dyAB);
 
  double cos2a = std::cos(aA);
  cos2a *= cos2a;
 
  double lenAD = lenAB * cos2a;
  double lenCD = lenAD * std::tan(aA);
 
  double 
    xD = xA + dxAB * lenAD / lenAB, 
    yD = yA + dyAB * lenAD / lenAB;
 
  double dxDP = dyAB, dyDP = -dxAB;            // или dxDP = -dyAB, dyDP = dxAB
  double lenDP = lenAB;
 
  double 
    xC = xD + dxDP * lenCD / lenDP, 
    yC = yD + dyDP * lenCD / lenDP;
 
  std::cout << xC << " " << yC << std::endl;
}
Добавлено через 37 минут
----------------------------

Если же AB - катет нашего треугольника (угол B - 90), а С - искомая вершина при втором катете, то можно применить тот же самый подход с опусканием высоты CD из точки C на основание AB. Однако в этом случае очевидно, что точка D совпадет с точкой B и |AD| = |AB|, т.е. искать точку D не надо

|CD| = |CB| = |AB| * tg α

и дальше - все точно так же.
0
Mr.X
Эксперт С++
3179 / 1706 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
29.04.2016, 04:59 9
ambruciy, ну, во-первых вашему преподавателю двойка за условие задачи.
С одной стороны оно избыточно, так как, чтобы определить все углы прямоугольного треугольника, достаточно знать значение одного острого угла.
С другой стороны условие недостаточно, так как не сказано с какой стороны от гипотенузы находится вершина прямого угла.
Если считать, что вершины ABC прочитаны против часовой стрелки, то:
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
//Даны две вершины прямоугольного треугольника A,B,так же известны угол A и угол B.
//Нужно найти третью вершину треугольника.
/////////////////////////////////////////////////////////////////////////////////////////
#include <complex>
#include <cmath>
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                     T_str;
typedef double                          T_coord;
typedef std::complex    < T_coord   >   T_point;
typedef T_point                         T_vect;
/////////////////////////////////////////////////////////////////////////////////////////
void    input_point_with_prompt
    (
        T_point             &   point,
        T_str       const   &   prompt
    )
{
    std::cout   <<  prompt;
    std::cin    >>  point;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    input_angle_in_degrees_with_prompt
    (
        T_coord             &   angle,
        T_str       const   &   prompt
    )
{
    std::cout   <<  prompt;
    std::cin    >>  angle;
 
    angle   /=  180;
    angle   *=  acos(-1);
}
/////////////////////////////////////////////////////////////////////////////////////////
T_point     get_right_angle_vert_of_right_triangle
    (
        T_point     A,
        T_point     B,
        T_coord     angle_A
    )
{
    T_vect      hip_AB      =   B   -   A;
 
    return      A
 
            +   std::polar
                    (
                            abs( hip_AB     )
                        *   cos( angle_A    ),
 
                            arg( hip_AB     )
                        +   angle_A
                    );
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    T_point     A;
    T_point     B;
    T_coord     angle_A;
 
    for(;;)
    {
        std::cout   <<  "Enter coordinates of acute vertices of rectangular triangle."
                    <<  std::endl;
 
        input_point_with_prompt
            (
                A,
                "A as (1.2,3.4)\t\t: "
            );
 
        input_point_with_prompt
            (
                B,
                "B as (1.2,3.4)\t\t: "
            );
 
        input_angle_in_degrees_with_prompt
            (
                angle_A,
                "angle_A in degrees\t: "
            );
 
        std::cout   <<  std::endl
                    <<  "Coordinates of vertex C of right angle "
 
                    <<  get_right_angle_vert_of_right_triangle
                            (
                                A,
                                B,
                                angle_A
                            )
 
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl;
    }//for
}
0
29.04.2016, 04:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2016, 04:59

Вычислительная геометрия на С
Заданы координаты N точек. Определить те две точки, проведенная через которые...

Геометрия и графика
Решить задачу и отобразить решение графически на экране. Исходные данные...

Геометрия(треугольник)
Даны два угла треугольника (в градусах). Определить, существует ли такой...


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

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

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