Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 02.07.2022
Сообщений: 1

Трёхмерный треугольник

02.07.2022, 08:14. Показов 3349. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Заданы три точки в трёхмерном пространстве. Требуется найти точку, сумма расстояний от которой до заданных точек минимальна, и вывести соответствующую сумму.

Формат ввода
Вход состоит из трёх строк, каждая из которых содержит три целых числа x, y, z (-109 ≤ x, y, z ≤ 109) — координаты точек.

Формат вывода
Выведите одно число — минимально возможную сумму расстояний от точки в пространстве до заданных точек с абсолютной или относительной погрешностью не хуже 10-4.

На любом яп спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.07.2022, 08:14
Ответы с готовыми решениями:

Создать базовый класс Треугольник с 2 наследниками: Равносторонний треугольник, Прямоугольный треугольник
Задание звучит так: Нужно создать базовый класс Треугольник с двумя наследующими его классами - равносторонний треугольник (·...

Класс треугольник с произвольным классом - равнобедренный треугольник
Создать класс треугольник, члены класса - длины 3-х сторон. Предусмотреть в классе методы проверки существования треугольника, вычисления и...

Класс треугольник, найти треугольник максимальной площади
Реализовать класс треугольников. Для некоторого множества заданных координатами своих вершин треугольников, найти треугольник максимальной...

40
6 / 5 / 1
Регистрация: 29.06.2022
Сообщений: 9
05.07.2022, 07:14
Студворк — интернет-сервис помощи студентам
В треугольнике с углами до 120 градусов самая маленькая сумма расстояний до вершин находится в точке Ферма
Кликните здесь для просмотра всего текста
H - точка Ферма
I - точка пересечения биссектрис
D - не обращать внимания
o - сумма расстояний до точки Ферма
u - сумма расстояний до пересечения биссектрис
v - сумма расстояний до остальных вершин (AB + AC)

В треугольнике с углами больше 120 градусов самая маленькая сумма расстояний до вершин находится в точке этого угла
Кликните здесь для просмотра всего текста

Для поклонников медиан(там все еще грустнее)
Кликните здесь для просмотра всего текста
3
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
05.07.2022, 07:27
Судя по википелии https://ru.wikipedia.org/wiki/Точка_Ферма:
Если один из углов треугольника ABC больше 1200, то X лежит вне треугольника ABC, а точка Ферма S совпадает с вершиной тупого угла
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
05.07.2022, 07:39
В цитате 1200 означает 120 (градусов), а не 120 в степени 0, если вдруг не совсем понятно.

Добавлено через 4 минуты
VasyIzLesa, получается, что второй рисунок не совсем верный.
0
Объявлятель переменных
 Аватар для SpBerkut
1225 / 411 / 321
Регистрация: 24.09.2011
Сообщений: 1,279
05.07.2022, 08:26
Как-то так. Надо бы ещё с величиной шага разобраться, но пока, вроде бы, и так довольно неплохо получилось.
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
#include <iostream>
#include <cmath>
 
struct point {
    double x;
    double y;
    double z;
};
 
point operator* (const double &d, const point &p) {
    return {p.x*d, p.y*d, p.z*d};
}
 
point operator* (const point &p, const double &d) {
    return {p.x*d, p.y*d, p.z*d};
}
 
point operator/ (const point &p, const double &d) {
    return {p.x/d, p.y/d, p.z/d};
}
 
point operator+ (const point &a, const point &b) {
    return {a.x+b.x, a.y+b.y, a.z+b.z};
}
 
point operator- (const point &a, const point &b) {
    return {a.x-b.x, a.y-b.y, a.z-b.z};
}
 
double f(const point A, const point B, const point C, const point P) {
    return hypot(hypot(A.x-P.x, A.y-P.y), A.z-P.z) + 
           hypot(hypot(B.x-P.x, B.y-P.y), B.z-P.z) +
           hypot(hypot(C.x-P.x, C.y-P.y), C.z-P.z);
}
 
point getGradient(const point A, const point B, const point C, const point P, double eps = 0.0001) {
    point result;
    
    result.x = (f(A, B, C, {P.x+eps,P.y,P.z}) - f(A, B, C, {P.x-eps,P.y,P.z})) / (2*eps);
    result.y = (f(A, B, C, {P.x,P.y+eps,P.z}) - f(A, B, C, {P.x,P.y-eps,P.z})) / (2*eps);
    result.z = (f(A, B, C, {P.x,P.y,P.z+eps}) - f(A, B, C, {P.x,P.y,P.z-eps})) / (2*eps);
    
    return result;
}
 
int main()
{
    // 38.7644 // 14.6261 // 9.1231
    point A = {38, 38, 0}; // 2, 7, 3 // 1, 3, 0 
    point B = {54, 34, 0}; // 1, -2, 0 // 5, 6, 0
    point C = {66, 53, 0}; // 3, 1, -5 //6, 10, 0
    point P = A;
    double eps = 0.0001, step = 2000, len = 0.0, cnt = 0.0;
    do {
        len = f(A,B,C,P);
        P = P - step*getGradient(A,B,C,P);
        step *= 0.9;
        cnt++;
    } while (fabs(len - f(A,B,C,P)) > eps);
    std::cout << P.x << ' ' << P.y << ' ' << P.z << ' ' << f(A,B,C,P) << ' ' << cnt;
}
2
6 / 5 / 1
Регистрация: 29.06.2022
Сообщений: 9
05.07.2022, 08:29
Цитата Сообщение от gunslinger Посмотреть сообщение
получается, что второй рисунок не совсем верный.
Что-то этот Ферми "темнит" с построением
Кликните здесь для просмотра всего текста
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
05.07.2022, 09:18
"Английская" википедия говорит то же самое (только угол в 120 градусов включается) https://en.wikipedia.org/wiki/Fermat_point:
Case 1. The triangle has an angle ≥ 120°
...
the Fermat point lies at the obtuse-angled vertex
Случай 1. Угол треугольника ≥ 120°
...
точка Ферма лежит в тупоугольной вершине
Case 2. The triangle has no angle ≥ 120°
...
the Fermat point is coincident with the first isogonic center
Случай 2. В треугольнике нет углов ≥ 120°
...
точка Ферма совпадает с первым изогоническим центром
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
05.07.2022, 10:06
Цитата Сообщение от VasyIzLesa Посмотреть сообщение
В треугольнике с углами больше 120 градусов самая маленькая сумма расстояний до вершин находится в точке этого угла
Тут я не согласен, ведь тогда искомая точка будет являться углом треугольника, а не отдельной точкой.
А вот если все три угла треугольника, будут находится практически на одной линии, тогда да. То есть тупой угол должен быть почти 180 градусов.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.07.2022, 11:22
Цитата Сообщение от SpBerkut Посмотреть сообщение
C++
1
hypot(hypot(C.x-P.x, C.y-P.y), C.z-P.z)
В c++ 17 есть 3Д std::hypot() с тремя аргументами.
0
Объявлятель переменных
 Аватар для SpBerkut
1225 / 411 / 321
Регистрация: 24.09.2011
Сообщений: 1,279
05.07.2022, 11:41
Цитата Сообщение от politoto Посмотреть сообщение
В c++ 17 есть 3Д std::hypot() с тремя аргументами.
Знаю. Я в rextester'е не разобрался, как 17-й подключить.

Добавлено через 5 минут
Вот же ж зараза. Попробовал сейчас те же действия, что и утром, и всё заработало.
0
6 / 5 / 1
Регистрация: 29.06.2022
Сообщений: 9
05.07.2022, 12:18
Цитата Сообщение от мама Стифлера Посмотреть сообщение
Тут я не согласен, ведь тогда искомая точка будет являться углом треугольника, а не отдельной точкой.
ну можно отступить от этой точки по биссектрисе на
Цитата Сообщение от karimNeymenu Посмотреть сообщение
абсолютной или относительной погрешностью не хуже 10-4
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
05.07.2022, 12:43
Цитата Сообщение от мама Стифлера Посмотреть сообщение
ведь тогда искомая точка будет являться углом треугольника, а не отдельной точкой.
А чем тебе угол как точка не понравился?
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
05.07.2022, 14:19
Цитата Сообщение от Байт Посмотреть сообщение
А чем тебе угол как точка не понравился?
Тут скорее VasyIzLesa прав. Ведь не даром указана погрешность вычисления точки. А угол треугольника, это угол фигуры. Но в задаче требуется найти новую точку. То есть, какой бы не был угол и если позволяет погрешность, то это будет новая точка, отличная от точки угла треугольника. И если только погрешность превышена, тогда новая точка должна совпасть с углом треугольника.
Это просто мои логические рассуждения. Всегда могу ошибаться.

Добавлено через 16 минут
Как еще объяснить мое понимание: Допустим тупой угол треугольника = 179.1113 градусов. Если искомая точка по координатам на плоскости превышает заданную погрешность(10-4), тогда да, можно приравнять эту точку к углу треуголника. В противном случае, это должна быть новая точка.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
05.07.2022, 19:08
Можно и неитерационно найти эту точку.
Я только не могу сообразить, как построить третью точку в плоскости этого самого треугольника...
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
06.07.2022, 07:54
https://www.cyberforum.ru/cgi-bin/latex.cgi? \vec{a}\times \vec{b} \times \vec{a} даёт перепендикуляр к a в одной плоскости с a и b
0
Объявлятель переменных
 Аватар для SpBerkut
1225 / 411 / 321
Регистрация: 24.09.2011
Сообщений: 1,279
06.07.2022, 09:33
Долбаные численные методы! Где-то копится ошибка. Или в вычислении производной, или в вычислении градиента, или в определении шага. А может везде понемногу. Но результат очень близок к аналитическому, что радует.

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
#include <iostream>
#include <cmath>
 
struct Point {
    double x, y, z;
};
 
struct Triangle {
    Point A, B, C;
};
 
Point operator* (const double &d, const Point &p) {
    return {p.x*d, p.y*d, p.z*d};
}
 
Point operator* (const Point &p, const double &d) {
    return {p.x*d, p.y*d, p.z*d};
}
 
Point operator/ (const Point &p, const double &d) {
    return {p.x/d, p.y/d, p.z/d};
}
 
Point operator+ (const Point &a, const Point &b) {
    return {a.x+b.x, a.y+b.y, a.z+b.z};
}
 
Point operator- (const Point &a, const Point &b) {
    return {a.x-b.x, a.y-b.y, a.z-b.z};
}
 
double f(const Triangle T, const Point P) {
    return std::hypot(T.A.x-P.x, T.A.y-P.y, T.A.z-P.z) + 
           std::hypot(T.B.x-P.x, T.B.y-P.y, T.B.z-P.z) +
           std::hypot(T.C.x-P.x, T.C.y-P.y, T.C.z-P.z);
}
 
Point getGradient(const Triangle T, const Point P, double eps = 0.0001) {
    Point result;
    result.x = f(T, {P.x+eps,P.y,P.z}) - f(T, {P.x-eps,P.y,P.z});
    result.y = f(T, {P.x,P.y+eps,P.z}) - f(T, {P.x,P.y-eps,P.z});
    result.z = f(T, {P.x,P.y,P.z+eps}) - f(T, {P.x,P.y,P.z-eps});
    return result / (2*eps);
}
 
double df(const Triangle T, const Point P, const Point grad, double x, double eps = 0.0001) {
    return (f(T, P - (x+eps)*grad) - f(T, P - (x-eps)*grad)) / (2*eps);
}
 
double getStep(const Triangle T, const Point P, double eps = 0.0001) {
    Point grad = getGradient(T, P, eps);
    double lx = 0.01, rx = lx, cx, df1;
    if (df(T, P, grad, lx, eps) >= 0) return lx;
    while (df(T, P, grad, rx, eps) < 0) rx *= 2;
    do {
        cx = (lx + rx) / 2;
        df1 = df(T, P, grad, cx, eps);
        if (df1 > 0) {
            rx = cx;
        } else {
            lx = cx;
        }
    } while (fabs(df1) > eps);
    return cx;
}
 
int main()
{
    Triangle Ts[] = {
                        { {1, 3, 0}, {5, 6, 0}, {6, 10, 0} },       // 9.1231
                        { {38, 38, 0}, {54, 34, 0}, {66, 53, 0} },  // 38.7644
                        { {2, 7, 3}, {1, -2, 0}, {3, 1, -5} },      // 14.6261
                        { {20, 73, 0}, {17, -42, 0}, {-12, 51, 0} } // 135.5567
                    };
    Triangle T = Ts[3];
    double crutch = 10.0;
    T.A = T.A*crutch; T.B = T.B*crutch; T.C = T.C*crutch; // Первый костыль
    Point P = T.A;
    double eps = 0.0001, step = 0.0, len = 0.0, cnt = 0.0;
    do {
        len = f(T,P);
        step = getStep(T, P, eps);
        P = P - step * getGradient(T, P, eps);
        cnt++;
    } while (fabs(len - f(T,P)) > eps);
    T.A = T.A/crutch; T.B = T.B/crutch; T.C = T.C/crutch; P = P/crutch;  // Второй костыль
    std::cout << P.x << ' ' << P.y << ' ' << P.z << ' ' << f(T,P) << ' ' << cnt << std::endl;
}
1
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
06.07.2022, 09:59
Цитата Сообщение от politoto Посмотреть сообщение
даёт перепендикуляр к a в одной плоскости с a и b
Не могу понять, как это мне поможет.
Возможно, чего-то не замечаю?
Или я неправильно сформулировал вопрос.


Я не могу придумать способ посчитать координаты точки D в 3д. так, чтобы она лежала в плоскости треугольника ABC
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
06.07.2022, 12:31
Цитата Сообщение от мама Стифлера Посмотреть сообщение
Как еще объяснить мое понимание:
Честно говоря, даже не пойму, что тебя смущает
Возми очень тупой угол. Отступи слегка от его вершины внутрь Расстояние до тупой вершины увеличится сильно. А до остальных - умкеньшится чуть-чуть
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
06.07.2022, 12:47
Цитата Сообщение от SpBerkut Посмотреть сообщение
копится ошибка. Или в вычислении производной, или в вычислении градиента
При вычислении вычитаются близкие величины, поэтому в результате большая относительная погрешность.
0
Объявлятель переменных
 Аватар для SpBerkut
1225 / 411 / 321
Регистрация: 24.09.2011
Сообщений: 1,279
06.07.2022, 19:26
Цитата Сообщение от politoto Посмотреть сообщение
При вычислении вычитаются близкие величины, поэтому в результате большая относительная погрешность.
Так и есть. Прогнал вручную, и выяснилось, что величина шага становится меньше заданной точности на расстоянии от искомого минимума, превышающем эту же точность.

По теме.
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
#include <iostream>
#include <cmath>
 
#define D60 1.0471975511965977461542144610932 // 60° в радианах
 
struct Vector3D {
    double x, y, z;
};
 
struct Matrix {
    Vector3D A, B, C;
};
 
// квадрат числа
double sqr(const double x) {
    return x*x;
}
 
// формирование матрицы поворота
Matrix getRotationMatrix(const Vector3D &V, double angle) {
    double sina = sin(angle);
    double cosa = cos(angle);
    return {
                { cosa + (1 - cosa)*sqr(V.x), (1 - cosa)*V.x*V.y - sina*V.z, (1 - cosa)*V.x*V.z + sina*V.y },
                { (1 - cosa)*V.x*V.y + sina*V.z, cosa + (1 - cosa)*sqr(V.y), (1 - cosa)*V.y*V.z - sina*V.x },
                { (1 - cosa)*V.x*V.z - sina*V.y, (1 - cosa)*V.y*V.z + sina*V.x, cosa + (1 - cosa)*sqr(V.z) }
           };
}
 
// транспонирование матрицы. Решил поразвлекаться и запихал это в оператор
Matrix operator! (const Matrix &M) {
    return { {M.A.x, M.B.x, M.C.x},
             {M.A.y, M.B.y, M.C.y},
             {M.A.z, M.B.z, M.C.z} };
}
 
// векторное произведение
Vector3D operator* (const Vector3D &A, const Vector3D &B) {
    return {A.y * B.z - A.z * B.y, A.z * B.x - A.x * B.z, A.x * B.y - A.y * B.x};
}
 
// произведение матрицы 3х3 и вектора
Vector3D operator* (const Matrix &M, const Vector3D &V) {
    return { M.A.x * V.x + M.A.y * V.y + M.A.z * V.z,
             M.B.x * V.x + M.B.y * V.y + M.B.z * V.z,
             M.C.x * V.x + M.C.y * V.y + M.C.z * V.z };
}
 
// частное вектора и числа
Vector3D operator/ (const Vector3D &A, const double x) {
    return {A.x / x, A.y / x, A.z / x};
}
 
// сумма двух векторов
Vector3D operator+ (const Vector3D &A, const Vector3D &B) {
    return {A.x + B.x, A.y + B.y, A.z + B.z};
}
 
// разность двух векторов
Vector3D operator- (const Vector3D &A, const Vector3D &B) {
    return {A.x - B.x, A.y - B.y, A.z - B.z};
}
 
// вывод вектора
std::ostream& operator << (std::ostream& out, const Vector3D V) {
    return out << V.x << "," << V.y << "," << V.z;
}
 
// расстояние между двумя точками
double getDistance(const Vector3D &A, const Vector3D &B) {
    return std::hypot(A.x - B.x, A.y - B.y, A.z - B.z);
}
 
// модуль вектора
double getDistance(const Vector3D &A) {
    return std::hypot(A.x, A.y, A.z);
}
 
// возвращает единичный вектор, путём деления исходного на модуль. Возможно, нужно назвать getOrt
Vector3D getOrth(const Vector3D &V) {
    return V / getDistance(V);
}
 
// вычисляем точку пересечения прямых AB и CD. Если прямые скрещиваются, то всё равно что-то вернёт. До конца не въехал ещё
// единственная функция, реализацию которой слямзил где-то на форуме. Перекурочил нулевые знаменатели. Вроде работает
Vector3D getIntersection(const Vector3D &A, const Vector3D &B, const Vector3D &C, const Vector3D &D){
    Vector3D P = B - A;
    Vector3D Q = D - C;
    return {
               ((P.y * Q.x - Q.y * P.x)?(A.x * P.y * Q.x - C.x * Q.y * P.x - A.y * P.x * Q.x + C.y * P.x * Q.x) /
               (P.y * Q.x - Q.y * P.x):0),
               ((P.x * Q.y - Q.x * P.y)?(A.y * P.x * Q.y - C.y * Q.x * P.y - A.x * P.y * Q.y + C.x * P.y * Q.y) /
               (P.x * Q.y - Q.x * P.y):0),
               ((P.y * Q.z - Q.y * P.z)?(A.z * P.y * Q.z - C.z * Q.y * P.z - A.y * P.z * Q.z + C.y * P.z * Q.z) /
               (P.y * Q.z - Q.y * P.z):0)
            };
}
 
int main()
{
    Vector3D P[] = { {2, 7, 3}, {1, -2, 0}, {3, 1, -5} };                  // массив вершин трегольника
    //std::cout << P[0] << ' ' << P[1] << ' ' << P[2] << ' ' << P[0] << "  \n";    // вывод для AutoCAD'a
    double dist[] = {0, 0, 0};                                                   // массив длин сторон, лежащих напротив вершин
    for (unsigned i = 0; i < 3; i++) {
        dist[i] = getDistance(P[(i + 1) % 3], P[(i + 2) % 3]);                   // вычисление массива длин
    }
    Vector3D R = {0, 0, 0};                                                      // вектор-результат
    
    // сначала ищем углы больше 120°. Перебираем вершины, по теореме косинусов находим угол. Если угол при вершине больше 120°, то это ответ
    bool find = false;
    for (unsigned i = 0; i < 3; i++) {
        if ((sqr(dist[(i + 1) % 3]) + sqr(dist[(i + 2) % 3]) - sqr(dist[i])) / (dist[(i + 1) % 3] * dist[(i + 2) % 3]) <= -1.0) {
            find = true;
            R = P[i];
            break;
        }
    }
    
    // если ничего не нашли, то ищем точку Ферма внутри треугольника
    if (!find) {
        Vector3D T1, T2, A_, B_;
        Vector3D orth = getOrth((P[1] - P[0]) * (P[2] - P[0])); // единичный вектор-нормаль к плоскости треугольника
        Matrix MR = getRotationMatrix(orth, D60);               // матрица поворота относительно нормали на 60° D60 = M_PI/3
        Matrix ML = !MR; // транспонирование                    // она же, но в другую сторону
 
        T1 = MR * (P[1] - P[0]) + P[0];                                // крутим первую точку относительно нулевой вправо
        T2 = ML * (P[1] - P[0]) + P[0];                                // и влево. Крутим в плоскости треугольника
        // Выбираем ту из двух, которая дальше от второй. Та, что дальше — выкручена наружу треугольника
        A_ = ((getDistance( T1, P[2] ) > getDistance( T2, P[2] )) ? T1 : T2 );
        
        // аналогично крутим вторую относительно первой. Оставляем ту, что дальше от нулевой
        T1 = MR * (P[2] - P[1]) + P[1];
        T2 = ML * (P[2] - P[1]) + P[1];
        B_ = ((getDistance( T1, P[0] ) > getDistance( T2, P[0] )) ? T1 : T2 );
        R = getIntersection(P[2], A_, P[0], B_); // вычисляем результат как пересечение отрезков [P[2], A_] и [P[0], B_]
    }
    
    std::cout << '(' << R << ')' << '\t' << getDistance(P[0],R) + getDistance(P[1],R) + getDistance(P[2],R);
}
Чую, что заработал левел-ап в векторах.
2
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
06.07.2022, 19:47
А можно не совсем посвященному в геометрии, все же указать какой принцип тут пытаются реализовать ?
Все же через точку Ферма?
Нить вашего исследования совсем потерял ...

Добавлено через 1 минуту
А что там на счет того что их может быть несколько ?
Теорема Лестера. В любом разностороннем треугольнике две точки Ферма, центр девяти точек и центр описанной окружности лежат на одной окружности
Добавлено через 9 минут
Хм, кажется я понял о чем вы тут.
Теорема [3,4]. Точка Ферма-Торричелли существует только для треугольника
P1P2P3
, у которого величина каждого угла меньше 2π/3
В этом случае она единственна

Если величина одного из углов треугольника
≥2π/3
, то минимум достигается при помещении точки P в эту вершину.
Но еще остался нюанс с погрешностью ? С ней то что не так ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.07.2022, 19:47

Построить треугольник Паскаля. Используя треугольник Паскаля, вычислить 𝑘−ое число Фиббоначчи. Нумерация чисел Фиббона
#include &lt;iostream&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;Russian&quot;); int n; //ввод кол-ва строк в...

Трехмерный график
Здравствуйте! Подскажите, пожалуйста, какой костыль можно использовать, чтобы в код прикрутить рисование трёхмерного графика по точкам в...

Трехмерный график
Приветствую вас. Уважаемы профи, прошу помочь в следующей задаче. Мне нужно нарисовать 3d график, т.е. пользователь задает координаты...

Трехмерный массив
// Arrays.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &quot;iostream&quot; using...

Трёхмерный массив в Функцию
Трёхмерный массив в Функцию нужно засунуть и изменять значение переменой которую передали в неё как реализовать ?! #include...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru