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

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

14.05.2018, 09:05. Показов 3847. Ответов 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
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru