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

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

15.09.2020, 11:30. Показов 7076. Ответов 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
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
13.11.2020, 12:41
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Homophobic Посмотреть сообщение
поясните пожалуйста, как "point" использовать, что бы лишние double не создавать?
Если делать по нормальному, как это положено для C#, то для всех типов сущностей надо создавать свои типы.
В методе используется сущность "Точка" для неё вполне подойдёт тип System.Drawing.Point.

Так же в методе используется сущность "Отрезок" - для этой сущности нет типа.
Его надо создать. В простейшем виде он будет таким:
C#
1
2
3
4
5
public struct Segment
{
   public Point A {get; set;}
   public Point B {get; set;}
}
С этими типами сигнатуру метода можно изменить так (логику метода не проверял):
C#
1
2
3
4
5
6
7
8
9
public static double GetDistanceToSegment(Segment segment, Point point)
{
    //отрезок нулевой длины и точка заданная точка лежит на нём
    if (point.X==segment.A.X && point.Y==segment.A.Y || point.X==segment.B.X && point.Y==segment.B.Y) return 0.0;
 
    // Дальше в таком же духе.
    // Где было x, y заменяете на point.X, point.Y
    // Где было ax, ay, bx, by - segment.A.X, segment.A.Y, segment.B.X, segment.B.Y
}
Следующий вопрос: Где должен быть этот метод?
Раз работает с Segment, то самое логичное задать его в этом же типе.
И добавить перегрузку для работы с текущим отрезком:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public struct Segment
{
   public Point A {get; set;}
   public Point B {get; set;}
 
  public static double GetDistanceToPoint(Segment segment, Point point)
  {
       // Тело метода
   }
 
   // Перегрузка для работы с текущим отрезком
  public static double GetDistanceToPoint(Point point)
     => GetDistanceToPoint(this, point);
 
}

Пример использования:
C#
1
2
3
4
Point point = new Point(10, 15);
Segment segment = new Segment() {A = new Point(2, 3), B =new Point(25, 40)};
 
Console.WriteLine($"Расстояние: {segment.GetDistanceToPoint(point)}");
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.11.2020, 12:41

Вычислить расстояние от точки на плоскости до ближайшей точки отрезка
Помогите ) составить программу, что рассчитывает расстояние от точки (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 =...


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

Или воспользуйтесь поиском по форуму:
41
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru