Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/64: Рейтинг темы: голосов - 64, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 11.04.2020
Сообщений: 67

Напишите метод вычисления расстояния от отрезка до точки

02.10.2021, 16:27. Показов 13959. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сама задача:

Напишите метод вычисления расстояния от отрезка до точки.
Для проверки своего решения запустите скачанный проект.
Расстоянием от отрезка до точки называется расстояние от ближайшей точки отрезка до точки. Это либо расстояние до точки от прямой, содержащей отрезок, либо расстояние до точки от одного из концов отрезка.

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
using System;
 
namespace DistanceTask
{
    public static class DistanceTask
    {
        // Расстояние от точки (x, y) до отрезка AB с координатами A(ax, ay), B(bx, by)
        public static double GetDistanceToSegment(double ax, double ay, double bx, double by, double x, double y)
        {
            double a = Math.Sqrt(((x - ax) * (x - ax)) + ((y - ay) * (y - ay)));
            double b = Math.Sqrt(((x - bx) * (x - bx)) + ((y - by) * (y - by)));
            double c = Math.Sqrt(((ax - bx) * (ax - bx)) + ((ay - by) * (ay - by)));
 
            if (x >= ax && x <= bx && b != 0)
            {
 
                                double e = (a + b + c) / 2.0;
                                double f = Math.Sqrt((e * (e - a) * (e - b) * (e - c)));
 
                                return (2.0 * f) / c;
                            }
                    else if ((x <= ax || x >= bx) && c != 0)
                    {
                        return Math.Min(a, b);
                    }
                    else return 0;
        }
    }
}
P.S. Не проходит все тесты в визуалке.А при сдаче кода выдает ошибку:
Error on test: segment AB({X=2, Y=-2},{X=-1, Y=1}) and point X({X=2, Y=2}) expected dist 2.82842712474619 but was 3.16227766016838
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.10.2021, 16:27
Ответы с готовыми решениями:

Напишите метод вычисления расстояния от отрезка до точки
// Вставьте сюда финальное содержимое файла DistanceTask.cs using System; namespace DistanceTask { public static class...

Нахождение расстояния от точки до отрезка
Написать программу на С находящую расстояние от точки до отрезка

Разработать метод вычисления длины отрезка по координатам и метод для проверки треугольника
Нужна помощь.Разработать метод f(x1,y1,x2,y2), который вычисляет длину отрезка по координатам вершин(x1,y1) и (x2,y2), и метод t(a,b,c),...

42
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
02.10.2021, 18:20
rrll, сильно не вникал.
По моему, вот так должно быть условие:
C#
14
            if (x > ax && x < bx && b != 0)
0
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
02.10.2021, 18:21
Неправильно выбрали минимальное расстояние.
C#
1
2
3
var r1 = (2.0 * f) / c;
      var r2 = Math.Min(a, b);
      return Math.Min(r1, r2);
1
1 / 1 / 0
Регистрация: 11.04.2020
Сообщений: 67
02.10.2021, 21:46  [ТС]
Элд Хасп,к сожалению не помогло..

Добавлено через 1 минуту
Fylhtq05,Может я не туда вписываю,но мне выдает ошибку о том,что имя r1,r2 не существует в текущем контексте.Можете пожалуйста вставить в мой код где это должно находиться.Буду очень благодарен!
0
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
02.10.2021, 22:35
Цитата Сообщение от rrll Посмотреть сообщение
выдает ошибку о том,что имя r1,r2 не существует в текущем контексте
Вы пишите перед этим var или double?
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
using System;
namespace ConsoleApp
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine(DistanceTask.GetDistanceToSegment(2, -2, -1, 1, 2, 2));
    }
  }
  public static class DistanceTask
  {
    // Расстояние от точки (x, y) до отрезка AB с координатами A(ax, ay), B(bx, by)
    public static double GetDistanceToSegment(double ax, double ay, double bx, double by, double x, double y)
    {
      double a = Math.Sqrt(((x - ax) * (x - ax)) + ((y - ay) * (y - ay)));
      double b = Math.Sqrt(((x - bx) * (x - bx)) + ((y - by) * (y - by)));
      double c = Math.Sqrt(((ax - bx) * (ax - bx)) + ((ay - by) * (ay - by)));
      double e = (a + b + c) / 2.0;
      double f = Math.Sqrt((e * (e - a) * (e - b) * (e - c)));
      var r1 = (2.0 * f) / c;
      var r2 = Math.Min(a, b);
      return Math.Min(r1, r2);
    }
  }
}
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
02.10.2021, 22:45
Цитата Сообщение от Fylhtq05 Посмотреть сообщение
Вы пишите перед этим var или double?
А какая в данном случае разница?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
02.10.2021, 22:45
Fa4stik, предложенное решение проходит тесты? (соседняя тема - Скалярное произведение векторов)
0
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
02.10.2021, 22:56
Цитата Сообщение от kolorotur Посмотреть сообщение
А какая в данном случае разница?
Никакой. Я это спросил с целью узнать написал ли автор что-нибудь из этого, т.к.
Цитата Сообщение от rrll Посмотреть сообщение
но мне выдает ошибку о том,что имя r1,r2 не существует в текущем контексте
Т.е. переменные не были объявлены, а сразу стали использоваться.
2
1 / 1 / 0
Регистрация: 11.04.2020
Сообщений: 67
02.10.2021, 23:21  [ТС]
Fylhtq05, К сожалению в Визуалке еще больше ошибок в тестах появилось,а при сдаче задачи стало писать:
Error on test: segment AB({X=10, Y=10},{X=10, Y=10}) and point X({X=10, Y=10}) expected dist 0 but was NaN
Не помогло

Добавлено через 39 секунд
IamRain, К большому сожалению очень много тестов остаются не пройденными..
0
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
02.10.2021, 23:26
Цитата Сообщение от rrll Посмотреть сообщение
expected dist 0 but was NaN
У вас в программе было деление на с. А оно м.б. =0. На этот случай сами корректируйте программу. Я только указал правильный выбор минимального расстояния, для правильно вычисленных значений.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
02.10.2021, 23:33
Лучший ответ Сообщение было отмечено rrll как решение

Решение

rrll, посмотрите Решение отсюда Метод возвращает неправильно расстояние от отрезка до точки

Тема отмечена как "Решённая".
3
1 / 1 / 0
Регистрация: 11.04.2020
Сообщений: 67
02.10.2021, 23:54  [ТС]
Добавлено через 13 секунд
Элд Хасп, Просмотрел,затем скопировал код и вставил в визуалку.Проходит далеко не все тесты.Ошибка при сдаче задания:
Error on test: segment AB({X=-10, Y=0},{X=10, Y=0}) and point X({X=-10, Y=0}) expected dist 0 but was NaN
Это на столько противная задачка,кошмар.
0
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
03.10.2021, 00:01
Цитата Сообщение от rrll Посмотреть сообщение
expected dist 0 but was NaN
Деление на 0. Проверяйте перед делением хоть в том, хоть в этом коде.
0
1 / 1 / 0
Регистрация: 11.04.2020
Сообщений: 67
03.10.2021, 00:14  [ТС]
Fylhtq05, Я немного не понимаю,вместо деление на c подставить 0?
0
 Аватар для Fa4stik
7 / 7 / 1
Регистрация: 04.04.2020
Сообщений: 262
03.10.2021, 00:16
Цитата Сообщение от Элд Хасп Посмотреть сообщение
rrll, посмотрите Решение отсюда Метод возвращает неправильно расстояние от отрезка до точки
У меня нет слов, спасибо большое! Не представляете, как сильно помогли!
0
1 / 1 / 0
Регистрация: 11.04.2020
Сообщений: 67
03.10.2021, 00:19  [ТС]
Fa4stik, Я пока еще не осилил,но я к этому по тихоньку иду
0
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
03.10.2021, 00:28
Перед делением проверяйте, чему равен с. с это длина отрезка. Если 0, это значит, что отрезка нет (одна и та же точка). Вам в этом случае нужно определить расстояние между двумя точками (сумма квадратов) и это будет ответом.
0
1 / 1 / 0
Регистрация: 11.04.2020
Сообщений: 67
03.10.2021, 00:34  [ТС]
Элд Хасп, Я был не прав,я все же решил еще раз перепроверить тот код,на который вы мне указали ссылкой.Все там правильно,видимо я уже "поплыл".Большое спасибо.
Так же спасибо и вам Fylhtq05,за то что принимали участие в помощи!
TopLayer,вы не представляете на сколько ваше решение сейчас пользуется спросом среди студентов
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
03.10.2021, 10:49
Лучший ответ Сообщение было отмечено rrll как решение

Решение

Цитата Сообщение от rrll Посмотреть сообщение
метод вычисления расстояния от отрезка до точки
Полный код с комментариями и тегами XML документации:
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
using System;
 
/// <summary>Типы и методы различных данных.</summary>
namespace Data
{
    /// <summary>Методы для плоской геометрии.</summary>
    public static class Plane
    {
        /// <summary>Вычисляет расстояние между двумя точками на плоскости.</summary>
        /// <param name="aX">Координата X точки A.</param>
        /// <param name="aY">Координата Y точки A.</param>
        /// <param name="bX">Координата X точки B.</param>
        /// <param name="bY">Координата Y точки B.</param>
        /// <returns>Расстояние между точками A и B.</returns>
        public static double Distance(double aX, double aY, double bX, double bY)
        {
            double dX = aX - bX;
            double dY = aY - bY;
            return Math.Sqrt(dX * dX + dY * dY);
        }
 
        /// <summary>Вычисляет скалярное произведение векторов AB и AC.</summary>
        /// <param name="aX">Координата X точки A.</param>
        /// <param name="aY">Координата Y точки A.</param>
        /// <param name="bX">Координата X точки B.</param>
        /// <param name="bY">Координата Y точки B.</param>
        /// <param name="cX">Координата X точки C.</param>
        /// <param name="cY">Координата Y точки C.</param>
        /// <returns>Скалярное произведение векторов AB и AC.</returns>
        public static double Scalar(double aX, double aY, double bX, double bY, double cX, double cY)
        {
            return (cX - aX) * (bX - aX) + (cY - aY) * (bY - aY);
        }
 
        /// <summary>Возвращает площадь треугольника с заданными сторонами.</summary>
        /// <param name="a">Длина стороны A.</param>
        /// <param name="b">Длина стороны B.</param>
        /// <param name="c">Длина стороны C.</param>
        /// <returns>Площадь треугольника.</returns>
        /// <remarks>Площадь рассчитывается по
        /// <see href="https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%93%D0%B5%D1%80%D0%BE%D0%BD%D0%B0">формуле Герона</see>.</remarks>
        public static double Area(double a, double b, double c)
        {
            double p = a + b + c;
            p /= 2;
            return Math.Sqrt(p * (p - a) * (p - b) * (p - c));
        }
 
        /// <summary>Вычисляет расстояние между отрезком и точкой на плоскости.</summary>
        /// <param name="aX">Координата X точки A отрезка.</param>
        /// <param name="aY">Координата Y точки A отрезка.</param>
        /// <param name="bX">Координата X точки B отрезка.</param>
        /// <param name="bY">Координата Y точки B отрезка.</param>
        /// <param name="x">Координата X точки.</param>
        /// <param name="y">Координата Y точки.</param>
        /// <returns>Возвращает расстояние до прямой,
        /// если точка находится над отрезком
        /// (то есть перпиндикуляр от точки падает на отрезок)
        /// или минимальное из расстояний до концов отрезка.</returns>
        public static double Distance(double aX, double aY, double bX, double bY, double x, double y)
        {
            // Расстояния до концов отрезка.
            // Если расстояние равно нулю, то возвращается 0.
            double dAX = Distance(aX, aY, x, y);
            if (dAX == 0)
                return 0;
            double dBX = Distance(bX, bY, x, y);
            if (dBX == 0)
                return 0;
 
            // Длина отрезка.
            // Если расстояние равно нулю,
            // то значит отрезок вырожден в точку
            // и возвращается любое из dax или dbx.
            double dAB = Distance(aX, aY, bX, bY);
            if (dAB == 0)
                return dAX;
 
            // Если точка лежит над отрезком,
            // то оба угла отрезка с точкой не должны быть тупыми.
            // Для определения "тупизны" углов вычисляется
            // скалярное произведение векторов из концов отрезков.
            // Для тупого угла оно будет отрицательным.
            // Если скалярное произведение не положительно,
            // то расстояние до этого конца отрезка - минимальное.
            double scA = Scalar(aX, aY, bX, bY, x, y);
            if (scA <= 0)
                return dAX;
            double scB = Scalar(bX, bY, aX, aY, x, y);
            if (scB <= 0)
                return dBX;
 
            // Если оба скаляра положительны,
            // то вычисляем и возвращаем расстояние до прямой.
            // Расстояние до прямой равно высоте треугольника с основанием AB.
            // Высота рассчитывается как удвоенное частное от деления площади на основание.
            double area = Area(dAB, dAX, dBX);
            return area * 2 / dAB;
        }
    }
}
1
1524 / 515 / 126
Регистрация: 09.01.2018
Сообщений: 1,614
03.10.2021, 17:11
Математически это неправильное решение, хотя и дает возможно верный результат (я не проверял).
Скалярное произведение тут ни при чем, оно относится к векторам. В задаче же ничего о векторах не говорится. Точка и отрезок, чистая планиметрия.

По условию даны 3 точки, две из которых являются концами отрезка. Если они не лежат на одной прямой, то из них можно образовать треугольник, основанием которого будет отрезок. В случае, если один из углов при основании треугольника тупой - искомым результатом будет меньшая из сторон при основании треугольника. Если же оба угла при основании треугольника острые, то результатом будет высота треугольника, вычислить которую можно пользуясь формулой Герона. Определить свойства углов при основании (острый / тупой) можно исходя из теоремы косинусов по квадрату стороны треугольника.

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

Код, кому интересно:
Кликните здесь для просмотра всего текста

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
using System;
 
namespace DistanceTask
{
    public static class DistanceTask
    {
        // Расстояние от точки (x, y) до отрезка AB с координатами A(ax, ay), B(bx, by)
        public static double GetDistanceToSegment(double ax, double ay, double bx, double by, double x, double y)
        {
            var AC = Distance(ax, ay, x, y);
            var BC = Distance(x, y, bx, by);
            var AB = Distance(ax, ay, bx, by);
            
            //точка на отрезке совпадает с одним из его концов
            if (AC == 0 || BC == 0) return 0.0;
 
            //точка лежит между концами отрезка
            if (AB == AC + BC) return 0.0;
 
            //точка лежит на прямой перед отрезком
            if (AC == BC + AB) return BC;
 
            //точка лежит на прямой после отрезка
            if (BC == AC + AB) return AC;
 
            //один из углов при основании треугольника тупой
            if (IsObtuseTriangle(AC, BC, AB))
            {
                return Math.Min(AC, BC);
            }
            else
            {
                var p = (AC + BC + AB) / 2;
                var s = Math.Sqrt(p * (p - AC) * (p - BC) * (p - AB));
                var h = s * 2 / AB;
                return h;
            }
        }
 
        //Расстояние между точками a и b
        private static double Distance(double ax, double ay, double bx, double by)
        {
            return Math.Sqrt(Math.Pow((ax - bx), 2) + Math.Pow((ay - by), 2));
        }
 
        //Один из углов при основании треугольника тупой
        private static bool IsObtuseTriangle(double a, double b, double c)
        {
            return a * a > b * b + c * c || b * b > a * a + c * c;
        }
    }
}


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

Написать функцию, вычисления расстояния от точки до контура
Нужно написать функцию, которая бы вычисляла расстояние от точки до контура и возвращала бы его. Спасибо.

Составить функцию вычисления расстояния от точки до начала координат
На форуме нашел такое решение, но не пойму как записать вычисление расстояния через функцию для n-ой точки? uses crt; var ...

Разработать программу для вычисления кратчайшего расстояния от произвольной точки
С++ Разработать программу для вычисления кратчайшего расстояния от произвольной точки плоскости с координатами X, Y до контура...

Напишите функцию, возвращающую длину отрезка от начала координат до точки, заданной своими координатами
Напишите функцию, возвращающую длину отрезка от начала координат до точки, заданной своими координатами. Для введённой последовательности...

Метод возвращает неправильно расстояние от отрезка до точки
В частности при A(-30;0), B(30;0), K(60;30) правильный ответ 42,4264068711929. Я вычисляю, с расчерчивание в тетради и получается 30....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru