company_banner

Построение конических сечений


    Намедни, отлаживая фрагмент программы, связанной с геометрическими вычислениями я заметил, что одна из переменных имеет одно и то же значение вне зависимости от значений входных параметров. Естественно, в первую очередь я заподозрил ошибку и потратил некоторое время на ее поиски, но, немного подумав, я понял, что это не ошибка, а одно из известных свойств конических сечений о котором зачастую забывают. После этого я потратил уже значительно больше времени, рисуя красивые геометрические построения, и в итоге решил, что стоит поделиться картинками с кем-то. Так появилась эта пятничная статья.

    Напомню (а тем, кто не учил высшую математику — сообщу), что коническими сечениями называются такие кривые, как эллипс, парабола и гипербола (есть еще вырожденные случаи – на них мы сейчас останавливаться не будем). Вообще, конические сечения — очень замечательный объект, встречаются они во многих областях. Можно вспомнить, например, параболические антенны или орбиты небесных тел.
    Каждое коническое сечение являются сечением конуса (правда, КЭП?), то есть линией, образовавшейся при пересечении конуса и плоскости. Ну а внешний вид зависит от взаимного расположения плоскости и образующих конуса. Также несложно доказать, что все такие линии являются графиками уравнений второго порядка.
    Неужели кому-то нужно доказательство?
    Конус описывается каноническим уравнением второго порядка вида

    Секущую плоскость можно превратить в плоскость z = 0 сделав линейную замену координат. Понятно, что после линейной замены координат степень уравнения не повысится и, подставив в это уравнение значение z = 0, мы получим искомое уравнение второго порядка.

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

    Но для классического определениями эллипса, параболы и гиперболы используется другое их свойство, а именно (цитирую википедию):
    Эллипс — геометрическое место точек Евклидовой плоскости, для которых сумма расстояний до двух данных точек (называемых фокусами) постоянна и больше расстояния между этими точками.

    Гипербола — геометрическое место точек Евклидовой плоскости, для которых абсолютное значение разности расстояний до двух выделенных точек (называемых фокусами) постоянно.

    Парабола — геометрическое место точек Евклидовой плоскости, равноудалённых от данной прямой и данной точки.

    Доказательство этих свойств – прямолинейно. Нужно взять соответствующее уравнение второго порядка, аккуратно выписать формулы для расстояний и произвести алгебраические преобразования. Выкладки довольно громоздки, поэтому здесь я приведу только самый простой случай – параболу.
    Хочется формул?
    Пусть парабола задана уравнением y = a*x*x, где а некоторая константа. Посчитаем расстояние от любой точки параболы, до точки с координатами (0, 1/(4a)):

    Тут второе преобразование проведено с использованием уравнения параболы, а остальные – просто перегруппировка элементов и раскрытие скобок. Получилось, что расстояние от точки параболы до точки (0, 1/(4a)) равно расстоянию от той же точки параболы до прямой y = -1/(4a), что и требовалось.

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


    Пусть O и Q – фокусы эллипса и 2a – заданная сумма расстояний. Возьмем любую прямую, проходящую через фокус O и рассмотри точку X – пересечение прямой и эллипса. Отложив на той же прямой отрезок OY равный 2a, мы получим треугольник QXY. По свойству эллипса QX + OX равно 2a, а значит QX = XY и указанный треугольник равнобедренный. Это позволяет легко восстановить точку X, построив серединный перпендикуляр к QY.


    Для гиперболы построение аналогично, только точку Y надо откладывать в другую сторону. При этом получается, что OY – это разность отрезков XY и OX, а треугольник QXY по-прежнему равнобедренный. Так как алгоритм построения одинаковый, то что именно получится — эллипс или гипербола зависит от того, что больше расстояние между фокусами или длина отрезка, задающего сумма (разность).




    С параболой немножко сложнее. Пусть O – фокус параболы и задана директриса. Вместо равнобедренного прямоугольника тут надо рассмотреть Параллелограмм OXYZ, где прямые XY и OZ перпендикулярны директрисе. По свойству параболы, XY = XO, следовательно, этот параллелограмм является ромбом. Имея прямую OX восстановить ромб и найти точку X уже несложно – достаточно провести биссектрису угла XOZ – получить точку Y, как пересечение биссектрисы и директрисы, а потом восстановить перпендикуляр из этой точки до пересечения с задающей прямой.

    Процесс рисования параболы запечатлен на следующем видео:


    Ну а все желающие могут самостоятельно увидеть последовательность построений, пошевелить задающие точки и понаблюдать за завораживающим движением вспомогательных окружностей здесь. Не забудьте подвигать точки, подписанные как «Drag me».
    Mail.ru Group
    Строим Интернет

    Похожие публикации

    Комментарии 10

      +4
      Кстати, старый добрый способ построения эллипса забыли упомянуть: берём два гвоздика, вбиваем на нужном расстоянии друг от друга, берём нитку длиной 2a и её концы привязываем к гвозикам. Затем оттягиваем нитку в сторону с помощью карандаша и начинаем в таком виде чертить линию.
      Способ напрямую следует из определения эллипса.
        +1
        Да, может быть, стоило упомянуть. Я, как-то, на циркуле с линейкой зациклился.
        +2
        одна из переменных имеет одно и то же значение вне зависимости от значений входных параметров

        Не уловил какая… o_0
        Подскажете?
          +2
          Это была переменная nDiffSpt
          +1
          Как Вы вовремя со статьей!

          Сейчас ради в помощь местным экологам пытаюсь реализовать алгоритм гиперболической навигации для определения координат выстрелов браконьеров в лесу.
          Вот бы еще найти простой способ аналитически находить пересечение гипербол))
            +2
            А что значит «простой способ»? Уравнение четвертой степени решается в радикалах. Формула, конечно длинная, но вычислительная сложность не слишком велика.
              +2
              Если свести к многочлену, проблем уже не будет. Но сводить тоже долго.

              Хотя…
              Пусть есть 4 точки A,B,C,D, и мы хотим найти X такую, что AX-BX=2*d1, CX-DX=2*d2 (d1,d2>=0)
              Сначала найдём середины отрезков AB и CD, обозначим через P,Q. Длины отрезков — через 2*r1 и 2*r2 соответственно. Введём векторы V=PB/r1, W=QD/r2.
              В системе координат с центром P и осью x, направленной вдоль V, правая ветвь гиперболы выражается параметрически:
              x=d1*(a^2+1)/(2*a)
              y=sqrt(r1^2-d1^2)*(a^2-1)/(2*a)
              для a>0.
              Переводим эту точку (x,y) в систему координат с центром Q и осью x, направленной вдоль вектора W. Получим
              x2=f1(a)/(2*a), y2=f2(a)/(2*a),
              где f1 и f2 — многочлены второй степени.
              Вторая гипербола в этой системе координат имеет уравнение x^2/d2^2-y^2/(r2^2-d2^2)=1, причём нас интересуют только точки с x>0. Подставив в это уравнение наши x2,y2, получим
              f1(a)^2/d2^2-f2(a)^2/(r2^2-d2^2)-4*a^2=0 — это многочлен 4-й степени, и найти его вещественные корни — дело техники. Напомню, что нас интересуют только корни с a>0, f1(a)>0.
              Если гипербол больше, то дело обстоит хуже. Придётся применять метод наименьших квадратов — строить сумму многочленов (x^2/p^2-y^2/q^2-1)^2, где x и y для разных многочленов заданы в разных координатных системах, и искать её минимум. Если через частные производные аналитически — получится уравнение 9-й степени. Лучше использовать метод Ньютона, стартуя от уже вычисленных точек пересечения пар гипербол.
                0


                Вот такая у меня система.
                Все кроме x и y известно. Система собрана исходя из главного свойства геометрического места точек гиперболы. Разница расстояний от точки к фокусам = константа.
                Время от времени к ней возвращаюсь, но воз и нынче там.
                Символьный движок Mupad тоже сдался.

                Подскажите, куда копать?
                  +1
                  Maple с моей помощью справился без особого труда.
                  Если координаты точек обозначить (x1,y1), (x2,y2) и (x3,y3), то полиномиальные уравнения гипербол примут такой вид:
                  Уравнения
                  F1 = (-8*x1*x2+4*x2^2+4*x1^2-16*a12^2)*x^2+((8*x1*y1-8*y1*x2+8*x2*y2-8*x1*y2)*y
                  +16*x2*a12^2-4*x2*y2^2-4*x1^3-4*x1*y1^2+16*a12^2*x1+4*x1*x2^2+4*x1^2*x2+4*y1^2*x2+4*x1*y2^2-4*x2^3)*x
                  +(-16*a12^2-8*y1*y2+4*y1^2+4*y2^2)*y^2
                  -(-4*x2^2*y2-4*y1^3+16*y2*a12^2+4*y1^2*y2+4*x1^2*y2-4*x1^2*y1+4*y1*y2^2+4*y1*x2^2-4*y2^3+16*a12^2*y1)*y
                  +x2^4-2*y1^2*x2^2-2*y1^2*y2^2-8*a12^2*x1^2-8*x2^2*a12^2-8*a12^2*y1^2+x1^4+y1^4+2*x2^2*y2^2+2*x1^2*y1^2
                  -2*x1^2*x2^2-2*x1^2*y2^2+y2^4-8*y2^2*a12^2+16*a12^4
                  
                  F2 = (-8*x1*x3+4*x1^2+4*x3^2-16*a13^2)*x^2+((-8*x1*y3+8*x3*y3-8*y1*x3+8*x1*y1)*y
                  +16*a13^2*x1+4*x1*x3^2+4*y1^2*x3+4*x1^2*x3+16*x3*a13^2-4*x3*y3^2+4*x1*y3^2-4*x1^3-4*x3^3-4*x1*y1^2)*x
                  +(-16*a13^2+4*y1^2+4*y3^2-8*y1*y3)*y^2
                  +(16*a13^2*y1-4*y1^3+16*y3*a13^2-4*x1^2*y1+4*y1*x3^2-4*y3^3+4*x1^2*y3+4*y1*y3^2+4*y1^2*y3-4*x3^2*y3)*y
                  +y1^4-2*x1^2*x3^2-2*x1^2*y3^2-2*y1^2*x3^2-2*y1^2*y3^2-8*a13^2*x1^2+16*a13^4-8*a13^2*y1^2+2*x3^2*y3^2
                  +2*x1^2*y1^2-8*x3^2*a13^2-8*y3^2*a13^2+x1^4+y3^4+x3^4
                  


                  Перепишем их в виде
                  F1=a1*x^2+2*b1*x*y+c1*y^2+2*d1*x+2*e1*y+f1;
                  F2=a2*x^2+2*b2*x*y+c2*y^2+2*d2*x+2*e2*y+f2;
                  

                  Базис Гребнера этой системы будет выглядеть так:
                  Базис Гребнера
                  V1 = (4*c2*a2*b1^2-4*b2*c2*b1*a1-4*b1*c1*b2*a2+c2^2*a1^2-2*c1*a2*a1*c2+c1^2*a2^2+4*c1*b2^2*a1)*x^4
                  +(8*c1*b2*e2*a1-4*c2*c1*a2*d1+8*b1^2*c2*d2-4*c2*e1*b2*a1-4*c1*b2*e1*a2-8*b1*c2*b2*d1+4*c2^2*a1*d1
                  -4*c2*c1*a1*d2-4*b1*c2*e2*a1+8*c1*b2^2*d1+4*c1^2*a2*d2+8*b1*c2*e1*a2-4*b1*c1*e2*a2-8*b1*c1*b2*d2)*x^3
                  +(4*c1*b2^2*f1-2*c2*f1*c1*a2-4*b1*c2*b2*f1-8*b1*c2*d1*e2-2*c2*c1*f2*a1+4*c1*e2^2*a1+4*c2*e1^2*a2
                  +4*c1^2*d2^2-4*c2*e1*e2*a1-8*c1*b2*e1*d2+2*c2^2*f1*a1+2*c1^2*f2*a2+16*c1*b2*e2*d1-8*c2*e1*b2*d1
                  -8*c2*c1*d1*d2+4*c2^2*d1^2-4*c1*e2*e1*a2-4*b1*c1*b2*f2+4*b1^2*c2*f2-8*b1*c1*e2*d2+16*b1*c2*d2*e1)*x^2
                  +(-8*c2*d1*e2*e1-4*c2*e1*b2*f1-4*c2*f1*c1*d2+8*c1*e2^2*d1+4*c1^2*f2*d2+8*b1*c2*f2*e1-4*c1*b2*e1*f2
                  +8*c2*d2*e1^2+4*c2^2*d1*f1-8*c1*e2*e1*d2+8*c1*b2*e2*f1-4*c2*c1*f2*d1-4*b1*c2*f1*e2-4*b1*c1*e2*f2)*x
                  -4*c2*f1*e2*e1+4*c2*f2*e1^2-4*c1*e2*e1*f2+c2^2*f1^2-2*c2*c1*f2*f1+4*c1*e2^2*f1+c1^2*f2^2
                  
                  V2 = (-4*c2^2*b1^3*a2-c2*b1*c1^2*a2^2-c2^3*b1*a1^2-4*c1^2*b2^2*b1*a2+c1*b2*c2^2*a1^2+4*c1^2*b2^3*a1
                  +2*c2^2*b1*c1*a2*a1+4*c2^2*b1^2*b2*a1-8*c1*b2^2*a1*c2*b1+8*c1*b2*c2*b1^2*a2-2*c1^2*b2*a2*c2*a1+c1^3*b2*a2^2)*x^3
                  +(-8*c2^2*b1^3*d2+8*c1^2*b2^3*d1-c1^3*a2^2*e2+c2^3*a1^2*e1-4*c2*b1*c1^2*a2*d2-2*c1*a2*c2^2*e1*a1
                  +4*c1*b2*c2^2*a1*d1+16*c1*b2*c2*b1^2*d2-4*c1^2*b2*c2*a1*d2-8*c1*b2*c2*b1*e2*a1+4*c2^2*b1*c1*a1*d2
                  -16*c1*b2^2*d1*c2*b1-4*c1^2*b2*a2*c2*d1+4*c2^2*b1*c1*a2*d1+8*c1*b2*e1*c2*b1*a2+2*c1^2*a2*e2*c2*a1
                  -8*c1^2*b2^2*b1*d2+4*c1^2*b2^2*e2*a1-c1*c2^2*a1^2*e2+c1^2*a2^2*c2*e1-4*c1^2*b2^2*e1*a2-4*c2^2*b1^2*e1*a2
                  -4*c2^3*b1*a1*d1+8*c2^2*b1^2*b2*d1+4*c2^2*b1^2*e2*a1+4*c1^3*b2*a2*d2)*x^2
                  +(-8*c2^2*b1^2*e1*d2-4*c2^3*b1*d1^2+4*c2^2*b1^2*b2*f1-c2^3*b1*a1*f1+2*c2^3*a1*e1*d1+8*c2^2*b1^2*e2*d1
                  -4*c1^2*b2^2*b1*f2+c1^3*b2*a2*f2-2*c1^3*a2*e2*d2-4*c2*b1*c1^2*d2^2+4*c1*b2*c2^2*d1^2+8*c1^2*b2^2*e2*d1
                  -8*c1^2*b2^2*e1*d2+4*c1^3*b2*d2^2+4*c1^2*b2^3*f1-4*c2^2*b1^3*f2+c2^2*b1*c1*a2*f1+c2^2*b1*c1*a1*f2
                  -8*c1*b2^2*f1*c2*b1+c1*b2*c2^2*a1*f1+8*c1*b2*c2*b1^2*f2-c1^2*b2*a2*c2*f1-c1^2*b2*c2*a1*f2
                  -2*c1*c2^2*a1*e1*d2-2*c1*a2*c2^2*e1*d1-2*c1*c2^2*a1*e2*d1+2*c1^2*c2*a1*e2*d2-c2*b1*c1^2*a2*f2
                  -8*c1^2*b2*d2*c2*d1+2*c1^2*a2*e2*c2*d1+8*c2^2*b1*c1*d1*d2+2*c1^2*a2*c2*e1*d2+16*c1*b2*e1*c2*b1*d2
                  -16*c1*b2*c2*b1*e2*d1)*x
                  +4*c2^2*b1^2*e2*f1-2*c1^2*b2*d2*c2*f1+c1^2*a2*e2*c2*f1-4*c2^2*b1^2*e1*f2+2*c2^2*b1*c1*d1*f2-2*c2^3*b1*d1*f1
                  -2*c2*b1*c1^2*d2*f2+2*c2^2*b1*c1*d2*f1+2*c1*b2*c2^2*d1*f1-2*c1^2*b2*c2*d1*f2+c1^2*a2*c2*e1*f2
                  -c1*a2*c2^2*e1*f1-c1*c2^2*a1*e1*f2+c2^3*a1*e1*f1+c1^2*c2*a1*e2*f2-c1*c2^2*a1*e2*f1-4*c1^2*b2^2*e1*f2+4*c1^2*b2^2*e2*f1
                  -8*c1*b2*c2*b1*e2*f1-c1^3*a2*e2*f2+2*c1^3*b2*d2*f2+8*c1*b2*e1*c2*b1*f2
                  +(-2*c2^2*b1^2*c1*f2+2*c2^3*b1^2*f1+2*c1^2*b2^2*c2*f1+2*c1^2*c2*a1*e2^2+2*c2^3*a1*e1^2-2*c1*a2*c2^2*e1^2
                  +4*c1^3*b2*d2*e2-4*c1*b2*c2^2*b1*f1+4*c1^2*b2*c2*b1*f2-2*c1^3*a2*e2^2-2*c1^3*b2^2*f2-4*c1^2*b2*d2*c2*e1
                  +4*c1^2*a2*e2*c2*e1+4*c2^2*b1*c1*d1*e2-4*c2^3*b1*d1*e1-4*c2*b1*c1^2*d2*e2+4*c2^2*b1*c1*d2*e1
                  +4*c1*b2*c2^2*d1*e1-4*c1^2*b2*c2*d1*e2-4*c1*c2^2*a1*e1*e2)*y
                  



                  V1 — уравнение 4-й степени на x, а V2 — линейное уравнение на y (с коэффициентами, содержащими x). К сожалению, в этом виде система будет работать не всегда:(если у двух точек пересечения будут одинаковые значения x, то второе уравнение примет вид 0*y=0. Но в этом случае можно просто подставить x в уравнение гиперболы, и получить квадратное уравнение на y. А потом подставить во вторую гиперболу и проверить.
                    0
                    Maple с моей помощью справился без особого труда.


                    Я пользуюсь MATLAB и Mathcad… Оба продукта ранее использовали символьное ядро Мапл, а сейчас перешли на Mupad.
                    Возможно в сторону Maple стоит таки посмотреть.

                    Большое спасибо за демонстрацию решаемости!
                    Будем разбираться.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.