центр описанной окружности
, подсобите.
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.157] |
|
|
правила раздела Алгоритмы

центр описанной окружности
, подсобите.
|
|
|
|
|
привет всем!
проблема такова: есть у меня треугольник в трехмерном пространстве, т.е. каждая его вершина задана тремя координатами. как бы мне найти координаты точки, являющейся центром описанной окружности? желательно, чтобы было как можно вычислений. спасибо заранее. |
|
Сообщ.
#2
,
|
|||||
|
|
да, ты чего, Lucifer?
вот я буду какую-то оптимизационную задачу решать с определенной точностью, еще метод Ньютона подключим или еще чего-нибудь численное. не! так не катит абсолютно. уж лучше радиус по формуле Герона найти и искать путевую точку пересечения двух окружностей, чем так, как ты предлагаешь, но это все равно отстой какой-то. |
|
Сообщ.
#3
,
|
|||||
|
|
понятно. но я не считаю, что это самый легкий путь. как ты предполагаешь решать задачу, формализированную тобой? численная оптимизация? не. это курам на смех. не катит так. |
|
Сообщ.
#4
,
|
|||
|
|
ну и извращённые утебя желания! а вобще я думаю такая система решается аналитически |
|
Сообщ.
#5
,
|
|||
|
|
вот это вещь! Добавлено в мне кажется, что второе уравнение, вообщем, лишнее, не так ли? |
|
Сообщ.
#6
,
|
|||
|
|
так! великий Maple решил двумерную задачу. вот центр для двумерной задачи.
гляньте правильно или нет, м? Добавлено в ан, нет. второе уравнение не лишнее. так. сейчас Maple нам все решит. скажите мне, плиз, как написать уравнение плоскости через три точки, а то неохота определитель расписывать. |
|
|
|||||
|
|
на уравнение
так, великий maple выдал:
ну, как вам аналитическое решение? |
|
Сообщ.
#8
,
|
|
|
|
так и охота сказать, что козел не Maple, а кое-кто другой. и чего он козел вдруг? ну, записывается оно так твое уравнение плоскости и что это меняет, не пойму?
|
|
Сообщ.
#9
,
|
|||
|
|
вроде даже правильно получается, как ни странно. пользуйтесь, кому надо, такими офигенными формулами! кстати, а вроде бы центр лежит на точке пересечения медиан лежит, так надо взять 2/3 медианы и будет точка, м? Добавлено в
при чем тут проще или не проще, когда надо в Maple все забивать? он твоей записи не поймет, надо все равно расписывать. |
|
Сообщ.
#10
,
|
|
|
|
ладно, правда или нет, а задачу я решил, вроде как, и пошел домой. ты лучше проверь правильность полученных формул, если не лень. насколько я понимаю, они правильные.
|
|
Сообщ.
#11
,
|
|||||||
|
|
так можно трёхмерныый треугольник превратить в двумерный с помощью ортогонализации грама-шмидта, решить двумерную задачу, а потом ответ перевести в трёхмерную систему. итак, ортогонализацыя по граму-шмидту. сия процедура нужна для задания системы координат на плоскости, в которой лежит треугольник. как известно, двумерная система координат состоит из двух векторов единичной длины, или ортов. выберем первым ортом единичный вектор е1, направленный по направлению от вершины А к вершине В. второй орт будет лежать в этой же плоскости (плоскости треугольника), тоесь будет являться линейной комбинацией векторов АВ и АС(е2=к1*АВ+к2*АС), и в то же время он ортогонален вектору АВ (е2*АВ=0) по определению ортогонального базиса, а для ортонормированности надо, чтобы |е2|=1. составляем систему уравнений относительно к1 и к2:
и получаем вектор е2. теперь у нас в руках ортонормированный базис. координаты точек треугольника в етом базисе будут выражаться так:
, то есть это будут просто скалярные произведения ортов и положений точек относительно точки А. после етого мы решаем двумерную задачу с помощью формул, выведенных великим maple, и получаем ответ в виде точки D в двумерной системе координат. переводим её в трёхмерную систему:
ивсё
собственно я думаю великий maple какраз включил ортогонализацию в ответ, и оттого он такой раздутый |
|
Сообщ.
#12
,
|
|
|
|
...лежит в точке пересечения серединных перпендикуляров он, почти попал с медианами.
На всякий, центр вписанной - в точке персечения биссектрис... |
|
Сообщ.
#13
,
|
|
|
|
FAQ по сабжу (трехмерный случай рассматривается в топике Jonathan R Shewchuk ближе к середине документа):
http://www.ics.uci.edu/~eppstein/junkyard/circumcenter.html |
|
Сообщ.
#14
,
|
|||
|
|
вот, кстати, ответы без степеней ^, а то С++ отказыается их понимать, да и приоритет у них больно низкий.
|
|
Сообщ.
#15
,
|
|
|
|
Есть еще аргумент: для вычисления етих трех выражений требуется больше трех тысяч умножений и делений...
Не самый оптимальный итерационный алгоритм должен сойтись с достаточной точностью шагов за 15-20... |
|
Сообщ.
#16
,
|
|
|
|
да, ребят, я с вами согласен, что если бы все происходило в реальном времени, то это было бы аргументом, но я уже засандалил формулы и они работают правильно.
Lucifer, так я же не буду набивать, я просто скопирую и вставлю. тем более, мне надо считать центр всего один раз - при инициализации, а там нет требований к времени, а уже при движении треугольника, двигать его и его точку, что не занимает так уж много вычислений, а решать систему тоже может быть проблематично, так как вы знаете, что итерационный процесс не всегда сходится и где гарантия, что задав опредленное начальное приблежение, например, вершину трегольника, процесс сойдется? зы все сходится к тому, что у меня есть фигура, состоящая из треугольников, так я хочу стокновения фигур просчитывать более точно, чем просто помещая фигуру в шар, т.е. если фигуры сталкиваются по шарам, то проверяем столкновения каждой грани одной фигры с каждой гранью другой, используя помешение каждого треуголника в маленький шар, для чего и нужен центр описанной окружности и . может, конечно, это не самый оптимизированный вариант, но мне кажется довольно неплохой, а вам? |
|
Сообщ.
#17
,
|
|||
|
|
вон оно оказывается для чего!! вобще тогда уж можно помещать треугольник в маленький паралепипед |
|
Сообщ.
#18
,
|
|
|
|
а чем параллелипипед для сравнения лучше?
|
|
Сообщ.
#19
,
|
|
|
|
Эй, что за ответ дикий??? Это после всех упрощений???
Если будешь такую задачу решать на бумажке, ответ-то получишь в сто раз быстрее чем по этим формулам. Гм, если возьмешь середины отрезков треугольника (достаточно двух), векторы из них таким образом, что скалярные произведения(с.п.) этих векторов и соотв. сторон треугольника =0 и с.п. этих векторов и нормали к плоскости треугольника =0. Потом берешь пересечение этих векторов? |
|
Сообщ.
#20
,
|
|||||
|
|
1. не надо искать центр 2. чтобы узнать пересечение пп надо только сравнить координаты, а не брать корни и возводить в квадрат 3. если ты не понял я говорю о пп таком:
тоесь просто кусок пространства содержащий треугольник.
и вобще, мне тут тоже понадобилось столкновения определять. так что я ещё не прощаюсь |
|
Сообщ.
#21
,
|
|
|
|
кстати откопал щас в форуме то, что изначально спрашивалось.
http://forum.sources.ru/index.php?showtopic=9503 там оно изначально трёхмерное и занимает в ~30..100 раз меньше кода ето я фак по алгоритмам решил дописать, наверное ща ето дело тоже упомяну Добавлено в зы. извиняюсь, всётаки двумерное. но в данном случае ортогонализация рулит |
|
Сообщ.
#22
,
|
|||
|
|
надо сначала решить задачу твоим способом, а потом уже надо посмортеть насколько там короче ответы. я чего сомневаюсь, что там прямо напорядок меньше. р*бят, вот готовые формулы, я по ним могу посчитать, а по просто предложениям еще не могу. |
|
Сообщ.
#23
,
|
|
|
|
тебе же русским языком сказали
http://forum.sources.ru/index.php?showtopic=9503 там формула проще не бывает |
|
Сообщ.
#24
,
|
|
|
|
да, блин, чего ты привязался со своей ортогонализацией? ты мне конечную формулу покажи, а не эту двумерную, а двумерная у меня на предыдущей странице и ни чуть не сложнее. её еще в трехмреную надо переводить.
|
|
Сообщ.
#25
,
|
|||
|
|
с векторами общаться умеешь? чо тебе тогда мешает ортогонализацию произвести?
и получаем ортонормированный базис. далее по тексту
|
|
Сообщ.
#26
,
|
|
|
|
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).
![]() ![]() 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. |
|
Сообщ.
#27
,
|
|
|
|
Народ. Возникал такая проблема, подскажите пожалуйста. Мне тоже требуется для Курсового найти центр описанной около треугольника окружности для двумерного случая. Я воспользовался приведёнными ранее формулами, но иногда возникает ошибка деления на ноль. Как бы от неё избавиться?
Заранее благодарен, Александр. |
|
Сообщ.
#28
,
|
|
|
|
Цитата 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). Итак, имеем систему трех линейных уравнений с тремя неизвестными, которую решаем одним из известных способов (скажем, методом Крамера). |
|
Сообщ.
#29
,
|
|
|
|
Так в том то и проблема - я сейчас сделал как по твоей ссылке, но результата нуль. Всё равно находятся такие точки при которых происходит деление на ноль. =(
|
|
Сообщ.
#30
,
|
|
|
|
Цитата NightHost @ Так в том то и проблема - я сейчас сделал как по твоей ссылке, но результата нуль. Всё равно находятся такие точки при которых происходит деление на ноль. =( Если точки лежат на одной прямой, т.е. задают вырожденный треугольник, то так и должно быть, и у меня об этом написано. Если деление на ноль возникает в других случаях, то значит у тебя реализовано что-то не так. Кстати, код из сообщ. #26 - рабочий для невырожденных треугольников с точностью до одной описки, на которую тебе укажет компилятор. |
|
Сообщ.
#31
,
|
|
|
|
А всё, большое спасибо, ошибка найдена))) Как всегда наитупейшая)
|
|
Сообщ.
#32
,
|
|
|
|
Цитата 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 Вот так то! © Сибирские лесорубы |