Используя плагин Innodb, операторы ALTER TABLE, которые только добавляют или отбрасывают вторичные индексы, могут быть сделаны "быстро", т.е. не восстанавливая таблицу.
Вообще говоря, однако, в MySQL, любой ALTER TABLE включает восстановление всей таблицы, которая может занять очень долгое время (т.е. если таблица имеет полезный объем данных в ней).
действительно необходимо разработать приложение так, чтобы операторы ALTER TABLE не должны были регулярно делаться; Вы, конечно, не хотите ALTER TABLE, сделанного во время нормального выполнения приложения, если Вы не готовы ожидать, или Вы изменяете крошечные таблицы.
Реализацию этого ответа на Python вместе с примером использования можно найти в этом репозитории github.
Получается аналитическое решение на самом деле довольно хорошо использовать этот метод и может сказать вам, когда решение существует, а когда нет (также возможно иметь ровно одно решение.) Нет причин использовать метод Ньютона.
ИМХО, это далеко проще для понимания и проще, чем приведенная ниже трилатерация. Однако в моем тестировании оба метода дают правильные ответы.
Рассмотрим пересечение двух сфер. Чтобы визуализировать это, рассмотрим трехмерный отрезок N, соединяющий два центра сфер. Рассмотрим это поперечное сечение
(источник: googlepages. com )
где красная линия - это поперечное сечение плоскости с нормалью N. Благодаря симметрии вы можете вращать это поперечное сечение под любым углом, и длина отрезков красной линии не может изменяться. Это означает, что полученная кривая пересечения двух сфер представляет собой окружность и должна лежать в плоскости с нормалью N.
При этом давайте перейдем к поиску пересечения. Во-первых, мы хотим описать получившийся круг пересечения двух сфер. Вы не можете сделать это с помощью 1 уравнения, круг в 3D, по сути, является кривой в 3D, и вы не можете описать кривые в 3D с помощью 1 уравнения.
Рассмотрим рисунок и должен лежать в плоскости с нормалью N.
При этом давайте перейдем к поиску пересечения. Сначала мы хотим описать получившийся круг пересечения двух сфер. Вы не можете сделать это с помощью 1 уравнения, круг в 3D, по сути, является кривой в 3D, и вы не можете описать кривые в 3D с помощью 1 уравнения.
Рассмотрим рисунок и должен лежать в плоскости с нормалью N.
При этом давайте перейдем к поиску пересечения. Сначала мы хотим описать получившийся круг пересечения двух сфер. Вы не можете сделать это с помощью 1 уравнения, круг в 3D, по сути, является кривой в 3D, и вы не можете описать кривые в 3D с помощью 1 уравнения.
Рассмотрим рисунок
(источник: googlepages.com )
пусть P будет точкой пересечения синей и красной линий. Пусть h - длина отрезка красной линии от точки P вверх. Обозначим расстояние между двумя центрами через d. Пусть x будет расстоянием от центра малого круга до P. Тогда у нас должно быть
x^2 +h^2 = r1^2
(d-x)^2 +h^2 = r2^2
==> h = sqrt(r1^2 - 1/d^2*(r1^2-r2^2+d^2)^2)
, то есть вы можете найти h, который является радиусом круга пересечения. Вы можете найти центральную точку C окружности от x, вдоль линии N, которая соединяет 2 центра окружности.
Затем вы можете полностью описать окружность как (X, C, U, V - все векторы)
X = C + (h * cos t) U + (h * sin t) V for t in [0,2*PI)
где U и V - перпендикулярные векторы, лежащие в плоскости с нормалью N.
Последняя часть самая простая. Осталось только найти пересечение этой окружности с конечной сферой. Это просто набор уравнений (подставьте для x, y, z в последнем уравнении параметрические формы x, y, z для круга через t и решите для t.)
edit ---
Уравнение, которое вы получите, на самом деле довольно уродливое, вы будете иметь целый набор синусов и косинусов, равных чему-то. Чтобы решить эту проблему, вы можете сделать это двумя способами:
запишите косинусы и синусы в терминах экспонент, используя равенство
e ^ (it) = cos t + i sin t
, затем сгруппируйте все e ^ ( it), и вы должны получить квадратные уравнения для e ^ (it) которую вы можете решить для квадратной формулы, а затем решить для t. Это даст вам точное решение. Этот метод на самом деле скажет вам точно, существует ли решение, два существуют или одно существует в зависимости от того, сколько точек из квадратичного метода являются действительными.
используйте метод Ньютона для решения для t, этот метод не является точным, но его вычислительные намного проще для понимания, и в этом случае он будет работать очень хорошо.
Обычно вам нужно сделать это за 3 шага. Допустим, у вас есть три сферы: S1, S2 и S3.
Единственная действительно сложная часть здесь - это пересечение сфер, и, к счастью, Mathworld решила это довольно хорошо . Фактически, Mathworld также имеет решение для пересечения кругов .
На основе этой информации вы сможете создать алгоритм.
Вот еще одна интерпретация картинки, которую Эрик разместил выше:
Пусть H будет плоскостью, натянутой на центры трех сфер. Пусть C1, C2, C3 - точки пересечения сфер с H, тогда C1, C2, C3 - окружности. Пусть Lij - прямая, соединяющая две точки пересечения Ci и Cj, тогда три прямые L12, L23, L13 пересекаются в одной точке P. Пусть M - прямая, ортогональная H через P, тогда две точки пересечения лежат на линия M; следовательно, вам просто нужно пересечь M с любой из сфер.
Probably easier than constructing 3D circles, because working mainly on lines and planes:
For each pair of spheres, get the equation of the plane containing their intersection circle, by subtracting the spheres equations (each of the form X^2+Y^2+Z^2+aX+bY+c*Z+d=0). Then you will have three planes P12 P23 P31.
These planes have a common line L, perpendicular to the plane Q by the three centers of the spheres. The two points you are looking for are on this line. The middle of the points is the intersection H between L and Q.
To implement this:
A Cabri 3D construction showing the various planes and line L