Пересечение прямых на плоскости и в пространстве

  Изометрическая модель, состоящая из отрезков прямых и точек, показывает пересечение прямых в плане - то есть в плоскости экрана дисплее и никак иначе.
  Повернув модель, мы увидим пересечение этих же прямых в другом ракурсе, однако и тогда не всегда понятно, пересекаются ли эти прямые в действительности, то есть пересекаются ли они в пространстве, насколько близко эти прямые подходят друг к другу, и можно ли считать точку их сближения точкой пересечения?
  Вторая проблема состоит в том, что не совсем понятно как ставить точку на месте пересечения. Ставить ли её на глазок, ориентируясь на видимую картинку и указатель мыши? Но тогда легко ошибиться на несколько пикселей и поставить точку не совсем в том месте. Особенно, если отрезки имеют значительную толщину, а прямые пересекаются под острым углом.
  Или, взяв точные координаты прямых, провести некоторые вычисления и поставить точку на точно рассчитанное место?

  Дело усугубляется ещё и тем, что векторная графика, к которой всё в конце концов и сводится, никогда не представляет отрезки точно – точность численного представления X,Y,Z координат начальной и конечной точек отрезка определяется количеством значащих цифр в числе. Для целых чисел это 5 цифр, для обычных чисел с плавающей запятой - 8.
  Поэтому, за исключением особых случаев, произвольные отрезки, заданные числами, не пересекаются никогда. Пересекаться они могут только приблизительно.

  В программе «Стереометрические модели» векторная графика представлена целыми числами, а погрешность в задании координат точки составляет одну десятую долю пикселя. Это все же лучше чем один или несколько пикселей ошибки, возникающей при постановке точки «на глазок».
  Поэтому, точку пересечения прямых лучше вычислять.
  Как это делается, показано на иллюстрации.

  После вычисления координат X,Y по приведённым на иллюстрации формулам для каждой из пересекающихся в плане прямых определяется коэффициент пропорции – (расстояние от точки до начала отрезка в плане)/(длина отрезка в плане). Затем, по найденной пропорции, определяется пространственное расположение точки – отдельно по координатам X,Y и Z  на каждом отрезке.
  В результате получается не одна, а две точки, которые, как оказывается, и это обсуждается в дальнейшем, могут и не совпадать.

  Приведённые на иллюстрации формулы общеизвестны, и вопрос состоит только в том, по какому критерию знаменатель (см. последнюю формулу) может считаться равным нулю.

  Эта чисто практическая проблема также практически и решается – я взял несколько геометрических моделей, в которых имелись прямые, пересекающиеся теоретически. Расстановка точек на этих кривых показала, что величина D=(A1*B2-A2*B1) для изначального чертежа имеет или значение равное нулю (для прямых, созданных параллельным переносом), или значение на порядок, или даже на два порядка большее 1. Будем считать, что при значениях D меньших чем единица прямые параллельны или совпадают.
  Оказалось, что расстояние между точками (1) и (2), разнесёнными в пространстве и поставленными отдельно на теоретически пересекающиеся прямые, во всех случаях оказывается менее 0.2 пикселя. В связи с этой небольшой, но всё же имеющейся разницей, за «истинное» положение точки следует принять середину между положениями (1) и (2).
  Затем я несколько раз поворачивал модели, придавая им другой ракурс и фиксируя модели в новом ракурсе. При фиксации модели в новом положении перевычисляются координаты. А после перевычисления они каждый раз переводятся в целочисленный формат и округляются при этом до пяти значащих цифр. Процесс этот, в общем квазислучайный, приводит к тому, что даже очень близкие между собой кривые, перестают пересекаться и постепенно отдаляются друг от друга.
  Стереометрическая модель как бы разбалтывается.

  Процесс этот естественный, но не фатальный. Эксперимент показал, что невязка прямых после разбалтывания составляет в среднем 0.5 пикселей и не поднимается выше значения 0.9. Это значение – 0.9 пиксель и было взято за критерий, позволяющий определить факт пересечения.
  Разумеется, что точки и концы прямых, совпадающие точно, никуда друг от друга уйти не могут, поскольку действия к ним применяются одни и те же. Однако точки, разнесённые в пространстве, путешествуют друг относительно друга. Поэтому меняются и длины отрезков, и углы между рёбрами геометрической модели.
  Может случиться и так, что прямые, проверенные по критериям D<0 и «расстояние между точками меньше или равно 0.9», признаны пересекающимися, но точка их пересечения лежит «за пределами мирового океана», то есть так далеко, что не попадает на поверхность рисунка.
  Тогда в поле комментариев печатается сообщение об этом, а точка пересечения прямых на рисунок не ставится.

  Описанная выше проблема точного определения точки пересечения прямых в пространстве связана не только с целочисленным представлением векторной графики, но и со всяким численным её представлением. Векторные модели при численных преобразованиях и перевычислениях координат разбалтываются всегда. Вопрос только в том, какой величины, и насколько допустимо такое разбалтывание.

  Нужно подчеркнуть, что описанные невязки геометрических элементов в программе «Стереометрические модели» связаны только с хранением векторной графики в целочисленной форме (с пятью значащими цифрами). Целые числа переводятся в более точную форму (числа с плавающей запятой с восьмью значащими цифрами) в самом начале математических вычислений, и становятся целыми только в самом конце, поэтому сами математические вычисления, несмотря на их сложность, никакой погрешности в результат практически не вносят.
  С другой стороны, использование целых чисел даёт векторной графике значительные преференции в смысле простоты структуры и удобства её использования (см. http://proza.ru/2021/05/02/1008 ).
  Опыт показал, что использование целых чисел в программе «Стереометрические модели» вполне оправдано и удобно.
_________
9.01.2022


Рецензии