Это не будет самым чистым решением, но вы могли бы определить представление «Основной базы данных» (если ваши отдельные базы данных не будут оставаться постоянными), которое включает в себя данные из отдельных баз данных и позволяет вам выполнять запросы из одного источника.
Например ...
CREATE VIEW vCombinedRecords AS
SELECT * FROM DB1.dbo.MyTable
UNION ALL
SELECT * FROM DB2.dbo.MyTable
Что позволяет делать ...
SELECT * FROM vCombinedRecords WHERE....
Когда ваши базы данных меняются, вы просто обновляете определение представления, чтобы включить новые таблицы.
Это похоже на классический случай упущения старых технологий - мне удалось выкопать копию Graphics Gems IV из гаража, и похоже, что у Кена Шумейка есть не только алгоритм преобразования из Углы Эйлера произвольного порядка вращения , но также отвечает на большинство других моих вопросов по этой теме. Ура книгам. Если бы я только мог проголосовать за ответ г-на Шумейка и наградить его очками репутации.
Я полагаю, что рекомендация, согласно которой любой, кто работает с углами Эйлера, должен получить копию Graphics Gems IV из своей местной библиотеки и прочитать начальную страницу раздела 222, будет нужно сделать. Это должно быть самое ясное и краткое объяснение проблемы, которое я читал.
Вот полезная ссылка, которую я нашел с тех пор - http: //www.cgafaq. info / wiki / Euler_angles_from_matrix - следует той же системе, что и Shoemake; 24 различных перестановки порядка вращения закодированы как четыре отдельных параметра - внутренняя ось, четность, повторение и кадр - что затем позволяет сократить алгоритм с 24 случаев до 2. В целом это может быть полезной вики - я не пришел
Похоже, что старая ссылка не работает здесь - это еще одна копия «Вычисления углов Эйлера из матрицы вращения. ".
Я решаю это так:
шаг 1: Убедитесь, какая конвенция для вращения Эйлера вам нужна, скажем, zyx.
шаг 2 : Рассчитайте аналитическую матрицу вращения для вращения. Например, если вы хотите, чтобы R(zyx),
**R***zyx* = **R***x*( phi) * **R***y*( theta) * **R***z*( psi), где элементы становятся
R11 = cos(theta)*cos(psi)
R12 = -cos(theta)*sin(psi)
R13 = sin(theta)
R21 = sin(psi)*cos(phi) + sin(theta)*cos(psi)*sin(phi)
R22 = cos(psi)*cos(phi) - sin(theta)*sin(psi)*sin(phi)
R23 = -cos(theta)*sin(phi)
R31 = sin(psi)*sin(phi) - sin(theta)*cos(psi)*cos(phi)
R32 = cos(psi)sin(phi) + sin(theta)*sin(psi)*cos(phi)
R33 = cos(theta)*cos(phi)
этапом 3: Посредством проверки можно найти грех или загар для трех углов с помощью элементов, указанных выше. В этом примере
tan(phi) = -R23/R33
sin(theta) = -R13
tan(psi) = -R12/R11
шаг 4: Рассчитайте матрицу вращения из своего кватерниона (см. wikipedia), для элементов, которые вам нужно вычислить углы, как в пункте 3) выше.
Другие соглашения могут быть вычислены с помощью той же процедуры.
In a right-handed Cartesian coordinate system with Z axis pointing up, do this:
struct Quaternion
{
double w, x, y, z;
};
void GetEulerAngles(Quaternion q, double& yaw, double& pitch, double& roll)
{
const double w2 = q.w*q.w;
const double x2 = q.x*q.x;
const double y2 = q.y*q.y;
const double z2 = q.z*q.z;
const double unitLength = w2 + x2 + y2 + z2; // Normalised == 1, otherwise correction divisor.
const double abcd = q.w*q.x + q.y*q.z;
const double eps = 1e-7; // TODO: pick from your math lib instead of hardcoding.
const double pi = 3.14159265358979323846; // TODO: pick from your math lib instead of hardcoding.
if (abcd > (0.5-eps)*unitLength)
{
yaw = 2 * atan2(q.y, q.w);
pitch = pi;
roll = 0;
}
else if (abcd < (-0.5+eps)*unitLength)
{
yaw = -2 * ::atan2(q.y, q.w);
pitch = -pi;
roll = 0;
}
else
{
const double adbc = q.w*q.z - q.x*q.y;
const double acbd = q.w*q.y - q.x*q.z;
yaw = ::atan2(2*adbc, 1 - 2*(z2+x2));
pitch = ::asin(2*abcd/unitLength);
roll = ::atan2(2*acbd, 1 - 2*(y2+x2));
}
}
Википедия показывает, как можно использовать части кватерниона и вычислить углы Эйлера.
Я разместил свою статью под названием «Преобразование кватерниона в угол Эйлера для произвольной последовательности вращения с использованием геометрических методов» на моем веб-сайте noelhughes.net. У меня также есть алгоритмы для преобразования любого набора углов Эйлера в кватернион и кватернион в / из матрицы направляющих косинусов, которые я опубликую на этих выходных. Они также есть на сайте Мартина Бейкера, хотя их немного сложно найти. Погуглите мое имя, Ноэль Хьюз и кватернионы, и вы должны его найти.
Вот статья, которую я написал о преобразовании кватернионов в углы Эйлера.
В этом месте я также разместил ряд документов, в которых обсуждаются различные аспекты кватернионов, углов Эйлера и матриц вращения (DCM).