На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> центр описанной окружности , подсобите.
    привет всем!
    проблема такова: есть у меня треугольник в трехмерном пространстве, т.е. каждая его вершина задана тремя координатами. как бы мне найти координаты точки, являющейся центром описанной окружности?
    желательно, чтобы было как можно вычислений.
    спасибо заранее.
      Цитата (Lucifer @ 24.12.03, 11:28)
      Уравнение 1: расстояние до вершин одинаково
      Уравнение 2: лежит в плоскости треугольника

      да, ты чего, Lucifer? blink.gif зачем нам два уравнения, тогда сразу будем решать одно уравнение:

      точка являеется центром описанной окружности

      вот я буду какую-то оптимизационную задачу решать с определенной точностью, еще метод Ньютона подключим или еще чего-нибудь численное. не! так не катит абсолютно. dry.gif

      уж лучше радиус по формуле Герона найти и искать путевую точку пересечения двух окружностей, чем так, как ты предлагаешь, но это все равно отстой какой-то.
      Сообщение отредактировано: experimenter -
        Цитата (Lucifer @ 24.12.03, 11:37)
        Цитата
        experimenter, 24.12.03, 11:34
        точка являеется центром вписанной окружности

        формализацию этого я и напписал

        понятно. но я не считаю, что это самый легкий путь. как ты предполагаешь решать задачу, формализированную тобой? численная оптимизация? не.
        это курам на смех. не катит так.
          Цитата
          experimenter, 24.12.03, 14:25
          желательно, чтобы было как можно вычислений

          ну и извращённые утебя желания! smile.gif
          а вобще я думаю такая система решается аналитически

            while(1){}

            вот это вещь! biggrin.gif да, wormball? а то я чего-то поменьше вычислений захотел. biggrin.gif

            Добавлено в
            мне кажется, что второе уравнение, вообщем, лишнее, не так ли?
              так! великий Maple решил двумерную задачу. вот центр для двумерной задачи.
              Цитата

              y0 = -1/2*(-x2^2*x1-y2^2*x1-x2*x3^2-x1^2*x3-y1^2*x3+x1*x3^2+x2^2*x3+y2^2*x3+x2*x1^2+x2*y1^2+x1*y3^2-x2*y3^2)/(x1*y2+y1*x3-y2*x3-x1*y3-x2*y1+x2*y3),
              x0 = 1/2*(-x1^2*y3+x1^2*y2-x3^2*y2+y1^2*y2+y1*y3^2+y3*x2^2-y1*x2^2-y1*y2^2+y1*x3^2-y3^2*y2-y1^2*y3+y3*y2^2)/(x1*y2+y1*x3-y2*x3-x1*y3-x2*y1+x2*y3)

              гляньте правильно или нет, м?

              Добавлено в
              ан, нет. второе уравнение не лишнее. так. сейчас Maple нам все решит. скажите мне, плиз, как написать уравнение плоскости через три точки, а то неохота определитель расписывать.
              Сообщение отредактировано: experimenter -
                на уравнение
                Цитата

                solve({(x1 - x0)^2 + (y1 - y0)^2 + (z1 - z0)^2 - (x2 - x0)^2 - (y2 - y0)^2 - (z2 - z0)^2,(x1 - x0)^2 + (y1 - y0)^2 + (z1 - z0)^2 - (x3 - x0)^2 - (y3 - y0)^2 - (z3 - z0)^2,+(x0 - x1)*((y2-y1)*(z3-z1) - (z2-z1)*(y3-y1))-(y0 - y1)*((x2-x1)*(z3-z1) - (z2-z1)*(x3-x1))+(z0 - z1)*((x2-x1)*(y3-y1) - (y2-y1)*(x3-x1))},{x0,y0,z0});

                так, великий maple выдал:
                Цитата



                x0 = 1/2*(z2^2*x1*y3*y2+z2^2*z1*z3*x1-z2^2*x1*y2*y1+z2^3*z3*x1+z2^3*z1*x3-z2^3*z1*x1+x1^2*x3*y3*y2-x1^2*x2*z3^2+2*z2*x1*y3*z3*y1+z2^2*x1^3+x1*z1^2*y2^2+x1*z1^2*z3^2+x1*y3*y2*x2^2+2*z1*y2*z3*y1*x3+y3^2*x2^3+2*y1*z3*y2*z1*x2+2*z1*y2*z3*x2*y3-4*z2*x1*y3*z3*y2+z2^2*x3^3-4*z3*y1*x2*z1*y3+y3*x2*y1*x3^2-y3*y2*x2*x3^2-y3*x3*y2*x2^2-y1*y2*x2*z1^2+y1*y2*x2*y3^2+y1*y2*x2*x3^2-y1*x3*y3*z1^2-2*z3^2*y2*y1*x3-z3^2*y2*x2*y1-z3^2*y2*x2*y3+y1*x2*z1^2*y3+y1*x3*y2*z1^2-2*y1*y2*x3*y3^2-2*y3*x2*y1*y2^2+y3*x3*y2*y1^2+z1*y3^2*z3*x2+z1*x3^2*z3*x2-z1^2*y2*x2*y3-z1^2*y2*x3*y3+2*x1*z1*z3*y2*y3+z2*z1^3*x3-2*z2*z3*x1^3+z2*x1*z3^3-z2*z1^3*x2-2*z2*x3^3*z1-z2*z3^3*x2-z2^3*z3*x3-z2^2*x1^2*x3+z2^2*x1*y1^2-2*z2^2*x1*z3^2+z2^2*x1*z1^2-z2^2*x1*x3^2-2*z2^2*z1^2*x3+z2^2*z3^2*x3+z2^2*x2*z1^2+z2^2*x2*z3^2+z2^2*x3*y3^2+z2^2*x2*y1^2-x1^2*x3*y3*y1+x1^2*y1*x3*y2+x1^2*x2*y3*y1+x1^2*z1*z3*x2+x1^2*x2*y3*y2-x1^2*x3*z1*z3-x1^2*x2*y1*y2-x1*y3^2*x2^2-x1^2*x2*y3^2-x1^2*y2^2*x3-2*x1^3*y3*y2-x1*z1*z3^3+x1*y1^2*y3^2+x1*y1^2*y2^2+x1*x3^2*y1*y2+x1*y3*x2^2*y1-x1*z1*y2^2*z3-2*x1*z1^2*y2*y3+x1*z3*x2^2*z1-x1*z3^2*y1*y2-x1*y1*y3*x3^2-x1*z3*x3^2*z1-2*x1*y1^2*y3*y2-x1*y1*y2*x2^2-x1*z3^2*y1*y3+x1*z3^2*y2*y3-x1*z1*y3^2*z3+x1*y1*y3*y2^2+x1*y1*y2*y3^2+x1^3*y3^2+x1^3*z3^2+x1^3*y2^2+y1^2*x2^3+y1^2*x3^3+z3^2*x2^3+x3^3*y2^2+z1^2*x3^3+z1^2*x2^3-2*y1*y2*x3^3+x3*y1*y3*y2^2+x3*z1^2*y3^2+x3*z3^2*y1^2+x3*z1^2*z3^2+x3*y1^2*y3^2-x1*x3^2*y2^2+x1*z1^2*y3^2+x1*z3^2*y1^2-2*x1*y3^2*y2^2+x1*y3^3*y2-x1*y1*y2^3+x1*y3*y2^3-x1*y1*y3^3+y1^3*x3*y2-2*y1^2*x3*y2^2-y1^2*x3*x2^2+y3^2*x2*y2^2-2*y3^2*x2*y1^2-y1^3*y2*x2-y1^2*x2*x3^2+z3^2*y1*x2*y3-2*z3*y2^2*z1*x2-z3*y1^2*x3*z1+z3*y1^2*z1*x2+y1*x3*y2*x2^2+y3*y2*x2*y1^2+x3*y3*x2^2*y1-x3*z1*y2^2*z3+x3*z3*x2^2*z1-2*z2^2*z1*z3*x2+z2^2*x3*z1*z3-z2^2*x3*y3*y1+z2*x1*z3*y2^2-z2*x1*z1*y3^2+2*z2*x1*y1*z3*y2-x1*z3^2*x2^2+x1*y3*x3^2*y2+2*z2*x3*y3*z1*y2+2*z2*x1*y3*z1*y2+2*z2*z1*y3*y1*x3-4*z2*z1*y2*y1*x3+2*z2*z1*y3*x2*y1+2*z2*x3*y1*z3*y2+z2^2*y1*x3*y2-2*z2^2*x2*y3*y1-z2^2*x3*y3*y2+z2^2*x2*y3^2+2*z2*z3*y1*y3*x2-y3^3*y2*x2+y3^3*x2*y1+z1^2*y2^2*x2-z1^2*x2^2*x3-2*z1*x2^3*z3-z1^2*x3^2*x2+z3^2*y2^2*x2-z1^3*x3*z3+z1^3*z3*x2-2*z1^2*z3^2*x2+y1*x3*y2^3+y3^2*x3*y2^2-y3*x3*y2^3-2*y3*x2^3*y1-y1^3*x3*y3+z3^2*y2^2*x3+z1*z3^3*x2+y1^3*x2*y3+y1^2*x2*y2^2-z2*x1*z1*x2^2-z2*x1*z1*y2^2-2*z2*x1*z3*y1^2-2*z2*x1*z3*z1^2+z2*x1*z3*x2^2+z2*x1*z1*z3^2+z2*x1*z1*x3^2+z2*x2*z3*x1^2-z2*x2*z1*y3^2-z2*x2*z3*y1^2+z2*x2*z3*z1^2+z2*x2*z1*z3^2+z2*x2*z1*x3^2-z2*x1^2*z1*x2+z2*x1^2*z1*x3-z2*y1^2*z1*x2+z2*y1^2*z1*x3+z2*x2^2*z1*x3+z2*y2^2*z1*x3-z2*y3^2*z3*x2-2*z2*z3^2*x3*z1-z2*x3^2*z3*x2+z2*z1^2*x3*z3-z2*z3*y1^2*x3-z2*z3*y2^2*x3-z2*z3*x2^2*x3-2*z2*z1*y3^2*x3+z2*x1*y3^2*z3+z2*x1*z3*x3^2+z2*x1^2*z3*x3-z2^2*x1*y3*y1)/(-2*x3*x2*y1^2-2*x3^2*y1*y2-2*x1^2*y3*y2+z1^2*y2^2+z3^2*x1^2+z2^2*x3^2+x3^2*z1^2+x3^2*y2^2-2*y3*x2^2*y1-2*z1*y2^2*z3-2*z3^2*x1*x2-2*z1^2*y2*y3+2*x3*z1*z3*x2+x1^2*y3^2-2*x3*x2*y3*y2+x3^2*y1^2-2*x3*x1*y3*y1+z1^2*y3^2+2*x3*x2*y1*y2+x1^2*y2^2-2*z3*x2^2*z1-2*z3^2*y1*y2-2*x1*y3^2*x2-2*z2*x3^2*z1-2*x3*x1*y2^2+2*x3*x1*y3*y2+2*z1*z3*y2*y3+2*x1*x2*y3*y2+2*x1*x2*y3*y1-2*x1*x2*y1*y2+2*x3*x2*y3*y1+2*z1*y1*z3*y2-2*z1*z3*y1*y3+z3^2*y1^2+z1^2*x2^2+2*x3*x1*y2*y1-2*z2*x3*z3*x2+2*z2*x3*z1*x1-2*z2*x1*z1*x2+2*z2*x3*z3*x1-2*x3*z1*z3*x1+z2^2*x1^2-2*z2*y3*z3*y2+2*z2*y3*z1*y2+2*z2*y3*z3*y1-2*z2*y1*z1*y2+2*z2*z3*x2*x1+z2^2*y3^2-2*z2^2*x3*x1-2*z2^2*y1*y3-2*z2*z3*x1^2-2*z2*y1^2*z3-2*z2*y3^2*z1-2*x3*z1^2*x2+2*z2*x3*z1*x2+y1^2*x2^2+z3^2*x2^2+z3^2*y2^2+z2^2*y1^2+y3^2*x2^2+2*z1*z3*x2*x1+2*z2*y1*z1*y3+2*z2*y1*z3*y2),

                z0 = 1/2*(-2*y1*z3*y2*y3^2-2*y2*z1^3*y3-x2*z3*y2^2*x3-y1*z1^2*y3*z3-y1*z1*y2^3-2*y1*z3^3*y2-z1*z3^2*y2^2+z3*y2^2*y3^2+y1*z3*y2^3-2*z1*y2^2*y3^2-y3*z3*y2^3+y3*z1*y2^3-z1^2*y2^2*z3+z3^3*y1^2+z1^3*y2^2+z3*y2*y1^3-2*y1^2*z3*y2^2+z3*y1^2*y3^2-y3*z3*y1^3+y1^2*z1*y3^2+z1^3*y3^2+z3^3*y2^2-y2*z1*x2^2*y1+y2*z1*x2^2*y3-y1*y3*z1*z3^2-2*y2*z1*y3*y1^2+y2*y3*z3*y1^2-y2*z3*x2^2*y3+y2*y3*z1*z3^2+y2*y3^3*z1+y1*y3*z1*y2^2+y2*z1^2*y3*z3+y2*z3*x2^2*y1-y1*y3^3*z1+y1*y3*z3*y2^2+y1*z1^2*y2*z3-z3*x2^3*x3+x2^3*z1*x3+x2*y2^2*z1*x3-x1*z1*x2^3+z1*y1*y2*y3^2+z1*y1^2*y2^2+z1*z3^2*y1*y2+z2*y1^3*y3-2*z2^3*y3*y1+z2*x2^2*x3^2+z2*x2^2*x1^2-2*z2*x1^2*x3^2-z2*y2*y1^3-z2*x3*x2*y3^2+z2*y1*z1^2*y3-2*z2^3*x3*x1+z2^3*x3^2+z2^3*x1^2+z2^2*x3*z3*x1+z2^2*y1*z3*y2-z2^2*x1*z1*x2+z2^2*y3*z1*y2+z2^2*x3*z1*x2-z2^2*x3*z3*x2+z2^2*y1*z1*y3-z2^2*z1*y3^2-z2*z3^2*y2*y3-2*z2*y1*y3*y2^2+z2*y1*y2*y3^2-z2^2*y1*z1*y2+z2^2*x3*z1*x1-z2*z3^2*x3*x2+z2*z3^2*x3*x1-z2*z1^2*x1*x2+z2*y1^2*y3*y2+z2*z3^2*y1*y3-z2*y1^2*x2*x1+z2*y1^2*x3*x1-z2*y1*x1^2*y2+z2*y1*y3*x3^2+z2*z1^2*x3*x1+z2*y1^2*x2^2+z2*y3^2*x2^2+z2*x3^3*x1-z2^2*z3*x1^2-z2^2*z1*x3^2-z2^2*z3*y1^2-z2*y3*x3^2*y2+2*z2*x3*x1*y2*y1+z2*y1^2*y2^2+z2*y3*y1*x1^2+2*z2*x3*x2*y3*y1-z2*z3^2*y1^2+z2*y3^2*y2^2-z2*y3^3*y2+z2*y1*y3^3+z2*x3*z1^2*x2-4*z2*x3*x1*y3*y1+2*z2*x3*x1*y3*y2+2*z2*x1*x2*y3*y1+z2*z1^2*y2*y3+z2*z3^2*y1*y2-z2*x1*y3^2*x2-2*z2*x3*x1*y2^2+z2*x1^3*x3+z2*x2*x1*x3^2-2*z2*y3*x2^2*y1-z2*x3^2*z1^2+z2*x1^2*y2^2+z2*x3^2*y2^2+z2*x2*x1^2*x3-2*z2*x2^2*x3*x1-z2*x3^2*y1*y2-z2*x2*x1^3-x2*x1*z1*y2^2+x2*x1*z3*y2^2+z2^2*z3*x2*x1-z2^2*y3*z3*y2+z2^2*y3*z3*y1+z1^3*x3^2-z2*x3*x2*y1^2+x1*z3*x2^3-y3*z3*x1^2*y2-y3*y1*z3*x1^2-2*y3^2*z3*x1*x2-2*z1*y3*x1^2*y2+x1*z1^2*z3*x2+2*z3*y2*y1*x3*x2+z1*x2^2*x3*x1-2*x1^2*x3*z1*x2+x1^2*x3*z3*x2-z3^2*x3*z1*x1+z3^2*z1*x2*x1+x3^2*x1*z1*x2-2*x3^2*z3*x2*x1+z1^2*x3*z3*x2-z1^2*x3*z3*x1-y3*x3^2*z1*y1+2*z3*y1*x1*y3*x2+2*z3*y2*x1*y3*x2-4*z3*y2*x2*y1*x1+2*z3*y2*y1*x3*x1+2*z1*y3*y1*x3*x2+z3*y1^2*x2*x1-z3*y1^2*x3*x1-z3*y1^2*x3*x2-y1*x3^2*y2*z1+z3*y2*y1*x1^2-z3*y2^2*x3*x1+z3*x2^2*x3*x1+z1*y2^2*x1^2+z3^2*x3*z1*x2+z3^3*x1^2+z1^3*x2^2+z2*z3^2*x1*x2-z2*z1^2*y3^2-z2*x1^2*y3*y2-z2*x2*x3^3+z3^3*x2^2-z2*y1*z1^2*y2-z2*z3^2*x1^2-2*z2*y1^2*y3^2+z2*y3^2*x3*x1+z2^3*y3^2+z2^3*y1^2-4*z1*y2*x3*x2*y3-2*z3*y1*x3^2*y2-z1*y2^2*x3*x1+z1*y2*y3*x3^2+2*z1*y2*y1*x3*x2+2*z1*y2*x1*y3*x2+z3*y2^2*x3^2+x3^3*z1*x2-x3^3*z1*x1+y1^2*x3^2*z1+y1^2*z1*x2^2+z3*x1^2*x3^2+y3^2*x1^2*z1+y3^2*z3*x2^2+y3^2*z3*x1^2+y1^2*z3*x3^2-z3*x1^3*x3-2*z1^3*x3*x2-2*z3^3*x1*x2-z3^2*x2^2*z1-z3*z1^2*x2^2+z1*x3^2*x1^2+x1^3*z3*x2-2*z1*x2^2*x3^2+z1*x2^2*x1^2+z3*x2^2*x3^2-2*z3*x2^2*x1^2+2*z1*y2*x3*x1*y3+z1*y3^2*x3*x2-z1*y3^2*x1*x2-z1*y3^2*x3*x1-y3*z1*x2^2*y1-2*y1^2*z1*x3*x2-y3*z3*x2^2*y1)/(-2*x3*x2*y1^2-2*x3^2*y1*y2-2*x1^2*y3*y2+z1^2*y2^2+z3^2*x1^2+z2^2*x3^2+x3^2*z1^2+x3^2*y2^2-2*y3*x2^2*y1-2*z1*y2^2*z3-2*z3^2*x1*x2-2*z1^2*y2*y3+2*x3*z1*z3*x2+x1^2*y3^2-2*x3*x2*y3*y2+x3^2*y1^2-2*x3*x1*y3*y1+z1^2*y3^2+2*x3*x2*y1*y2+x1^2*y2^2-2*z3*x2^2*z1-2*z3^2*y1*y2-2*x1*y3^2*x2-2*z2*x3^2*z1-2*x3*x1*y2^2+2*x3*x1*y3*y2+2*z1*z3*y2*y3+2*x1*x2*y3*y2+2*x1*x2*y3*y1-2*x1*x2*y1*y2+2*x3*x2*y3*y1+2*z1*y1*z3*y2-2*z1*z3*y1*y3+z3^2*y1^2+z1^2*x2^2+2*x3*x1*y2*y1-2*z2*x3*z3*x2+2*z2*x3*z1*x1-2*z2*x1*z1*x2+2*z2*x3*z3*x1-2*x3*z1*z3*x1+z2^2*x1^2-2*z2*y3*z3*y2+2*z2*y3*z1*y2+2*z2*y3*z3*y1-2*z2*y1*z1*y2+2*z2*z3*x2*x1+z2^2*y3^2-2*z2^2*x3*x1-2*z2^2*y1*y3-2*z2*z3*x1^2-2*z2*y1^2*z3-2*z2*y3^2*z1-2*x3*z1^2*x2+2*z2*x3*z1*x2+y1^2*x2^2+z3^2*x2^2+z3^2*y2^2+z2^2*y1^2+y3^2*x2^2+2*z1*z3*x2*x1+2*z2*y1*z1*y3+2*z2*y1*z3*y2),


                y0 = 1/2*(z2^2*z1^2*y2+y3^3*x2^2+z1^2*y3^3+x1^2*y2^3+z2^3*z3*y1-z2^3*z1*y1+z2^3*z1*y3+x3^2*y1^3+2*x3*z1*y1*z3*x2-2*z2*y1^3*z3-z2*x3^2*y2*z1-x3*x2*y3*y2^2+x3*x2*y3*y1^2+x3*x2*y3*x1^2-x3*x1*y3*z1^2-x3*x1*y3*y1^2-x3*x2*z1^2*y3+x3^2*y1*x1^2-2*x3*x2*y1*x1^2+x3^2*y1*z1^2+x3*x1*y2*z1^2+x3*x1*y2*y1^2+y2*x3*x2*y1^2-y2*x3*x2*z3^2-y2*x3*x2*y3^2+z1*z3^3*y2-z1*z3^3*y1+y1*x3*x2*y3^2+y2*x3*x1*z3^2+y2*x3*x1*y3^2+z1*y3*z3*y2^2-z1*y3*z3*y1^2+z1*z3*y2*x3^2+z1*z3*y2*y3^2-z1*z3*y1*y3^2-z1*z3*y1*x3^2+z3^2*y2^3-x1*x2^3*y1-x1^3*y2*x2+z3^2*y1*x1^2+y1*x3^3*x2-y1*x3^3*x1-z1^3*y3*z3-z1^2*y3*y2^2+y2*x3^3*x1+2*z1*x2*y2*z3*x1-x1^2*y3*y2^2-2*x1^2*y3*x2^2+x1*x2^3*y3+x1^3*x2*y3-z1*x2^2*y1*z3-z1^2*x2*y2*x3+x1^2*z1*y2*z3+x1*x2*y3*y1^2-x1*x2*y1*y2^2+x1*x2*z1^2*y3+z1^2*y3*z3^2+z1^2*y3*x3^2+y3*x2^2*x3^2+x1^2*y3*z3^2+x1^2*y3*x3^2-x1^2*y2*y3^2-2*z1^2*y2*z3^2-z1^2*y2*y3^2-y3*x2^2*y1^2+y1*x2^2*z1^2+y3*x2^2*z3^2+x1^2*y3^3-2*z1*y2*z3*x2^2+z1^2*y2^3+z1^2*y2*x2^2-2*z1*y2^3*z3-y1*x2^2*y3^2+y1*x2^2*x1^2+2*z3*x2*y2*z1*x3-z3^2*x2*y2*x1-z3^2*x1*y1*x2-2*x3^2*y2*x1^2-x3^2*y1*y2^2+x3^2*y2*x2^2+x3*x1^3*y2+x1*y1*x3*y2^2+x1*y1*x3*x2^2+x1*x2*y3*y2^2-z2*z3^3*y2+z2*z1^3*y3-y1*x3*x1*z3^2-y1*x3*x1*y3^2+y1*x3*x2*z3^2+z1*z3*y2*y1^2-z1*z3*x2^2*y3+z1*y1*z3*y2^2+2*z1*z3*x1*x2*y3-z1*z3*x1^2*y3+y1*z1^2*z3^2+z1^3*y2*z3+y1^3*x2^2-2*x3*x1*y2*x2^2+x3^2*y2^3-x1*y2*x2*z1^2-x1*y2*x2*y1^2-z3^2*y1*y2^2-z3^2*y2*y1^2+x2*y1*x1*x3^2+x1*y2*x2*y3^2+x1*y2*x2*x3^2-y2*x3^3*x2-2*x1*y3^3*x2+z3^2*y2*x2^2-2*x1*y3*x2*z3^2+y2*x3*x2*x1^2-2*x1*y3*x2*x3^2+x2*y1*x1*y3^2+z3^2*y1^3-z2^2*y1^2*y3+z2^2*x3^2*y2-z2^2*y1*y3^2-z2^3*y3*z3-z2^2*x3*x2*y3-2*z2^2*y2*x3*x1-2*z2^2*z1*z3*y2+z2^2*z1*z3*y1+z2^2*x1*y3*x2-z2^2*x2*y1*x1+z2*y1*z3*y2^2+z2*z3*y2*y1^2+z2*z1^2*y3*z3+z2*z3*x2^2*y1-z2*z3*x2^2*y3+z2^2*z1*y3*z3-z2^2*x3*x1*y3-z2^2*y1*x3*x1+z2^2*y1*x3*x2+z2*z3*y1*x3^2+z2*z3*y1*y3^2-z2*z3*y2*y3^2+z2*y1*z1*z3^2+2*z2*x3*y2*z3*x1+2*z2*z3*x1*y1*x3-z2*z3*x1^2*y3-z2*z3*x1^2*y2+z2*z1*z3^2*y2-z2*z3*y2*x3^2+z2^2*y3*z3^2+z2*y3*z1*y2^2-z2*x1^2*y2*z1+z2*z1^2*y2*z3+z2*z1*y2*y3^2-2*z2*y1*z3*x1^2-2*z2*y3*z1*z3^2-2*z2*y3*z1*x3^2-z2*y3*z3*y2^2+z2^2*y1^3+2*z2*z3*x1*x2*y1+2*z2*z3*x1*x2*y3+z2*y1*z1*y3^2-4*z2*x3*y1*z3*x2+z2*z1*x2^2*y3+z2*x1^2*z1*y3-4*z2*x1*x2*z1*y3+2*z2*x3*z1*x1*y3-z2*y1*z1*y2^2+z2*z1*y3*y1^2-2*z2*y3^3*z1-2*z2^2*y1*z3^2+z2^2*x1^2*y2+z2^2*y1*x1^2+z2^2*y3*x3^2+z2^2*y1*z1^2+z2^2*z3^2*y2+2*z2*z1*x3*x2*y1+2*z2*z1*x3*x1*y2+2*z2*x3*x2*z1*y3-z2*z1^3*y2-z2*x3^2*z1*y1-2*z2*y1*z3*z1^2+z2^2*y3^3+z2*y3*z3*y1^2-2*z2^2*z1^2*y3+x3*x2*y1*y2^2-x3*x2^3*y3+x3*x1*y3*y2^2-2*x3^2*y1*x2^2-2*x3*x2*y1*z1^2-2*x3*x2*y1^3+x3*x1*y3*x2^2-2*x3*x1*y2^3-z2*z1*y2*y1^2-4*x3*z1*y2*z3*x1-z2*z1*x2^2*y1+z2*z3^3*y1+x1^2*y2*x2^2+x3*x2^3*y1-x3^2*y2*y1^2-x3*x1^3*y3)/(-2*x3*x2*y1^2-2*x3^2*y1*y2-2*x1^2*y3*y2+z1^2*y2^2+z3^2*x1^2+z2^2*x3^2+x3^2*z1^2+x3^2*y2^2-2*y3*x2^2*y1-2*z1*y2^2*z3-2*z3^2*x1*x2-2*z1^2*y2*y3+2*x3*z1*z3*x2+x1^2*y3^2-2*x3*x2*y3*y2+x3^2*y1^2-2*x3*x1*y3*y1+z1^2*y3^2+2*x3*x2*y1*y2+x1^2*y2^2-2*z3*x2^2*z1-2*z3^2*y1*y2-2*x1*y3^2*x2-2*z2*x3^2*z1-2*x3*x1*y2^2+2*x3*x1*y3*y2+2*z1*z3*y2*y3+2*x1*x2*y3*y2+2*x1*x2*y3*y1-2*x1*x2*y1*y2+2*x3*x2*y3*y1+2*z1*y1*z3*y2-2*z1*z3*y1*y3+z3^2*y1^2+z1^2*x2^2+2*x3*x1*y2*y1-2*z2*x3*z3*x2+2*z2*x3*z1*x1-2*z2*x1*z1*x2+2*z2*x3*z3*x1-2*x3*z1*z3*x1+z2^2*x1^2-2*z2*y3*z3*y2+2*z2*y3*z1*y2+2*z2*y3*z3*y1-2*z2*y1*z1*y2+2*z2*z3*x2*x1+z2^2*y3^2-2*z2^2*x3*x1-2*z2^2*y1*y3-2*z2*z3*x1^2-2*z2*y1^2*z3-2*z2*y3^2*z1-2*x3*z1^2*x2+2*z2*x3*z1*x2+y1^2*x2^2+z3^2*x2^2+z3^2*y2^2+z2^2*y1^2+y3^2*x2^2+2*z1*z3*x2*x1+2*z2*y1*z1*y3+2*z2*y1*z3*y2)

                ну, как вам аналитическое решение?
                Сообщение отредактировано: experimenter -
                  так и охота сказать, что козел не Maple, а кое-кто другой. и чего он козел вдруг? ну, записывается оно так твое уравнение плоскости и что это меняет, не пойму?
                    вроде даже правильно получается, как ни странно. пользуйтесь, кому надо, такими офигенными формулами!
                    кстати, а вроде бы центр лежит на точке пересечения медиан лежит, так надо взять 2/3 медианы и будет точка, м?

                    Добавлено в
                    Цитата
                    В такой форме оно намного проще выглядит.

                    при чем тут проще или не проще, когда надо в Maple все забивать? он твоей записи не поймет, надо все равно расписывать. biggrin.gif tongue.gif кстати, в виде определителя это еще проще выглядит. tongue.gif
                      ладно, правда или нет, а задачу я решил, вроде как, и пошел домой. ты лучше проверь правильность полученных формул, если не лень. насколько я понимаю, они правильные.
                        так можно трёхмерныый треугольник превратить в двумерный с помощью ортогонализации грама-шмидта, решить двумерную задачу, а потом ответ перевести в трёхмерную систему.
                        итак, ортогонализацыя по граму-шмидту. сия процедура нужна для задания системы координат на плоскости, в которой лежит треугольник. как известно, двумерная система координат состоит из двух векторов единичной длины, или ортов. выберем первым ортом единичный вектор е1, направленный по направлению от вершины А к вершине В. второй орт будет лежать в этой же плоскости (плоскости треугольника), тоесь будет являться линейной комбинацией векторов АВ и АС(е2=к1*АВ+к2*АС), и в то же время он ортогонален вектору АВ (е2*АВ=0) по определению ортогонального базиса, а для ортонормированности надо, чтобы |е2|=1. составляем систему уравнений относительно к1 и к2:

                            __    __  __
                        (к1*АВ+к2*АС)*АВ=0
                            __    __      __    __
                        (к1*АВ+к2*АС)*(к1*АВ+к2*АС)=1
                        и получаем вектор е2. теперь у нас в руках ортонормированный базис. координаты точек треугольника в етом базисе будут выражаться так:


                        А1=А2=0 (мы выбрали А за начало координат)
                           __  _ _
                        В1=е1*(В-А)
                           __  _ _
                        В2=е2*(В-А)=0 (АВ ортогонально е2!)
                           __  _ _
                        С1=е1*(С-А)
                           __  _ _
                        С2=е2*(С-А)
                        , то есть это будут просто скалярные произведения ортов и положений точек относительно точки А. после етого мы решаем двумерную задачу с помощью формул, выведенных великим maple, и получаем ответ в виде точки D в двумерной системе координат. переводим её в трёхмерную систему:

                        _    __    __ _
                        D=D1*e1+D2*e2+А
                        ивсё smile.gif

                        собственно я думаю великий maple какраз включил ортогонализацию в ответ, и оттого он такой раздутый
                        Сообщение отредактировано: wormball -
                          ...лежит в точке пересечения серединных перпендикуляров он, почти попал с медианами. smile.gif
                          На всякий, центр вписанной - в точке персечения биссектрис...
                            FAQ по сабжу (трехмерный случай рассматривается в топике Jonathan R Shewchuk ближе к середине документа):
                            http://www.ics.uci.edu/~eppstein/junkyard/circumcenter.html
                              вот, кстати, ответы без степеней ^, а то С++ отказыается их понимать, да и приоритет у них больно низкий.
                              Цитата

                              x0 = 1./2*(z2*z2*x1*y3*y2+z2*z2*z1*z3*x1-z2*z2*x1*y2*y1+z2*z2*z2*z3*x1+z2*z2*z2*z1*x3-z2*z2*z2*z1*x1+x1*x1*x3*y3*y2-x1*x1*x2*z3*z3+2*z2*x1*y3*z3*y1+z2*z2*x1*x1*x1+x1*z1*z1*y2*y2+x1*z1*z1*z3*z3+x1*y3*y2*x2*x2+2*z1*y2*z3*y1*x3+y3*y3*x2*x2*x2+2*y1*z3*y2*z1*x2+2*z1*y2*z3*x2*y3-4*z2*x1*y3*z3*y2+z2*z2*x3*x3*x3-4*z3*y1*x2*z1*y3+y3*x2*y1*x3*x3-y3*y2*x2*x3*x3-y3*x3*y2*x2*x2-y1*y2*x2*z1*z1+y1*y2*x2*y3*y3+y1*y2*x2*x3*x3-y1*x3*y3*z1*z1-2*z3*z3*y2*y1*x3-z3*z3*y2*x2*y1-z3*z3*y2*x2*y3+y1*x2*z1*z1*y3+y1*x3*y2*z1*z1-2*y1*y2*x3*y3*y3-2*y3*x2*y1*y2*y2+y3*x3*y2*y1*y1+z1*y3*y3*z3*x2+z1*x3*x3*z3*x2-z1*z1*y2*x2*y3-z1*z1*y2*x3*y3+2*x1*z1*z3*y2*y3+z2*z1*z1*z1*x3-2*z2*z3*x1*x1*x1+z2*x1*z3*z3*z3-z2*z1*z1*z1*x2-2*z2*x3*x3*x3*z1-z2*z3*z3*z3*x2-z2*z2*z2*z3*x3-z2*z2*x1*x1*x3+z2*z2*x1*y1*y1-2*z2*z2*x1*z3*z3+z2*z2*x1*z1*z1-z2*z2*x1*x3*x3-2*z2*z2*z1*z1*x3+z2*z2*z3*z3*x3+z2*z2*x2*z1*z1+z2*z2*x2*z3*z3+z2*z2*x3*y3*y3+z2*z2*x2*y1*y1-x1*x1*x3*y3*y1+x1*x1*y1*x3*y2+x1*x1*x2*y3*y1+x1*x1*z1*z3*x2+x1*x1*x2*y3*y2-x1*x1*x3*z1*z3-x1*x1*x2*y1*y2-x1*y3*y3*x2*x2-x1*x1*x2*y3*y3-x1*x1*y2*y2*x3-2*x1*x1*x1*y3*y2-x1*z1*z3*z3*z3+x1*y1*y1*y3*y3+x1*y1*y1*y2*y2+x1*x3*x3*y1*y2+x1*y3*x2*x2*y1-x1*z1*y2*y2*z3-2*x1*z1*z1*y2*y3+x1*z3*x2*x2*z1-x1*z3*z3*y1*y2-x1*y1*y3*x3*x3-x1*z3*x3*x3*z1-2*x1*y1*y1*y3*y2-x1*y1*y2*x2*x2-x1*z3*z3*y1*y3+x1*z3*z3*y2*y3-x1*z1*y3*y3*z3+x1*y1*y3*y2*y2+x1*y1*y2*y3*y3+x1*x1*x1*y3*y3+x1*x1*x1*z3*z3+x1*x1*x1*y2*y2+y1*y1*x2*x2*x2+y1*y1*x3*x3*x3+z3*z3*x2*x2*x2+x3*x3*x3*y2*y2+z1*z1*x3*x3*x3+z1*z1*x2*x2*x2-2*y1*y2*x3*x3*x3+x3*y1*y3*y2*y2+x3*z1*z1*y3*y3+x3*z3*z3*y1*y1+x3*z1*z1*z3*z3+x3*y1*y1*y3*y3-x1*x3*x3*y2*y2+x1*z1*z1*y3*y3+x1*z3*z3*y1*y1-2*x1*y3*y3*y2*y2+x1*y3*y3*y3*y2-x1*y1*y2*y2*y2+x1*y3*y2*y2*y2-x1*y1*y3*y3*y3+y1*y1*y1*x3*y2-2*y1*y1*x3*y2*y2-y1*y1*x3*x2*x2+y3*y3*x2*y2*y2-2*y3*y3*x2*y1*y1-y1*y1*y1*y2*x2-y1*y1*x2*x3*x3+z3*z3*y1*x2*y3-2*z3*y2*y2*z1*x2-z3*y1*y1*x3*z1+z3*y1*y1*z1*x2+y1*x3*y2*x2*x2+y3*y2*x2*y1*y1+x3*y3*x2*x2*y1-x3*z1*y2*y2*z3+x3*z3*x2*x2*z1-2*z2*z2*z1*z3*x2+z2*z2*x3*z1*z3-z2*z2*x3*y3*y1+z2*x1*z3*y2*y2-z2*x1*z1*y3*y3+2*z2*x1*y1*z3*y2-x1*z3*z3*
                              x2*x2+x1*y3*x3*x3*y2+2*z2*x3*y3*z1*y2+2*z2*x1*y3*z1*y2+2*z2*z1*y3*y1*x3-4*z2*z1*y2*y1*x3+2*z2*z1*y3*x2*y1+2*z2*x3*y1*z3*y2+z2*z2*y1*x3*y2-2*z2*z2*x2*y3*y1-z2*z2*x3*y3*y2+z2*z2*x2*y3*y3+2*z2*z3*y1*y3*x2-y3*y3*y3*y2*x2+y3*y3*y3*x2*y1+z1*z1*y2*y2*x2-z1*z1*x2*x2*x3-2*z1*x2*x2*x2*z3-z1*z1*x3*x3*x2+z3*z3*y2*y2*x2-z1*z1*z1*x3*z3+z1*z1*z1*z3*x2-2*z1*z1*z3*z3*x2+y1*x3*y2*y2*y2+y3*y3*x3*y2*y2-y3*x3*y2*y2*y2-2*y3*x2*x2*x2*y1-y1*y1*y1*x3*y3+z3*z3*y2*y2*x3+z1*z3*z3*z3*x2+y1*y1*y1*x2*y3+y1*y1*x2*y2*y2-z2*x1*z1*x2*x2-z2*x1*z1*y2*y2-2*z2*x1*z3*y1*y1-2*z2*x1*z3*z1*z1+z2*x1*z3*x2*x2+z2*x1*z1*z3*z3+z2*x1*z1*x3*x3+z2*x2*z3*x1*x1-z2*x2*z1*y3*y3-z2*x2*z3*y1*y1+z2*x2*z3*z1*z1+z2*x2*z1*z3*z3+z2*x2*z1*x3*x3-z2*x1*x1*z1*x2+z2*x1*x1*z1*x3-z2*y1*y1*z1*x2+z2*y1*y1*z1*x3+z2*x2*x2*z1*x3+z2*y2*y2*z1*x3-z2*y3*y3*z3*x2-2*z2*z3*z3*x3*z1-z2*x3*x3*z3*x2+z2*z1*z1*x3*z3-z2*z3*y1*y1*x3-z2*z3*y2*y2*x3-z2*z3*x2*x2*x3-2*z2*z1*y3*y3*x3+z2*x1*y3*y3*z3+z2*x1*z3*x3*x3+z2*x1*x1*z3*x3-z2*z2*x1*y3*y1)/(-2*x3*x2*y1*y1-2*x3*x3*y1*y2-2*x1*x1*y3*y2+z1*z1*y2*y2+z3*z3*x1*x1+z2*z2*x3*x3+x3*x3*z1*z1+x3*x3*y2*y2-2*y3*x2*x2*y1-2*z1*y2*y2*z3-2*z3*z3*x1*x2-2*z1*z1*y2*y3+2*x3*z1*z3*x2+x1*x1*y3*y3-2*x3*x2*y3*y2+x3*x3*y1*y1-2*x3*x1*y3*y1+z1*z1*y3*y3+2*x3*x2*y1*y2+x1*x1*y2*y2-2*z3*x2*x2*z1-2*z3*z3*y1*y2-2*x1*y3*y3*x2-2*z2*x3*x3*z1-2*x3*x1*y2*y2+2*x3*x1*y3*y2+2*z1*z3*y2*y3+2*x1*x2*y3*y2+2*x1*x2*y3*y1-2*x1*x2*y1*y2+2*x3*x2*y3*y1+2*z1*y1*z3*y2-2*z1*z3*y1*y3+z3*z3*y1*y1+z1*z1*x2*x2+2*x3*x1*y2*y1-2*z2*x3*z3*x2+2*z2*x3*z1*x1-2*z2*x1*z1*x2+2*z2*x3*z3*x1-2*x3*z1*z3*x1+z2*z2*x1*x1-2*z2*y3*z3*y2+2*z2*y3*z1*y2+2*z2*y3*z3*y1-2*z2*y1*z1*y2+2*z2*z3*x2*x1+z2*z2*y3*y3-2*z2*z2*x3*x1-2*z2*z2*y1*y3-2*z2*z3*x1*x1-2*z2*y1*y1*z3-2*z2*y3*y3*z1-2*x3*z1*z1*x2+2*z2*x3*z1*x2+
                              y1*y1*x2*x2+z3*z3*x2*x2+z3*z3*y2*y2+z2*z2*y1*y1+y3*y3*x2*x2+2*z1*z3*x2*x1+2*z2*y1*z1*y3+2*z2*y1*z3*y2);

                              y0 = 1./2*(z2*z2*z1*z1*y2+y3*y3*y3*x2*x2+z1*z1*y3*y3*y3+x1*x1*y2*y2*y2+z2*z2*z2*z3*y1-z2*z2*z2*z1*y1+z2*z2*z2*z1*y3+x3*x3*y1*y1*y1+2*x3*z1*y1*z3*x2-2*z2*y1*y1*y1*z3-z2*x3*x3*y2*z1-x3*x2*y3*y2*y2+x3*x2*y3*y1*y1+x3*x2*y3*x1*x1-x3*x1*y3*z1*z1-x3*x1*y3*y1*y1-x3*x2*z1*z1*y3+x3*x3*y1*x1*x1-2*x3*x2*y1*x1*x1+x3*x3*y1*z1*z1+x3*x1*y2*z1*z1+x3*x1*y2*y1*y1+y2*x3*x2*y1*y1-y2*x3*x2*z3*z3-y2*x3*x2*y3*y3+z1*z3*z3*z3*y2-z1*z3*z3*z3*y1+y1*x3*x2*y3*y3+y2*x3*x1*z3*z3+y2*x3*x1*y3*y3+z1*y3*z3*y2*y2-z1*y3*z3*y1*y1+z1*z3*y2*x3*x3+z1*z3*y2*y3*y3-z1*z3*y1*y3*y3-z1*z3*y1*x3*x3+z3*z3*y2*y2*y2-x1*x2*x2*x2*y1-x1*x1*x1*y2*x2+z3*z3*y1*x1*x1+y1*x3*x3*x3*x2-y1*x3*x3*x3*x1-z1*z1*z1*y3*z3-z1*z1*y3*y2*y2+y2*x3*x3*x3*x1+2*z1*x2*y2*z3*x1-x1*x1*y3*y2*y2-2*x1*x1*y3*x2*x2+x1*x2*x2*x2*y3+x1*x1*x1*x2*y3-z1*x2*x2*y1*z3-z1*z1*x2*y2*x3+x1*x1*z1*y2*z3+x1*x2*y3*y1*y1-x1*x2*y1*y2*y2+x1*x2*z1*z1*y3+z1*z1*y3*z3*z3+z1*z1*y3*x3*x3+y3*x2*x2*x3*x3+x1*x1*y3*z3*z3+x1*x1*y3*x3*x3-x1*x1*y2*y3*y3-2*z1*z1*y2*z3*z3-z1*z1*y2*y3*y3-y3*x2*x2*y1*y1+y1*x2*x2*z1*z1+y3*x2*x2*z3*z3+x1*x1*y3*y3*y3-2*z1*y2*z3*x2*x2+z1*z1*y2*y2*y2+z1*z1*y2*x2*x2-2*z1*y2*y2*y2*z3-y1*x2*x2*y3*y3+y1*x2*x2*x1*x1+2*z3*x2*y2*z1*x3-z3*z3*x2*y2*x1-z3*z3*x1*y1*x2-2*x3*x3*y2*x1*x1-x3*x3*y1*y2*y2+x3*x3*y2*x2*x2+x3*x1*x1*x1*y2+x1*y1*x3*y2*y2+x1*y1*x3*x2*x2+x1*x2*y3*y2*y2-z2*z3*z3*z3*y2+z2*z1*z1*z1*y3-y1*x3*x1*z3*z3-y1*x3*x1*y3*y3+y1*x3*x2*z3*z3+z1*z3*y2*y1*y1-z1*z3*x2*x2*y3+z1*y1*z3*y2*y2+2*z1*z3*x1*x2*y3-z1*z3*x1*x1*y3+y1*z1*z1*z3*z3+z1*z1*z1*y2*z3+y1*y1*y1*x2*x2-2*x3*x1*y2*x2*x2+x3*x3*y2*y2*y2-x1*y2*x2*z1*z1-x1*y2*x2*y1*y1-z3*z3*y1*y2*y2-z3*z3*y2*y1*y1+x2*y1*x1*x3*x3+x1*y2*x2*y3*y3+x1*y2*x2*x3*x3-y2*x3*x3*x3*x2-2*x1*y3*y3*y3*x2+z3*z3*y2*x2*x2-2*x1*y3*x2*z3*z3+y2*x3*x2*x1*x1-2*x1*y3*x2*x3*x3+x2*y1*x1*y3*y3+z3*z3*y1*y1*y1-z2*z2*y1*y1*y3+z2*z2*x3*x3*y2-z2*z2*y1*y3*y3-z2*z2*z2*y3*z3-z2*z2*x3*x2*y3-2*z2*z2*y2*x3*x1-2*z2*z2*z1*z3*y2+z2*z2*z1*z3*y1+z2*z2*x1*y3*x2-z2*z2*x2*y1*x1+z2*y1*z3*y2*y2+z2*z3*y2*y1*y1+z2*z1*z1*y3*z3+z2*z3*x2*x2*y1-z2*z3*x2*x2*y3+z2*z2*z1*y3*z3-z2*z2*x3*x1*y3-z2*z2*y1*x3*x1+z2*z2*y1*x3*x2+z2*z3*
                              y1*x3*x3+z2*z3*y1*y3*y3-z2*z3*y2*y3*y3+z2*y1*z1*z3*z3+2*z2*x3*y2*z3*x1+2*z2*z3*x1*y1*x3-z2*z3*x1*x1*y3-z2*z3*x1*x1*y2+z2*z1*z3*z3*y2-z2*z3*y2*x3*x3+z2*z2*y3*z3*z3+z2*y3*z1*y2*y2-z2*x1*x1*y2*z1+z2*z1*z1*y2*z3+z2*z1*y2*y3*y3-2*z2*y1*z3*x1*x1-2*z2*y3*z1*z3*z3-2*z2*y3*z1*x3*x3-z2*y3*z3*y2*y2+z2*z2*y1*y1*y1+2*z2*z3*x1*x2*y1+2*z2*z3*x1*x2*y3+z2*y1*z1*y3*y3-4*z2*x3*y1*z3*x2+z2*z1*x2*x2*y3+z2*x1*x1*z1*y3-4*z2*x1*x2*z1*y3+2*z2*x3*z1*x1*y3-z2*y1*z1*y2*y2+z2*z1*y3*y1*y1-2*z2*y3*y3*y3*z1-2*z2*z2*y1*z3*z3+z2*z2*x1*x1*y2+z2*z2*y1*x1*x1+z2*z2*y3*x3*x3+z2*z2*y1*z1*z1+z2*z2*z3*z3*y2+2*z2*z1*x3*x2*y1+2*z2*z1*x3*x1*y2+2*z2*x3*x2*z1*y3-z2*z1*z1*z1*y2-z2*x3*x3*z1*y1-2*z2*y1*z3*z1*z1+z2*z2*y3*y3*y3+z2*y3*z3*y1*y1-2*z2*z2*z1*z1*y3+x3*x2*y1*y2*y2-x3*x2*x2*x2*y3+x3*x1*y3*y2*y2-2*x3*x3*y1*x2*x2-2*x3*x2*y1*z1*z1-2*x3*x2*y1*y1*y1+x3*x1*y3*x2*x2-2*x3*x1*y2*y2*y2-z2*z1*y2*y1*y1-4*x3*z1*y2*z3*x1-z2*z1*x2*x2*y1+z2*z3*z3*z3*y1+x1*x1*y2*x2*x2+x3*x2*x2*x2*y1-x3*x3*y2*y1*y1-x3*x1*x1*x1*y3)/(-2*x3*x2*y1*y1-2*x3*x3*y1*y2-2*x1*x1*y3*y2+z1*z1*y2*y2+z3*z3*x1*x1+z2*z2*x3*x3+x3*x3*z1*z1+x3*x3*y2*y2-2*y3*x2*x2*y1-2*z1*y2*y2*z3-2*z3*z3*x1*x2-2*z1*z1*y2*y3+2*x3*z1*z3*x2+x1*x1*y3*y3-2*x3*x2*y3*y2+x3*x3*y1*y1-2*x3*x1*y3*y1+z1*z1*y3*y3+2*x3*x2*y1*y2+x1*x1*y2*y2-2*z3*x2*x2*z1-2*z3*z3*y1*y2-2*x1*y3*y3*x2-2*z2*x3*x3*z1-2*x3*x1*y2*y2+2*x3*x1*y3*y2+2*z1*z3*y2*y3+2*x1*x2*y3*y2+2*x1*x2*y3*y1-2*x1*x2*y1*y2+2*x3*x2*y3*y1+2*z1*y1*z3*y2-2*z1*z3*y1*y3+z3*z3*y1*y1+z1*z1*x2*x2+2*x3*x1*y2*y1-2*z2*x3*z3*x2+2*z2*x3*z1*x1-2*z2*x1*z1*x2+2*z2*x3*z3*x1-2*x3*z1*z3*x1+z2*z2*x1*x1-2*z2*y3*z3*y2+2*z2*y3*z1*y2+2*z2*y3*z3*y1-2*z2*y1*z1*y2+2*z2*z3*x2*x1+z2*z2*y3*y3-2*z2*z2*x3*x1-2*z2*z2*y1*y3-2*z2*z3*x1*x1-2*z2*y1*y1*z3-2*z2*y3*y3*z1-2*x3*z1*z1*x2+2*z2*x3*z1*x2+y1*y1*x2*x2+z3*z3*x2*x2+
                              z3*z3*y2*y2+z2*z2*y1*y1+y3*y3*x2*x2+2*z1*z3*x2*x1+2*z2*y1*z1*y3+2*z2*y1*z3*y2);

                              z0 = 1./2*(-2*y1*z3*y2*y3*y3-2*y2*z1*z1*z1*y3-x2*z3*y2*y2*x3-y1*z1*z1*y3*z3-y1*z1*y2*y2*y2-2*y1*z3*z3*z3*y2-z1*z3*z3*y2*y2+z3*y2*y2*y3*y3+y1*z3*y2*y2*y2-2*z1*y2*y2*y3*y3-y3*z3*y2*y2*y2+y3*z1*y2*y2*y2-z1*z1*y2*y2*z3+z3*z3*z3*y1*y1+z1*z1*z1*y2*y2+z3*y2*y1*y1*y1-2*y1*y1*z3*y2*y2+z3*y1*y1*y3*y3-y3*z3*y1*y1*y1+y1*y1*z1*y3*y3+z1*z1*z1*y3*y3+z3*z3*z3*y2*y2-y2*z1*x2*x2*y1+y2*z1*x2*x2*y3-y1*y3*z1*z3*z3-2*y2*z1*y3*y1*y1+y2*y3*z3*y1*y1-y2*z3*x2*x2*y3+y2*y3*z1*z3*z3+y2*y3*y3*y3*z1+y1*y3*z1*y2*y2+y2*z1*z1*y3*z3+y2*z3*x2*x2*y1-y1*y3*y3*y3*z1+y1*y3*z3*y2*y2+y1*z1*z1*y2*z3-z3*x2*x2*x2*x3+x2*x2*x2*z1*x3+x2*y2*y2*z1*x3-x1*z1*x2*x2*x2+z1*y1*y2*y3*y3+z1*y1*y1*y2*y2+z1*z3*z3*y1*y2+z2*y1*y1*y1*y3-2*z2*z2*z2*y3*y1+z2*x2*x2*x3*x3+z2*x2*x2*x1*x1-2*z2*x1*x1*x3*x3-z2*y2*y1*y1*y1-z2*x3*x2*y3*y3+z2*y1*z1*z1*y3-2*z2*z2*z2*x3*x1+z2*z2*z2*x3*x3+z2*z2*z2*x1*x1+z2*z2*x3*z3*x1+z2*z2*y1*z3*y2-z2*z2*x1*z1*x2+z2*z2*y3*z1*y2+z2*z2*x3*z1*x2-z2*z2*x3*z3*x2+z2*z2*y1*z1*y3-z2*z2*z1*y3*y3-z2*z3*z3*y2*y3-2*z2*y1*y3*y2*y2+z2*y1*y2*y3*y3-z2*z2*y1*z1*y2+z2*z2*x3*z1*x1-z2*z3*z3*x3*x2+z2*z3*z3*x3*x1-z2*z1*z1*x1*x2+z2*y1*y1*y3*y2+z2*z3*z3*y1*y3-z2*y1*y1*x2*x1+z2*y1*y1*x3*x1-z2*y1*x1*x1*y2+z2*y1*y3*x3*x3+z2*z1*z1*x3*x1+z2*y1*y1*x2*x2+z2*y3*y3*x2*x2+z2*x3*x3*x3*x1-z2*z2*z3*x1*x1-z2*z2*z1*x3*x3-z2*z2*z3*y1*y1-z2*y3*x3*x3*y2+2*z2*x3*x1*y2*y1+z2*y1*y1*y2*y2+z2*y3*y1*x1*x1+2*z2*x3*x2*y3*y1-z2*z3*z3*y1*y1+z2*y3*y3*y2*y2-z2*y3*y3*y3*y2+z2*y1*y3*y3*y3+z2*x3*z1*z1*x2-4*z2*x3*x1*y3*y1+2*z2*x3*x1*y3*y2+2*z2*x1*x2*y3*y1+z2*z1*z1*y2*y3+z2*z3*z3*y1*y2-z2*x1*y3*y3*x2-2*z2*x3*x1*y2*y2+z2*x1*x1*x1*x3+z2*x2*x1*x3*x3-2*z2*y3*x2*x2*y1-z2*x3*x3*z1*z1+z2*x1*x1*y2*y2+z2*x3*x3*y2*y2+z2*x2*x1*x1*x3-2*z2*x2*x2*x3*x1-z2*x3*x3*y1*y2-z2*x2*x1*x1*x1-x2*x1*z1*y2*y2+x2*x1*z3*y2*y2+z2*z2*z3*x2*x1-z2*z2*y3*z3*y2+z2*z2*y3*z3*y1+z1*z1*z1*x3*x3-z2*x3*x2*y1*y1+x1*z3*x2*x2*x2-y3*z3*x1*x1*y2-y3*y1*z3*x1*x1-2*y3*y3*z3*x1*x2-2*z1*y3*x1*x1*y2+x1*z1*z1*z3*x2+2*z3*y2*y1*x3*x2+z1*x2*x2*x3*x1-2*x1*x1*x3*z1*x2+x1*x1*x3*z3*x2-z3*z3*x3*z1*x1+z3*z3*z1*x2*x1+x3*x3*x1*z1*x2-2*x3*x3*z3*x2*x1+z1*z1*x3*z3*x2-z1*z1*x3*
                              z3*x1-y3*x3*x3*z1*y1+2*z3*y1*x1*y3*x2+2*z3*y2*x1*y3*x2-4*z3*y2*x2*y1*x1+2*z3*y2*y1*x3*x1+2*z1*y3*y1*x3*x2+z3*y1*y1*x2*x1-z3*y1*y1*x3*x1-z3*y1*y1*x3*x2-y1*x3*x3*y2*z1+z3*y2*y1*x1*x1-z3*y2*y2*x3*x1+z3*x2*x2*x3*x1+z1*y2*y2*x1*x1+z3*z3*x3*z1*x2+z3*z3*z3*x1*x1+z1*z1*z1*x2*x2+z2*z3*z3*x1*x2-z2*z1*z1*y3*y3-z2*x1*x1*y3*y2-z2*x2*x3*x3*x3+z3*z3*z3*x2*x2-z2*y1*z1*z1*y2-z2*z3*z3*x1*x1-2*z2*y1*y1*y3*y3+z2*y3*y3*x3*x1+z2*z2*z2*y3*y3+z2*z2*z2*y1*y1-4*z1*y2*x3*x2*y3-2*z3*y1*x3*x3*y2-z1*y2*y2*x3*x1+z1*y2*y3*x3*x3+2*z1*y2*y1*x3*x2+2*z1*y2*x1*y3*x2+z3*y2*y2*x3*x3+x3*x3*x3*z1*x2-x3*x3*x3*z1*x1+y1*y1*x3*x3*z1+y1*y1*z1*x2*x2+z3*x1*x1*x3*x3+y3*y3*x1*x1*z1+y3*y3*z3*x2*x2+y3*y3*z3*x1*x1+y1*y1*z3*x3*x3-z3*x1*x1*x1*x3-2*z1*z1*z1*x3*x2-2*z3*z3*z3*x1*x2-z3*z3*x2*x2*z1-z3*z1*z1*x2*x2+z1*x3*x3*x1*x1+x1*x1*x1*z3*x2-2*z1*x2*x2*x3*x3+z1*x2*x2*x1*x1+z3*x2*x2*x3*x3-2*z3*x2*x2*x1*x1+2*z1*y2*x3*x1*y3+z1*y3*y3*x3*x2-z1*y3*y3*x1*x2-z1*y3*y3*x3*x1-y3*z1*x2*x2*y1-2*y1*y1*z1*x3*x2-y3*z3*x2*x2*y1)/(-2*x3*x2*y1*y1-2*x3*x3*y1*y2-2*x1*x1*y3*y2+z1*z1*y2*y2+z3*z3*x1*x1+z2*z2*x3*x3+x3*x3*z1*z1+x3*x3*y2*y2-2*y3*x2*x2*y1-2*z1*y2*y2*z3-2*z3*z3*x1*x2-2*z1*z1*y2*y3+2*x3*z1*z3*x2+x1*x1*y3*y3-2*x3*x2*y3*y2+x3*x3*y1*y1-2*x3*x1*y3*y1+z1*z1*y3*y3+2*x3*x2*y1*y2+x1*x1*y2*y2-2*z3*x2*x2*z1-2*z3*z3*y1*y2-2*x1*y3*y3*x2-2*z2*x3*x3*z1-2*x3*x1*y2*y2+2*x3*x1*y3*y2+2*z1*z3*y2*y3+2*x1*x2*y3*y2+2*x1*x2*y3*y1-2*x1*x2*y1*y2+2*x3*x2*y3*y1+2*z1*y1*z3*y2-2*z1*z3*y1*y3+z3*z3*y1*y1+z1*z1*x2*x2+2*x3*x1*y2*y1-2*z2*x3*z3*x2+2*z2*x3*z1*x1-2*z2*x1*z1*x2+2*z2*x3*z3*x1-2*x3*z1*z3*x1+z2*z2*x1*x1-2*z2*y3*z3*y2+2*z2*y3*z1*y2+2*z2*y3*z3*y1-2*z2*y1*z1*y2+2*z2*z3*x2*x1+z2*z2*y3*y3-2*z2*z2*x3*x1-2*z2*z2*y1*y3-2*z2*z3*x1*x1-2*z2*y1*y1*z3-2*z2*y3*y3*z1-2*x3*z1*z1*x2+2*z2*x3*z1*x2+
                              y1*y1*x2*x2+z3*z3*x2*x2+z3*z3*y2*y2+z2*z2*y1*y1+y3*y3*x2*x2+2*z1*z3*x2*x1+2*z2*y1*z1*y3+2*z2*y1*z3*y2);
                                Есть еще аргумент: для вычисления етих трех выражений требуется больше трех тысяч умножений и делений...

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

                                  тем более, мне надо считать центр всего один раз - при инициализации, а там нет требований к времени, а уже при движении треугольника, двигать его и его точку, что не занимает так уж много вычислений, а решать систему тоже может быть проблематично, так как вы знаете, что итерационный процесс не всегда сходится и где гарантия, что задав опредленное начальное приблежение, например, вершину трегольника, процесс сойдется?
                                  зы
                                  все сходится к тому, что у меня есть фигура, состоящая из треугольников, так я хочу стокновения фигур просчитывать более точно, чем просто помещая фигуру в шар, т.е. если фигуры сталкиваются по шарам, то проверяем столкновения каждой грани одной фигры с каждой гранью другой, используя помешение каждого треуголника в маленький шар, для чего и нужен центр описанной окружности и . может, конечно, это не самый оптимизированный вариант, но мне кажется довольно неплохой, а вам?
                                    Цитата
                                    experimenter, 25.12.03, 15:58
                                    все сходится к тому, что у меня есть фигура, состоящая из треугольников, так я хочу стокновения фигур просчитывать более точно, чем просто помещая фигуру в шар, т.е. если фигуры сталкиваются по шарам, то проверяем столкновения каждой грани одной фигры с каждой гранью другой, используя помешение каждого треуголника в маленький шар, для чего и нужен центр описанной окружности и . может, конечно, это не самый оптимизированный вариант, но мне кажется довольно неплохой, а вам?

                                    вон оно оказывается для чего!! вобще тогда уж можно помещать треугольник в маленький паралепипед smile.gif и никаких центров не надо будет. а потом потипу если паралепипеды пересекаются, то уже проверять собственно треугольники.
                                      а чем параллелипипед для сравнения лучше?
                                        Эй, что за ответ дикий??? Это после всех упрощений???

                                        Если будешь такую задачу решать на бумажке, ответ-то получишь в сто раз быстрее чем по этим формулам.
                                        Гм, если возьмешь середины отрезков треугольника (достаточно двух), векторы из них таким образом, что скалярные произведения(с.п.) этих векторов и соотв. сторон треугольника =0 и с.п. этих векторов и нормали к плоскости треугольника =0. Потом берешь пересечение этих векторов?
                                          Цитата
                                          experimenter, 25.12.03, 17:39
                                          а чем параллелипипед для сравнения лучше?

                                          1. не надо искать центр
                                          2. чтобы узнать пересечение пп надо только сравнить координаты, а не брать корни и возводить в квадрат
                                          3. если ты не понял я говорю о пп таком:
                                          xp1<=xa,xb,xc<=xp2
                                          yp1<=ya,yb,yc<=yp2
                                          zp1<=za,zb,zc<=zp2
                                          тоесь просто кусок пространства содержащий треугольник.

                                          и вобще, мне тут тоже понадобилось столкновения определять. так что я ещё не прощаюсь
                                            кстати откопал щас в форуме то, что изначально спрашивалось.
                                            http://forum.sources.ru/index.php?showtopic=9503
                                            там оно изначально трёхмерное и занимает в ~30..100 раз меньше кода smile.gif smile.gif smile.gif smile.gif
                                            ето я фак по алгоритмам решил дописать, наверное ща ето дело тоже упомяну smile.gif

                                            Добавлено в
                                            зы. извиняюсь, всётаки двумерное. но в данном случае ортогонализация рулит
                                              Цитата (xJohnny @ 25.12.03, 14:55)
                                              Эй, что за ответ дикий??? Это после всех упрощений???

                                              Если будешь такую задачу решать на бумажке, ответ-то получишь в сто раз быстрее чем по этим формулам.
                                              Гм, если возьмешь середины отрезков треугольника (достаточно двух), векторы из них таким образом, что скалярные произведения(с.п.) этих векторов и соотв. сторон треугольника =0 и с.п. этих векторов и нормали к плоскости треугольника =0. Потом берешь пересечение этих векторов?

                                              надо сначала решить задачу твоим способом, а потом уже надо посмортеть насколько там короче ответы. я чего сомневаюсь, что там прямо напорядок меньше. р*бят, вот готовые формулы, я по ним могу посчитать, а по просто предложениям еще не могу.
                                                тебе же русским языком сказали
                                                http://forum.sources.ru/index.php?showtopic=9503
                                                там формула проще не бывает
                                                  да, блин, чего ты привязался со своей ортогонализацией? ты мне конечную формулу покажи, а не эту двумерную, а двумерная у меня на предыдущей странице и ни чуть не сложнее. её еще в трехмреную надо переводить.
                                                    с векторами общаться умеешь? чо тебе тогда мешает ортогонализацию произвести?

                                                    __ __  __
                                                    е1=АВ/|АВ|
                                                    __  __ __   __ __  __ __
                                                    е2=(АС,АВ)/(АВ,АВ)*АВ+АС
                                                    __ __  __
                                                    е2=е2/|е2|
                                                    и получаем ортонормированный базис. далее по тексту
                                                      Nedavno zanimalsya razrabotkoy geom paketa, tak chto u menya yesli resheniye dlya nahojdeniya koordinati tsentra opisannoy okrujnosti dlya treugolnika A1A2A3, gde A1(x1, y1), A2(x2, y2) i A3(x2, y2).

                                                      ExpandedWrap disabled
                                                        type
                                                           TPoint2D = record
                                                               x, y: Single;
                                                           end;
                                                         
                                                        procedure CenterOfCircumcircle(const v1, v2, v3: TPoint2D; var c: TPoint2D);
                                                        var a1, b1, c1, a2, b2, c2, d: Single;
                                                        begin
                                                            a1 := v1.x-v2.x;  b1 := v1.y-v2.y;
                                                            c1 := Sqr(v2.x)-Sqr(v1.x)+Sqr(v2.y)-Sqr(v1.y);
                                                            a2 := v2.x-v3.x;  b2 := v2.y-v3.y;
                                                            c2 := Sqr(v3.x)-Sqr(v2.x)+Sqr(v3.y)-Sqr(v2.Fy);
                                                            d  := 2*(a1*b2-a2*b1);
                                                            c.x := (b1*c2-b2*c1)/d;
                                                            c.y := (c1*a2-c2*a1)/d;
                                                        end;


                                                      P.S. Lutsche pozdno chem nekogda. :)
                                                        Народ. Возникал такая проблема, подскажите пожалуйста. Мне тоже требуется для Курсового найти центр описанной около треугольника окружности для двумерного случая. Я воспользовался приведёнными ранее формулами, но иногда возникает ошибка деления на ноль. Как бы от неё избавиться?
                                                        Заранее благодарен, Александр.
                                                          Цитата NightHost @
                                                          Мне тоже требуется для Курсового найти центр описанной около треугольника окружности для двумерного случая.

                                                          Оззе в свое время хватило вот этого: http://forum.sources.ru/index.php?showtopi...dpost&p=1407276

                                                          Добавлено
                                                          В трехмерном случае все тоже самое:

                                                          Пусть заданы три точки M1(x1,y1,z1), M2(x2,y2,z2), M3(x3,y3,z3), требуется найти точку C(xc,yc,zc), являющуюся центром описаной вокруг треугольника M1M2M3 окружности.

                                                          Для простоты будем искать точку T(xt,yt,zt), такую, что C=(M1+T)/2.

                                                          Уравнение плоскости, проходящей через точку M2 и перпендикулярной вектору M1M2 выглядит так:

                                                          (1) < (x-x2,y-y2,z-z2), M1M2 > = 0

                                                          Уравнение плоскости, проходящей через точку M3 и перпендикулярной вектору M1M3 выглядит так:

                                                          (2) < (x-x3,y-y3,z-z3), M1M3 > = 0

                                                          Пересечением этих плоскостей (в случае невырожденного треугольника) будет прямая, для выделения точки T добавим условие того, что она лежит в плоскости M1M2M3:

                                                          (3) < (x-x1,y-y2,z-z3), n > = 0

                                                          , где n - нормаль к плоскости M1M2M3 (находится через векторное произведение M1M2 и M1M3).

                                                          Итак, имеем систему трех линейных уравнений с тремя неизвестными, которую решаем одним из известных способов (скажем, методом Крамера).
                                                            Так в том то и проблема - я сейчас сделал как по твоей ссылке, но результата нуль. Всё равно находятся такие точки при которых происходит деление на ноль. =(
                                                              Цитата NightHost @
                                                              Так в том то и проблема - я сейчас сделал как по твоей ссылке, но результата нуль. Всё равно находятся такие точки при которых происходит деление на ноль. =(

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

                                                              Кстати, код из сообщ. #26 - рабочий для невырожденных треугольников с точностью до одной описки, на которую тебе укажет компилятор.
                                                                А всё, большое спасибо, ошибка найдена))) Как всегда наитупейшая)
                                                                  Цитата experimenter @
                                                                  да, блин, чего ты привязался со своей ортогонализацией? ты мне конечную формулу покажи

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

                                                                  А вот ортогонализацию здесь делать действительно не нужно, для перехода к старым координатам можно воспользоваться разложением по косому базису:

                                                                  Пусть есть система координат OXYZ и точки v1(v1x,v1y,v1y),v2(v2x,v2y,v2y),v3(v3x,v3y,v3y), надо найти точку c(cx,cy,cz), являющуюся центром описаной вокруг треугольника v1v2v3 окружности.

                                                                  Переходим в систему координат O'X'Y'Z', такую, что ось O'Z' перпендикулярна плоскости треуголька v1v2v3 и z'-координаты всех точек зануляются. Фактически, мы переходим в двухмерную систему координат O'X'Y'.

                                                                  Назначаем O' = v1, тогда новые координаты v1' зануляются:

                                                                  v1'x = 0.0
                                                                  v1'y = 0.0

                                                                  Далее, назначаем ось O'X' идущей по вектору v1v2, а ось O'Y' - лежащей в плоскости v1v2v3 перпендикулярно вектору v1v2 с той же стороны от v1v2, что и v3. Замечательно, что определять компоненты направляющего вектора оси O'Y', т.е. проводить ортогонализацию, при таком раскладе не нужно, т.к. координаты точек v2' и v3' определяются просто:

                                                                  v2'x = |v1v2| (считается по теореме Пифагора)
                                                                  v2'y = 0.0
                                                                  v3'x = <v1v3,v1v2>/|v1v2|
                                                                  v3'y = SQRT(|v1v3|^2-|v3'x|^2) (обратно теорема Пифагора два раза)

                                                                  Итак, переход в плоскость совершен, теперь решаем двухмерную задачу, причем можно воспользоваться тем, что сторона v1'v2' лежит на оси O'X' - тогда система решается очень просто, собственно надо будет решить и не систему, а одно линейное уравнение, получаем точку c'(c'x,c'y) - центр описанной вокруг v1'v2'v3' окружности.

                                                                  Раскладываем c' по косому ненормированому базису O'v2'v3':

                                                                  k12 = (c'x-c'y/(v3'x/v3'y))/v2'x
                                                                  k13 = c'y/v3'y

                                                                  И наконец, переходим к старым координатам:

                                                                  c = v1 + k12*v1v2 + k13*v1v3

                                                                  Вот так то! © Сибирские лесорубы :D
                                                                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                  0 пользователей:


                                                                  Рейтинг@Mail.ru
                                                                  [ Script execution time: 0.1023 ]   [ 14 queries used ]   [ Generated: 25.10.26, 05:55 GMT ]