Поиск точки пересечения линий

Автор Тема: Поиск точки пересечения линий  (Прочитано 9119 раз)

0 Пользователей и 5 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн YeezussniperАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Добрый день. Подскажите каким образом мне найти точку пересечения отрезка (2 точки) с полилейней у которой множество точек.

У меня получилось вычислить математически по координатам между двумя отрезками. Но я также знаю что есть способ найти точку пересечения линий, в vba нашел IntersectWith. Не могу понять как через c# передать функции мою готовую Polyline и Polyline из, например, 150 точек. И если одна линия пересекает вторую в любом интервале, то выдать эту координату

Или может использовать Point2dCollection.

Очень надеюсь на Вашу помощь.




Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Поиск точки пересечения линий
« Ответ #1 : 31-10-2020, 23:32:39 »
Если можете вычислить математически - вычисляйте. Это будет раз в 20 быстрее работать, чем вызывать API. А вообще IntersectWith есть у всех Entity. Примеры есть в этом форуме. Вот например https://adn-cis.org/forum/index.php?topic=9055.msg36745#msg36745

Оффлайн YeezussniperАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Поиск точки пересечения линий
« Ответ #2 : 31-10-2020, 23:36:57 »
У меня получается только проверка к 2 точкам, а хотелось бы к листу или массиву.
Сам пока что не могу додумать как сделать чтобы проверял по всем координатам. В голову только идея приходит: та линия, которая должна пересекать нужную мне линию (с множествами точек), брать у нее конечную точку и смотреть между какими координатами в массиве она проходит, а далее брать эти две точки.

Код - C# [Выбрать]
  1.         private Point Cross(double a1, double b1, double c1, double a2, double b2, double c2)
  2.         {
  3.             Point pCross = new Point();
  4.  
  5.  
  6.             pCross.X = (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);
  7.  
  8.             pCross.Y = (a2 * c1 - a1 * c2) / (a1 * b2 - a2 * b1);
  9.  
  10.             return pCross;
  11.         }
  12.  
  13.         public bool LineLine(Point pABDot1, Point pABDot2, Point pCDDot1, Point pCDDot2, out Point pCross, out Info info)
  14.         {
  15.             info = new Info();
  16.  
  17.             double a1 = pABDot2.Y - pABDot1.Y;
  18.             double b1 = pABDot1.X - pABDot2.X;
  19.             double c1 = -pABDot1.X * pABDot2.Y + pABDot1.Y * pABDot2.X;
  20.  
  21.  
  22.             double a2 = pCDDot2.Y - pCDDot1.Y;
  23.             double b2 = pCDDot1.X - pCDDot2.X;
  24.             double c2 = -pCDDot1.X * pCDDot2.Y + pCDDot1.Y * pCDDot2.X;
  25.  
  26.  
  27.             //// Обе прямые неопределенны
  28.             //if (a1 == 0 && b1 == 0 && a2 == 0 && b2 == 0)
  29.             //{
  30.             //    info.Id = 10;
  31.             //    info.Message = "Обе прямые не определены";
  32.  
  33.             //    return false;
  34.             //}
  35.  
  36.  
  37.             //// Направление первой прямой неопределенно
  38.             //if (a1 == 0 && b1 == 0)
  39.             //{
  40.             //    info.Id = 11;
  41.             //    info.Message = "Первая прямая не определена";
  42.  
  43.             //    return false;
  44.             //}
  45.  
  46.  
  47.             //// Направление второй прямой неопределенно
  48.             //if (a2 == 0 && b2 == 0)
  49.             //{
  50.             //    info.Id = 12;
  51.             //    info.Message = "Вторая прямая не определена";
  52.  
  53.             //    return false;
  54.             //}
  55.  
  56.             //// Прямые параллельны
  57.             //if ((a1 * b2 - a2 * b1) == 0)
  58.             //{
  59.  
  60.             //    info.Id = 40;
  61.             //    info.Message = "Прямые параллельны";
  62.  
  63.             //    if (a1 == 0)
  64.             //    {
  65.             //        // Прямые паралельны оси Х
  66.             //        info.Id = 41;
  67.             //        info.Message = "Прямые паралельны оси Х";
  68.             //    }
  69.  
  70.             //    if (b1 == 0)
  71.             //    {
  72.             //        // Прямые паралелльны оси Y
  73.             //        info.Id = 42;
  74.             //        info.Message = "Прямые паралельны оси Y";
  75.             //    }
  76.  
  77.             //    if (a1 * b2 == b1 * a2 && a1 * c2 == a2 * c1 && b1 * c2 == c1 * b2)
  78.             //    {
  79.             //        info.Id = 43;
  80.             //        info.Message = "Прямые совпадают";
  81.             //    }
  82.  
  83.             //    return false;
  84.             //}
  85.  
  86.             pCross = Cross(a1, b1, c1, a2, b2, c2);
  87.  
  88.  
  89.             // Прямые перпендикулярны
  90.             //if ((a1 * a2 + b1 * b2) == 0)
  91.             //{
  92.             //    info.Id = 50;
  93.             //    info.Message = "Прямые перпендикулярны";
  94.  
  95.             //    return true;
  96.             //}
  97.  
  98.  
  99.  
  100.             // Первая прямая паралельна оси Х
  101.             //if (a1 == 0)
  102.             //{
  103.             //    info.Id = 60;
  104.             //    info.Message = "Первая прямая параллельна оси Х";
  105.  
  106.             //    return true;
  107.             //}
  108.  
  109.             //// Вторая прямая паралельна оси Х
  110.             //if (a2 == 0)
  111.             //{
  112.             //    info.Id = 61;
  113.             //    info.Message = "Вторая прямая параллельна оси Х";
  114.  
  115.             //    return true;
  116.             //}
  117.  
  118.  
  119.             //// Первая прямая параллельна оси Y
  120.             //if (b1 == 0)
  121.             //{
  122.             //    info.Id = 70;
  123.             //    info.Message = "Первая прямая параллельна оси Y";
  124.  
  125.             //    return true;
  126.             //}
  127.  
  128.             //// Вторая прямая параллельна оси Y
  129.             //if (b2 == 0)
  130.             //{
  131.  
  132.             //    info.Id = 71;
  133.             //    info.Message = "Вторая прямая параллельна оси Y";
  134.  
  135.             //    return true;
  136.             //}
  137.  
  138.  
  139.             info.Id = 0;
  140.             info.Message = "Общий случай";
  141.             return true;
  142.         }
  143.     }
  144.  
  145.     public class Info
  146.     {
  147.         public string Message;
  148.         public int Id;
  149.     }

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63

Оффлайн YeezussniperАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Поиск точки пересечения линий
« Ответ #5 : 31-10-2020, 23:49:44 »
avc,
Не очень удачный пример. Вот этот (из тех что на нашем форуме) будет получше: https://adn-cis.org/forum/index.php?topic=3217.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн YeezussniperАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Поиск точки пересечения линий
« Ответ #6 : 31-10-2020, 23:58:05 »
avc,
Не очень удачный пример. Вот этот (из тех что на нашем форуме) будет получше: https://adn-cis.org/forum/index.php?topic=3217.0

Подскажите, что именно ждет от меня метод?
Видимо я не могу в это метод передать 2 коллекции Point2dCollection и получить точку?

И получается мне он вернет массив точек?


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Поиск точки пересечения линий
« Ответ #7 : 01-11-2020, 00:27:59 »
Видимо я не могу в это метод передать 2 коллекции Point2dCollection и получить точку?
Нет конечно. Ну посмотри же уже справку.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Yeezussniper 01-11-2020, 00:45:12

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Поиск точки пересечения линий
« Ответ #8 : 01-11-2020, 00:34:52 »
Подскажите, что именно ждет от меня метод?





Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн YeezussniperАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Поиск точки пересечения линий
« Ответ #9 : 01-11-2020, 00:36:14 »
Видимо я не могу в это метод передать 2 коллекции Point2dCollection и получить точку?
Нет конечно. Ну посмотри же уже справку.

Я уже прочитал ее, спасибо) Пока что плаваю в документации этой
Код - C# [Выбрать]
  1. public void IntersectWith(
  2.     Entity entityPointer,
  3.     Autodesk.AutoCAD.DatabaseServices.Intersect intersectType,
  4.     Plane projectionPlane,
  5.     Point3dCollection points,
  6.     IntPtr thisGraphicSystemMarker,
  7.     IntPtr otherGraphicSystemMarker
  8. );
  9.  

Меня интересует вопрос другой, мне тогда необходимо два объекта. Я создаю сразу две Polyline и также Point3dCollection для вывода результата. Или я все-таки не понимаю логику

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Поиск точки пересечения линий
« Ответ #10 : 01-11-2020, 00:38:47 »
Меня интересует вопрос другой, мне тогда необходимо два объекта. Я создаю сразу две Polyline и также Point3dCollection для вывода результата. Или я все-таки не понимаю логику
Именно так. У тебя должны быть две полилинии и ты найдёшь все точки их пересечения. Полилинии необязательно добавлять в базу чертежа.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн YeezussniperАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Re: Поиск точки пересечения линий
« Ответ #11 : 01-11-2020, 00:45:04 »
Меня интересует вопрос другой, мне тогда необходимо два объекта. Я создаю сразу две Polyline и также Point3dCollection для вывода результата. Или я все-таки не понимаю логику
Именно так. У тебя должны быть две полилинии и ты найдёшь все точки их пересечения. Полилинии необязательно добавлять в базу чертежа.

А, я заработался и указывал переменную для line1.IntersectWith(line2, Intersect.OnBothOperands, points, IntPtr.Zero, IntPtr.Zero);  ;D
Поэтому он и сыпал ошибками мне)
Спасибо большое))