Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516

Точка пересечения двух отрезков. Перевод с MATLAB.

03.01.2020, 15:30. Показов 2332. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кто-нибудь может перевести 6 и 9 строки?
Matlab M
1
2
3
4
5
6
7
8
9
% нахождение точки Т пересечения двух отрезков АВ и СD на плоскости
A=[-2,-3];
B=[10,1];
C=[3,3];
D=[8,-2];
U=inv([B'-A',C'-D'])*(C'-A')
% оба коэффициента разбиения отрезков АВ и СD точкой Т (координаты U)
% должны быть от 0 до 1, иначе пересекаются не отрезки, а прямые АВ и CD
T=A+U(1)*(B-A)  % или, что то же самое, T=C+U(2)*(D-C)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.01.2020, 15:30
Ответы с готовыми решениями:

Точка пересечения двух прямых (отрезков)
кто нибудь помогите создать функцию нахождения точки пересечения двух прямых. ну оочень надо а то я перерыл весь инет нашел много разных...

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

Точка пересечения отрезков
Пересекаются ли отрезки заданными координатами (x1;y1),(x2;y2),(x3;y3),(x4;y4)

14
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
04.01.2020, 01:52
Цитата Сообщение от ProMix0 Посмотреть сообщение
может перевести
Честно - не могу.
Зато могу геометрию.

Для начала представим каждую прямую через формулу её графика - y=a*x+b.
То есть надо найти такие a и b, чтоб график этой функции оказался прямой AB.

a это наклон прямой и равен он (p2.Y-p1.Y)/(p2.X-p1.X).
b это то, чему равен y, при x=0, то есть p1.Y - a*p1.X.

Теперь когда есть формулы обоих графиков:
y1=a1*x1+b1
y2=a2*x2+b2
Нам нужна точка где графики пересекаются, то есть x1=x2 и y1=y2. Исходя из этого - легко составить уравнение:
a1*x+b1=a2*x+b2
Отсюда x получается - (b1 - b2) / (a1 - a2).
Ну а y можно найти по любой из формул. То есть, к примеру, a1*x+b1.

Далее остаётся только проверить что полученная точка пересечения находится внутри обоих прямоугольниках, описанных точками AB и CD.

---

Но у этого подхода есть огромный минус - для линий близких к вертикальным будут большие погрешности. А для вообще вертикальных - и не сработает.

Последний раз такие формулы понадобились мне чуть больше 2 лет назад, когда делал 1 игру.
Тогда я решил проблему с вертикальными отрезками - меняя местами X и Y по необходимости, чтоб вертикальные отрезки превращались в горизонтальные. (вообще это очень часто применяемый приём в программисткой геометрии)
Формулы от этого, разумеется, немного меняются. Если хотите знать как - вот моя функция для именно этой задачи, из той игры:
https://github.com/SunSerega/G... .pas#L1449
Не знаю зачем, но похоже я там всем типам и подпрограммам сделал нормальные описания... Ну, не забудьте хотя бы на них теперь посмотреть, если будете разбираться)).

Добавлено через 5 минут
А, вспомнил, я тогда решил что мне это всё ещё много лет будет нужно, поэтому делал описания, на случай если отупею))
Вот только 2 года без притрагивания к коду, а что делает что - всё ещё понимаю...
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
06.01.2020, 08:08  [ТС]
Кстати, вы пишете про прямые, а даны отрезки
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
06.01.2020, 09:06
А внимательно прочитать?
Цитата Сообщение от Sun Serega Посмотреть сообщение
Далее остаётся только проверить что полученная точка пересечения находится внутри обоих прямоугольниках, описанных точками AB и CD.
Чтоб найти пересекаются ли отрезки - надо сначала найти точку пересечения прямых.

И ссылка на мой код - показывает на именно функцию для отрезков, которая вызывает функцию для прямых.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
07.01.2020, 16:17  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
чтоб вертикальные отрезки превращались в горизонтальные
А если отрезки почти (или полностью) перпендикулярны?
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
07.01.2020, 17:02
Перпендикулярность не влияет на точность.

Та погрешность о которой я говорю - это из за формулы a из a*x+b.
a вычисляется как dy/dx, поэтому если dx близко или = 0 - a будет иметь близкое к- или безконечное значение.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
07.01.2020, 17:16  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
Перпендикулярность не влияет на точность
Я имел в виду, что, как их не верти, один из них будет вертикален

Написал тестовую программку - пишет (Infinity,Infinity), т.к. они перпендикулярны, а1=а2, а2-а1=0, N/0=Infinity
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Save<T>(self: T; var a: T): T; extensionmethod;
begin
  (result, a) := (self, self);
end;
 
function LineIntersectPoint(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2: real): (real, real);
begin
  var Aa := (ay2 - ay1) / (ax2 - ax1);
  var Ab := (by2 - by1) / (by2 - by1);
  var Ba := ay1 - Aa * ax1;
  var Bb := by1 - Ab * bx1;
  var a: real;
  result := (((Bb - Ba) / (Aa - Ab)).save(a), Aa * a + Ba);
end;
Вводил 0 0 2 2 0 2 2 0
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
07.01.2020, 17:37
Цитата Сообщение от ProMix0 Посмотреть сообщение
Я имел в виду, что, как их не верти, один из них будет вертикален
С чего вдруг?
Code
1
2
A=(-1,-1), B=(+1,+1)
C=(+1,-1), D=(-1,+1)
Это 2 не_вертикальных перпендикулярных вектора.

Добавлено через 29 секунд
Цитата Сообщение от ProMix0 Посмотреть сообщение
.save(a)
А это жесть как неэффективно.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
07.01.2020, 17:39  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
2 не_вертикальных перпендикулярных вектора
Согласен
Цитата Сообщение от Sun Serega Посмотреть сообщение
А это жесть как неэффективно
Почему?
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
07.01.2020, 17:46
А, не, у вас в коде проблема:
Цитата Сообщение от ProMix0 Посмотреть сообщение
(by2 - by1) / (by2 - by1);
Вы копипастить не умеете.

Добавлено через 2 минуты
Цитата Сообщение от ProMix0 Посмотреть сообщение
Почему?
Потому что это лишний вызов. И инлайнуть его для JIT-компилятора - не так уж тривиально, так что на это не стоит надеяться.
Правильно и читабельнее расписывать на несколько строк:
Pascal
1
2
3
  var x := (Bb - Ba) / (Aa - Ab);
  var y := Aa * x + Ba;
  Result := (x, y);
(ну и x правильнее называть x а не a, особенно когда в формуле есть другая переменная которая называется a).
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
07.01.2020, 17:50  [ТС]
О, да, спасибо.
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
07.01.2020, 17:57
Цитата Сообщение от Sun Serega Посмотреть сообщение
Потому что это лишний вызов. И инлайнуть его для JIT-компилятора - не так уж тривиально
Да, а ещё вы там использовали картёжное присвоение, что тоже медленно и не инлайнится.
Картёжное присвоение имеет хоть сколько то смысла только в 2 случаях:
1. Когда расписать как 2 строчки нельзя: (x,y) := (f1(y),f2(x)). Но ввод дополнительной переменной всё равно работает эффективнее.
2. Когда вы хотите описать функцию/процедуру коротким синтаксисом. Это вообще только для красоты и эффективности от такого кода ожидать нет смысла.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
07.01.2020, 18:08  [ТС]
Спасибо, буду знать
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
09.01.2020, 12:53  [ТС]
Цитата Сообщение от ProMix0 Посмотреть сообщение
Я имел в виду, что, как их не верти, один из них будет вертикален
А, точно, вот о чём я - если поворачивать перпендикулярные отрезки методом взаимной замены входных и выходных координат, то поворот на 90 градусов -> один отрезок вертикален. А как повернуть на 45 градусов?
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
09.01.2020, 13:06
Цитата Сообщение от Sun Serega Посмотреть сообщение
Когда расписать как 2 строчки нельзя: (x,y) := (f1(y),f2(x)).
Расписать - всегда можно. Кортежное присваивание нужно когда хочется логически сгруппировать несколько присваиваний.

Цитата Сообщение от Sun Serega Посмотреть сообщение
Когда вы хотите описать функцию/процедуру коротким синтаксисом.
Скорее, когда хочется вернуть несколько значений из функции (но, тип возвращаемого значения - не IEnumerable или его наследник) и не хочется писать лишние типы для группировки значений.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.01.2020, 13:06
Помогаю со студенческими работами здесь

Точка пересечения 2х отрезков в пространстве
Доброго дня всем. Такая постановка задачи, делаю проект для работы с 3D-моделями. И встал вопрос найти точку пересечения 2х отрезков....

Проверка пересечения двух отрезков
Помогите разобраться Выдает ошибку &quot;floating division by zero&quot; и перепрыгивает на строчку (y:=((y3-y4)*x-(x3*y4-x4*y3))/(x4-x3);) ...

Координаты точки пересечения двух отрезков
День добрый уважаемые читатели форума. Разбираю задачу по расчету Координаты точки пересечения двух отрезков и столкнулся с проблемой. ...

Найти точку пересечения двух отрезков
как найти точку пересечения двух отрезков, если даны координаты начала и конца обеих

Определение точки пересечения двух отрезков
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; struct line { double x0, y0, x1, y1; }; ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
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