С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 16.02.2017
Сообщений: 20

Вычислить минимальное расстояние между точкой треугольника и точкой окружности

14.05.2018, 09:05. Показов 3819. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите,нужно вычислить минимальное расстояние между точкой треугольника и точкой окружности.Треугольник задаётся тремя точками,окружность-центром и радиусом.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.05.2018, 09:05
Ответы с готовыми решениями:

Разность потенциалов между точкой заряженного шара и точкой на его поверхности
Полый шар радиуса 3R и размером полости радиуса R (смотрите рисунок 2), заряжен зарядом с объёмной плотностью ро , которая зависит...

Найти разность потенциалов между точкой на оси цилиндра и точкой на его поверхности
:wall:

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

17
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
14.05.2018, 09:58
S0kkadt, Берем 3 стороны, находим расстояния между этими сторонами (как отрезками) и кругом, выбираем из них минимальное.
Теперь, как найти расстояние между отрезком и кругом? Надо записать уравнение отрезка в параметрическом виде X = At + (1-t)B (0<=t <=1, X, A, B - векторы) и найти минимум при этих условиях.
Отдельно рассмотреть вопрос о пересечении отрезка и окружности и пападании его целиком внутрь круга..
0
0 / 0 / 0
Регистрация: 16.02.2017
Сообщений: 20
14.05.2018, 12:27  [ТС]
Байт, что-то я совсем не понимаю ,как это должно работать,не могли бы вы привести некоторый пример реализации данной идеи?
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
14.05.2018, 13:03
S0kkadt, точки треугольника и центр окружности координатами задаются?
0
0 / 0 / 0
Регистрация: 16.02.2017
Сообщений: 20
14.05.2018, 13:07  [ТС]
qwe123qwea, да
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
14.05.2018, 14:14
S0kkadt,
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
#include <iostream>
#include <cmath>
using namespace std;
 
struct sDot
{
    double x;
    double y;
    sDot() : x(0.0), y(0.0){}
};
 
int main(int argc, char *argv[])
{
    (void)argc;
    (void)argv;
    setlocale(LC_ALL, "");
 
    sDot CentreCircle; double Radius = 0.0;
    cout << "Введите координаты центра O окружности: ";
    cin>>CentreCircle.x;
    cin>>CentreCircle.y;
    cout << "Введите радиус окружности: R = ";
    cin>>Radius;
 
    sDot VertexTriangleA;
    cout << "Введите координаты вершины A треугольника: ";
    cin>>VertexTriangleA.x;
    cin>>VertexTriangleA.y;
 
    sDot VertexTriangleB;
    cout << "Введите координаты вершины B треугольника:";
    cin>>VertexTriangleB.x;
    cin>>VertexTriangleB.y;
 
    sDot VertexTriangleC;
    cout << "Введите координаты вершины C треугольника: ";
    cin>>VertexTriangleC.x;
    cin>>VertexTriangleC.y;
 
    system("cls");
    cout << "Окружность с центров в точке О(" << CentreCircle.x << "; " << CentreCircle.y << ") и радиусом R = " << Radius << endl;
    cout << "Треуголиник с вершинами: A(" << VertexTriangleA.x << "; " << VertexTriangleA.y << "), "
                                     "B(" << VertexTriangleB.x << "; " << VertexTriangleB.y << "), "
                                     "C(" << VertexTriangleC.x << "; " << VertexTriangleC.y << ")" << endl;
 
    double OA = 0.0, OB = 0.0, OC = 0.0;
 
    OA = sqrt(pow((VertexTriangleA.x - CentreCircle.x), 2) + pow((VertexTriangleA.y - CentreCircle.y), 2)) - Radius;
    OB = sqrt(pow((VertexTriangleB.x - CentreCircle.x), 2) + pow((VertexTriangleB.y - CentreCircle.y), 2)) - Radius;
    OC = sqrt(pow((VertexTriangleC.x - CentreCircle.x), 2) + pow((VertexTriangleC.y - CentreCircle.y), 2)) - Radius;
 
    double min = OA;
    if(min > OB)
        min = OB;
    if(min > OC)
        min = OC;
 
    if(min == OA)
        cout << "Минимальное расстояние от окружности до вершины A(" << VertexTriangleA.x << "; " << VertexTriangleA.y << ") и равно " << min << endl;
    else if(min == OB)
        cout << "Минимальное расстояние от окружности до вершины B(" << VertexTriangleB.x << "; " << VertexTriangleB.y << ") и равно " << min << endl;
    else
        cout << "Минимальное расстояние от окружности до вершины C(" << VertexTriangleC.x << "; " << VertexTriangleC.y << ") и равно " << min << endl;
 
    system("pause");
    return 0;
}
Добавлено через 41 минуту
Вот это:
C++
1
2
3
4
5
double min = OA;
if(min > OB)
    min = OB;
if(min > OC)
    min = OC;
можно заменить на это:
C++
1
double min = ((OA < OB) & (OA < OC)) ? OA : ((OB < OA) & (OB < OC)) ? OB : OC;
0
0 / 0 / 0
Регистрация: 16.02.2017
Сообщений: 20
14.05.2018, 15:13  [ТС]
qwe123qwea, у вас тут рассчитывается минимальное расстояние от каждой из вершин до центра окружности,а мне нужно найти именно ближайшие точки.Вот дословно задание:Определите функцию,отыскивающую две ближайшие «точки соприкосновения» и соединяя их.
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
14.05.2018, 15:33
S0kkadt, у меня находится минимальное расстояние не до центра окружности, а до самой окружности. Если вы не заметили то в строках 48-50 от длин отрезков отнимается радиус.
0
0 / 0 / 0
Регистрация: 16.02.2017
Сообщений: 20
14.05.2018, 15:44  [ТС]
qwe123qwea, прошу прощения,действительно не заметил,только суть-то всё равно не в этом,нужно найти ближайшую точку на сторонах треугольника,а у вас считается минимальное расстояние лишь от вершин,хотя ближайшая точка отнюдь не всегда будет являться вершиной.
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
14.05.2018, 15:55
S0kkadt, понял, сейчас доделаю.
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
14.05.2018, 16:10
Отрезок AB, окружность с центром O и радиусом R, dist - искомое расстояние
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
1. Если отрезок внутри окружности (AO<R и BO<R), то
  dist=R-max(AO,BO)
2. Иначе, если одна из точек отрезка внутри окружности (AO<=R или BO<=R)
  dist=0
3. Иначе точки отрезка за окружностью (AO>R и AB>R) найдём высоту h от центра окружности к прямой AB и точку их пересечения H
3.1. Если H принадлежит отрезку AB, то
3.1.1. Если отрезок пересекает или касается окружности (h<=R), то
  dist=0
3.1.2. Иначе (h>R)
  dist=h-R
3.2. Иначе (H не принадлежит AB)
  dist=min(AO,BO)-R
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
14.05.2018, 16:23
S0kkadt,
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
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
 
struct sDot
{
    double x;
    double y;
    sDot() : x(0.0), y(0.0){}
};
 
class cLength
{
public:
    cLength(sDot center)
    {
        dot.x = center.x;
        dot.y = center.y;
    }
    void setDot1(sDot dot)
    {
        dot1.x = dot.x;
        dot1.y = dot.y;
    }
    void setDot2(sDot dot)
    {
        dot2.x = dot.x;
        dot2.y = dot.y;
    }
    double length()
    {
        return abs((dot2.y - dot1.y)*dot.x - (dot2.x - dot1.x)*dot.y + dot2.x*dot1.y - dot2.y*dot1.x)
                /sqrt(pow((dot2.x - dot1.x), 2) + pow((dot2.y - dot1.y), 2));
    }
 
private:
    sDot dot;
    sDot dot1;
    sDot dot2;
};
 
int main(int argc, char *argv[])
{
    (void)argc;
    (void)argv;
    setlocale(LC_ALL, "");
 
    sDot CentreCircle; double Radius = 0.0;
    cout << "Введите координаты центра O окружности: ";
    cin>>CentreCircle.x;
    cin>>CentreCircle.y;
    cLength len(CentreCircle);
 
    cout << "Введите радиус окружности: R = ";
    cin>>Radius;
 
    sDot VertexTriangleA;
    cout << "Введите координаты вершины A треугольника: ";
    cin>>VertexTriangleA.x;
    cin>>VertexTriangleA.y;
 
    sDot VertexTriangleB;
    cout << "Введите координаты вершины B треугольника: ";
    cin>>VertexTriangleB.x;
    cin>>VertexTriangleB.y;
 
    sDot VertexTriangleC;
    cout << "Введите координаты вершины C треугольника: ";
    cin>>VertexTriangleC.x;
    cin>>VertexTriangleC.y;
 
    system("cls");
    cout << "Окружность с центров в точке О(" << CentreCircle.x << "; " << CentreCircle.y << ") и радиусом R = " << Radius << endl;
    cout << "Треуголиник с вершинами: A(" << VertexTriangleA.x << "; " << VertexTriangleA.y << "), "
                                     "B(" << VertexTriangleB.x << "; " << VertexTriangleB.y << "), "
                                     "C(" << VertexTriangleC.x << "; " << VertexTriangleC.y << ")" << endl;
 
    double OA = 0.0, OB = 0.0, OC = 0.0;
 
    OA = sqrt(pow((VertexTriangleA.x - CentreCircle.x), 2) + pow((VertexTriangleA.y - CentreCircle.y), 2)) - Radius;
    OB = sqrt(pow((VertexTriangleB.x - CentreCircle.x), 2) + pow((VertexTriangleB.y - CentreCircle.y), 2)) - Radius;
    OC = sqrt(pow((VertexTriangleC.x - CentreCircle.x), 2) + pow((VertexTriangleC.y - CentreCircle.y), 2)) - Radius;
 
    double min1 = ((OA < OB) & (OA < OC)) ? OA : ((OB < OA) & (OB < OC)) ? OB : OC;
    double min2 = 0.0;
//        cout << "Минимальное расстояние от окружности до вершины A(" << VertexTriangleA.x << "; " << VertexTriangleA.y << ") и равно " << min << endl;
//        cout << "Минимальное расстояние от окружности до вершины B(" << VertexTriangleB.x << "; " << VertexTriangleB.y << ") и равно " << min << endl;
//        cout << "Минимальное расстояние от окружности до вершины C(" << VertexTriangleC.x << "; " << VertexTriangleC.y << ") и равно " << min << endl;
    string straight = "";
    if(min1 == OA)
    {
        len.setDot1(VertexTriangleA);
        straight += "A";
        min2 = (OB < OC) ? OB : OC;
        if(min2 == OB)
        {
            len.setDot2(VertexTriangleB);
            straight += "B";
        }
        else
        {
            len.setDot2(VertexTriangleC);
            straight += "C";
        }
    }
    else if(min1 == OB)
    {
        len.setDot1(VertexTriangleB);
        straight += "B";
        min2 = (OA < OC) ? OA : OC;
        if(min2 == OA)
        {
            len.setDot2(VertexTriangleA);
            straight += "A";
        }
        else
        {
            len.setDot2(VertexTriangleC);
            straight += "C";
        }
    }
    else
    {
        len.setDot1(VertexTriangleC);
        straight += "C";
        min2 = (OB < OA) ? OB : OA;
        if(min2 == OB)
        {
            len.setDot2(VertexTriangleB);
            straight += "B";
        }
        else
        {
            len.setDot2(VertexTriangleA);
            straight += "A";
        }
    }
 
 
    double length = len.length() - Radius;
    cout << "Минимальное расстояние до прямой " << straight.c_str() << " равно " << length << endl;
 
    system("pause");
    return 0;
}
Но это если окружность и треугольник не пересекаются.

Добавлено через 6 минут
Если строку 141 изменить на
C++
1
double length = abs(len.length() - Radius);
, тогда должно сработать если пересекаются.
0
0 / 0 / 0
Регистрация: 16.02.2017
Сообщений: 20
14.05.2018, 17:03  [ТС]
qwe123qwea,ваш код работает ,но опять же не хватает главной части,собственно того,что я как раз и не могу понять,у вас считается расстояние до прямой(т.е. в точку,куда опускается перпендикуляр),но нужно ещё проверять ,принадлежит ли эта точка отрезку...
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
14.05.2018, 22:49
S0kkadt, отрезку стороны треугольника?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
14.05.2018, 23:19
Вот тут Кот ученый - достает ли прямая до заданного отрезка на плоскости есть некоторые рассуждения на эту тему.
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
15.05.2018, 14:18
Два или три дня висит тема, и хоть бы один задал вопрос, что понимать в этой задаче под треугольником, то есть всю его внутренность или только одну границу, зато все строчат какой-то стремный код и удивляются почему он не работает.
А он и не будет работать до тех пор, пока четко и внятно не будет сформулирована задача о взаимном расположении окружности и треугольника.
0
0 / 0 / 0
Регистрация: 16.02.2017
Сообщений: 20
16.05.2018, 17:06  [ТС]
qwe123qwea, да

Добавлено через 4 минуты
Просто Саша, я уже писал,что поставлена задача найти ближайшие "точки соприкосновения".И так же я писал,что нужно найти точку лежащую на одной из сторон треугольника(т.е. как вы написали на одной из "границ").
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
16.05.2018, 22:36
Если это так, то тогда задача фактически сводится к выяснению взаимного расположения отрезка и окружности.

Прежде всего проверяется не принадлежит хотя бы одна вершина треугольника нашей окружности. Если да, ответ ноль.
Далее проверяем нет ли среди трех вершин нашего треугольника двух таких, что одна лежит внутри него, а другая вне его. Если такие две вершины найдутся, то ответ ноль.

Если мы дошли до этого места, то значит, наш треугольник, либо целиком лежит внутри нашей окружности, либо целиком вне ее.

Допустим сперва, что наш треугольник целиком лежит внутри нашей окружности. Тогда находим ту вершину, которая максимально отстоит от цента окружности. Пусть это расстояние равно L В этом случае искомое расстояние равно R - L, где R - это радиус нашей окружности.

Осталось лишь рассмотреть случай, когда треугольник целиком лежит вне нашей окружности. Этот случай немножечко похлопотливей будет, поскольку наряду с тремя вершинами нам придется рассматривать еще и прямые, проведенные через каждую пару этих вершин. Поэтому мы рассмотрим лишь одну сторону треугольника, поскольку две другие обрабатываются аналогичным образом. Проведем из центра окружности перепендикуляр к прямой, определяемой двумя нашими вершинами треугольника. Здесь возможны два случая.

Первый случай реализуется когда основание этого перепендикуляра попадает в отрезок, задаваемый двумя данными вершинами нашего треугольника. В этом случае для данной стороны - это основание перпендикуляра и есть та точка, которая является кандидатом на возможный минимум. Пусть D0 - есть расстояние от этого основания перпендикуляра до центра окружности. Тогда искомый ЕДИНСТВЕННЫЙ кандидат по данной стороне есть D0 - R.

Второй случай реализуется, когда основание этого перпендикуляра не попадает в отрезок, задаваемый двумя данными вершинами нашего треугольника. В этом случае ЕДИНСТВЕННЫМ кандидатом по данной стороне будет тот конец отрезка, который ближе всего расположен к центру окружности. И он опять же обрабатывается как и предыдущий случай.

Осталось все это выразить в коде.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.05.2018, 22:36
Помогаю со студенческими работами здесь

Расстояние между точкой и прямой, построение базиса
Есть n-мерное пространство, необходимо построить базис. Берем среднюю точку - x* , находим максимально удаленную точку от x* и строим...

Расстояние между фокусом параболы и точкой директрисы
Найти расстояние между фокусом параболы: x^2+4x-4y+24=0 и точкой ее директрисы, абсцисса которой равна 5.

Расстояние между точкой и отрезком, с абсолютной или относительной погрешностью не превышающей 0.0001
Задан отрезок S с концами в точках (x1, y1) i (x2, y2) i точка P с координатами (x, y). Нужно найти расстояние от точки P к отрезку S. ...

Составить программу, которая подсчитывает расстояние между точкой нажатия и отпускания кнопки мыши
На форме установлена метка (TLabel). Составить программу, которая подсчитывает расстояние между точкой нажатия и отпускания кнопки мыши

Определить расстояние между самой дальней и самой близкой точкой по отношению к началу координат.
С помощью действительной матрицы 2 на n на плоскости задано n точек, так, что Х1,j и Х2,j координаты j-ой точки. Определить расстояние...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru