Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 15.09.2020
Сообщений: 30
.NET Core

Расстояние от точки до отрезка

15.09.2020, 11:30. Показов 7073. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Найти наименьшее расстояние от точки до отрезка
Понял, что и как делать, расписал условия на листочке)
То есть если скалярное проиведение меньше 0, то расстояние от точки до ближайшей точки на отрезке будет наименьший, а если скалярное больше 0, то перпендикуляр к отрезку яв-ся наименьшим расстоянием
Очень жду помощи, делаю уже 2 день, нервы на исходе))

Сейчас это выглядит так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        public static double GetDistanceToSegment(double ax, double ay, double bx, double by, double x, double y)
        {
            double scalAuC = (x * ax) + (y * ay); // Скаялярное произведение
            double scalBuC = (x * bx) + (y * by);
 
            double AB = Math.Pow((ax - bx) * (ax - bx) + (ay - by) * (ay - by), 0.5);
            double BC = Math.Pow((bx - x) * (bx - x) + (by - y) * (by - y), 0.5);
            double AC = Math.Pow((ax - x) * (ax - x) + (ay - y) * (ay - y), 0.5);
 
            if (scalAuC <= 0 || scalBuC <= 0)  // Если скалярное меньше нуля, то косинус будет отрицательный => блжайшее расстояние от точки до точки А или В
            {
                if (scalAuC <= 0)
                    return Math.Pow((x - ax) * (x - ax) + (y - ay) * (y - ay), 0.5);
                else if (scalBuC <= 0)
                    return Math.Pow((x - bx) * (x - bx) + (y - by) * (y - by), 0.5);
            }
 
            if (scalAuC > 0 && scalBuC > 0) // Если скалярные проиведения положительные, значит перпендикуляр к отрезку будет яв-ся ближайшим расстоянием
                return (AB * AC * Math.Asin(BC / Math.Max(AB, AC)) / BC);
            return 0.0;
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.09.2020, 11:30
Ответы с готовыми решениями:

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

Вычислить расстояние от отрезка до точки без кучи условий
Как это сделать без кучи условий?

Найти расстояние от точки до отрезка - нужно найти маленькую ошибку
Собственно, условие задачи дано в заголовке. Я искал на форуме и нашёл сразу несколько тем, где именно эта задача с таким же оформлением и...

40
0 / 0 / 0
Регистрация: 15.09.2020
Сообщений: 30
15.09.2020, 15:14  [ТС]
Студворк — интернет-сервис помощи студентам
Так, нашел где его вызывают, и что передают, но не знаю как это должно мне помочь
Миниатюры
Расстояние от точки до отрезка   Расстояние от точки до отрезка  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
15.09.2020, 15:20
Цитата Сообщение от Brod553 Посмотреть сообщение
так как только недавно начал изучать c#
Так учите его сразу правильно!

C# - это язык ООП.

Для примера, не надо создавать отдельно double x и double y.
Для представления координат на плоскости есть уже созданный тип Point - используйте его.

Есть повтор кода (вычисление скаляра) - вынесите это в отдельный метод.

Таким образом, вы потихоньку обучитесь методам ООП.
А используя процедурное программирование, так навсегда и останетесь на уровне клепания горы костылей.

Добавлено через 1 минуту
Цитата Сообщение от Brod553 Посмотреть сообщение
Так, нашел где его вызывают, и что передают, но не знаю как это должно мне помочь
Так смотреть надо во время исполнения.
Чтобы понять какие числа вы передаёте, а какие ожидаете.
0
0 / 0 / 0
Регистрация: 15.09.2020
Сообщений: 30
15.09.2020, 15:20  [ТС]
Нашел метод, вот что он принимает и выдает. Как это использовать?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
15.09.2020, 15:25
Кстати по скрину видно, что у вас точки a, b, x в типе PointF.
Так измените метод GetDistanceToSegment, чтобы он и принимал такой тип.
Что вы сами себе "бег с препятствиями" устраивает?
C#
1
2
         public static double GetDistanceToSegment(PointF a, PointF b, PointF p)
        {
Добавлено через 1 минуту
Цитата Сообщение от Brod553 Посмотреть сообщение
Нашел метод, вот что он принимает и выдает. Как это использовать?
Надо значения смотреть во время исполнения и разбираться почему там не те значения которые вы ожидаете.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.09.2020, 15:28
Brod553, с виду вроде бы все нормально.
Как вообще работает тест? В какой момент он производит вычисления: когда вы кликаете по тесту в интерфейсе или сначала все высчитывает, а потом показывает результаты по всем тестам, которые можно посмотреть?

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Так измените метод GetDistanceToSegment, чтобы он и принимал такой тип.
Предполагаю, что раз автор не знает где что искать, то "фреймворк" тестирования предоставлен преподавателем и менять его нельзя — надо только предоставить реализацию GetDistanceToSegment.
1
0 / 0 / 0
Регистрация: 15.09.2020
Сообщений: 30
15.09.2020, 15:29  [ТС]
Тыкаю в интерфейсе запустить тест, он начинает исполнять
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.09.2020, 15:29
Цитата Сообщение от Brod553 Посмотреть сообщение
он начинает исполнять
По одному, на который тыкнули, или все подряд?
1
0 / 0 / 0
Регистрация: 15.09.2020
Сообщений: 30
15.09.2020, 15:33  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Предполагаю, что раз автор не знает где что искать, то "фреймворк" тестирования предоставлен преподавателем и менять его нельзя — надо только предоставить реализацию GetDistanceToSegment.
Да, скорее всего так

Добавлено через 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
По одному, на который тыкнули, или все подряд?
Все подряд
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.09.2020, 15:35
Цитата Сообщение от Brod553 Посмотреть сообщение
Все подряд
Ну тогда у вас обычная "рассинхронизация": на форме вы смотрите значения для 8-го теста, который уже завершился (красный крестик и результат как бы намекают), а в отладчике вы смотрите значения текущего теста, который сейчас выполняется, т.е. 9-го.
1
0 / 0 / 0
Регистрация: 15.09.2020
Сообщений: 30
15.09.2020, 15:49  [ТС]
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
    public static double GetDistanceToSegment(double ax, double ay, double bx, double by, double x, double y)
        {
            double AB = Math.Sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay));
            double BC = Math.Sqrt((x - bx) * (x - bx) + (y - by) * (y - by));
            double AC = Math.Sqrt((x - ax) * (x - ax) + (y - ay) * (y - ay));
            double BA = Math.Sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by));
 
            double scalACAB = (x - ax) * (bx - ax) + (y - ay) * (by - ay); // Скаялярное произведение
            double scalBCBA = (x - bx) * (ax - bx) + (y - by) * (ay - by);
 
            if (scalACAB <= 0 || scalBCBA <= 0)  // Если скалярное меньше нуля, то косинус будет отрицательный => блжайшее расстояние от точки до точки А или В
            {
                if (scalACAB <= 0)
                    return AC;
                else if (scalBCBA <= 0)
                    return BC;
            }
 
            if ((scalACAB > 0 && scalBCBA > scalACAB) || (scalBCBA > 0 && scalBCBA < scalACAB)) // Если скалярные проиведения положительные, значит перпендикуляр к отрезку будет яв-ся ближайшим расстоянием
                return (AB * AC * Math.Asin(BC / Math.Max(AB, AC)) / BC);
 
            if (scalACAB == scalBCBA)
                return BC * Math.Pow(3,0.5) / 2;
            return 0.0;
        }
Понял, где ошибка
C#
1
2
if (scalACAB == scalBCBA)
                return BC * Math.Pow(3,0.5) / 2;
Здесь проиводит неверные вычисления, то есть где testRoom ждет 30, мой код выдает ответ 36. Использовал уравнение площади в равностороннем треугольнике
Как можно исправить это?
И спасибо большое за помощь
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
15.09.2020, 15:56
Цитата Сообщение от Brod553 Посмотреть сообщение
Понял, где ошибка
А зачем вы вычисляете AB и BA - это же одно и тоже!?
0
0 / 0 / 0
Регистрация: 15.09.2020
Сообщений: 30
15.09.2020, 15:58  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А зачем вы вычисляете AB и BA - это же одно и тоже!?
Забыл убрать из кода
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
15.09.2020, 15:58
Цитата Сообщение от Brod553 Посмотреть сообщение
Понял, где ошибка
А что вы здесь считаете?
scalACAB == scalBCBA, как я понимаю, означает равнобедренный треугольник с основанием на заданном отрезке.

А вот что должна посчитать формула?
0
0 / 0 / 0
Регистрация: 15.09.2020
Сообщений: 30
15.09.2020, 16:00  [ТС]
Высоту в этом треугольнике
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
15.09.2020, 16:07
Brod553, у вас есть длины всех сторон.
Вы можете посчитать по Герону площадь треугольника.
Высота треугольника - это площадь разделить на основание.

То есть после блока if (scalACAB <= 0 ||, с 19-ой строки - вычисление у всех одинакове.

Добавлено через 4 минуты
C#
19
20
21
22
double p = AB+BC+CA;
p /= 2;
double s = Math.Sqrt(p*(p-AB)*(p-BC)*(p-CA));
return 2*s/ab;
0
0 / 0 / 0
Регистрация: 15.09.2020
Сообщений: 30
15.09.2020, 16:13  [ТС]
Все равно есть ошибка, но спасибо за помощь
Миниатюры
Расстояние от точки до отрезка  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
15.09.2020, 16:37
Цитата Сообщение от Brod553 Посмотреть сообщение
Все равно есть ошибка,
А где умножение на два в return?

Добавлено через 1 минуту
Площадь треугольника = высота * основание / 2.
Соответственно: высота = 2 * площадь / основание.
0
0 / 0 / 0
Регистрация: 15.09.2020
Сообщений: 30
15.09.2020, 16:47  [ТС]
Спасибо большое за помощь, все разобрался, все тесты прошли
0
0 / 0 / 0
Регистрация: 08.11.2016
Сообщений: 11
13.11.2020, 12:02
Я вот так эту задачу решал, т.к. в тригонометрии не силён:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static double GetDistanceToSegment(double ax, double ay, double bx, double by, double x, double y)
{
    if (x==ax&&y==ay||x==bx&&y==by) return 0.0; //отрезок нулевой длины и точка заданная точка лежит на нём
    double ab = Math.Sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by)); //длина отрезка
    double ac = Math.Sqrt((ax - x) * (ax - x) + (ay - y) * (ay - y)); //расстояние от точки А до заданной точки
    double bc = Math.Sqrt((bx - x) * (bx - x) + (by - y) * (by - y)); //расстояние от точки Б до заданной точки
    if (Math.Abs(ac + bc - ab) < 1e-4) return 0.0; //точка лежит на отрезке
    if (Math.Abs(ab + ac - bc) < 1e-4) return ac; //точка лежит с отрезком на одной прямой и ближе к точке А
    if (Math.Abs(ab + bc - ac) < 1e-4) return bc; //точка лежит с отрезком на одной прямой и ближе к точке Б
    double p = (ab + ac + bc) / 2; //половина периметра треугольника образованного отрезком и заданной точкой
    double h = 2 * Math.Sqrt(p * (p - ab) * (p - ac) * (p - bc)) / ab; //высота треугольника проведённая от заданной точки к отрезку
    if (ac > bc && ac < Math.Sqrt(ab * ab + bc * bc) || bc > ac && bc < Math.Sqrt(ab * ab + ac * ac) || ac == bc) return h; //определяем попадает ли высота на отрезок
    if (ac < bc) return ac; //остальные случаи...
    else return bc;
}
поясните пожалуйста, как "point" использовать, что бы лишние double не создавать?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.11.2020, 12:23
Homophobic, вот так: Расстояние от точки до отрезка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.11.2020, 12:23

Вычислить расстояние от точки на плоскости до ближайшей точки отрезка
Помогите ) составить программу, что рассчитывает расстояние от точки (x; y) на плоскости до ближайшей точки отрезка на оси Ox.

Расстояние от точки до отрезка
Помогите пожалуйста решить Входные данные Шесть чисел – координаты точки и координаты концов отрезка. Выходные данные Одно...

Расстояние от точки до отрезка
Дан отрезок в пространстве (x1,y1,z1) - (x2,y2,z2) и точка (x,y,z). Найдите расстояние от точки до отрезка. Формат входных данных: ...

Расстояние от точки до отрезка
Подскажите в задаче! По какой формуле будет находиться расстояние d от точки М(x,y) до отрезка АВ, если скалярное произведение AM и...

Как найти расстояние от точки до отрезка?
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;cmath&gt; using namespace std; int main() { double x =...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
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
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru