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

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

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

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

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

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

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

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

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

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

8
nmcf
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,376
28.04.2016, 21:45 #2
Сначала аналитическое решение сделай, а после формулу запрограммируешь.
0
ambruciy
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 7
28.04.2016, 21:49  [ТС] #3
Да у меня все формулы записаны на листочке,суть решения и алгоритм есть.Но преподаватель сказал,что запрограммировать это не возможно
0
nmcf
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,376
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Эксперт С++
4385 / 2360 / 655
Регистрация: 18.10.2014
Сообщений: 4,002
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
Эксперт С++
3178 / 1705 / 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
Привет! Вот еще темы с решениями:

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

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

1) массивы 2)геометрия
Здравствуйте! Помогите пожалуйста решить задачи, очень надо! 1)Определить...

Геометрия. Симметричная точка
Доброго времени суток!:) Задача : Дана прямая, проходящая через две...


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

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

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