2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Нахождение применённого кватерниона
Сообщение02.09.2018, 22:15 
Аватара пользователя


20/07/16
14
Germany
1. Имеем прямоугольный параллелепипед с координатами (x1, y1, z1) и размерами (dx1, dy1, dz1) к нему был применён один из единичных кватернионов, он повернулся и он перешёл в положение (x2, y2, z2) и размеры (dx2, dy2, dz2). Каким образом это посчитать?
2. Ещё больше интересен вопрос, имея начальные и конечные координаты как вычислить кватернион поворота?

Если можно примерчик с конкретными цифрами, пожалуйста.

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение02.09.2018, 22:22 
Заслуженный участник


27/04/09
28128
Isaev в сообщении #1336149 писал(а):
Каким образом это посчитать?
Что посчитать, результат поворота или какой кватернион был применён?

Вообще тут теория простейшая, см. напр. специальную отдельную страницу https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation.

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

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение02.09.2018, 22:50 
Аватара пользователя


20/07/16
14
Germany
arseniiv в сообщении #1336151 писал(а):
Вообще тут теория простейшая...

Теория то простейшая, хотелось бы понять, почему на практике не получается( Учился давно, забылось многое, а кватернионы вообще как-то мимо программы везде пролетели, недавно только о них узнал.
Давайте я попробую нарисовать как делаю, а вы попробуете найти в каком месте у меня проблемы?

-- 02.09.2018, 21:16 --

Начиная с простой точки:
Дана точка с координатами (6, 0, 4) и кватернион поворота (0.5, 0.5, 0.5, 0.5). Найти результирующую точку.
$$\begin{bmatrix}6 & 0 & 0 \\0 & 0 & 0 \\0 & 0 & 4\end{bmatrix} \bullet \begin{bmatrix}0 & 0 & 1 \\1 & 0 & 0 \\0 & 1 & 0\end{bmatrix} =  \begin{bmatrix}0 & 0 & 6 \\0 & 0 & 0 \\0 & 4 & 0\end{bmatrix}$$
Уже тут что-то не сходится... По идее этот кватернион должен выразиться через $$\begin{bmatrix}1 & 0 & 0 \\0 & 1 & 0 \\0 & 0 & 1\end{bmatrix}$$
и тогда всё получается правильно..., но в wiki дана именно такая формула перевода.
Почему получается это смещение строк?
И можно ли это сделать не через матрицы, а через вектора сразу?
Нигде не нашёл формулу перевода кватерниона в вектор...

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение02.09.2018, 23:46 
Заслуженный участник


27/04/09
28128
Так вы вектор диагональной матрицей представили — а зачем? Это столбец должен быть. (А матрица правильная получилась. Кстати если вам важна будет производительность, её вычисление можно оптимизировать до 12 умножений и 12 сложений.) Тогда и результат будет $(4, 6, 0)^t$.

Isaev в сообщении #1336158 писал(а):
И можно ли это сделать не через матрицы, а через вектора сразу?
Можно применить кватернион к одному вектору за меньшее число операций, чем через перевод его в матрицу и её умножение на вектор (в статье выше есть формула с векторным произведением в разделе Performance comparisons / Used methods, но и то надо будет оптимизировать вычисления, иначе толку мало), но уже для двух векторов с матрицей будет быстрее, и разница тем больше, чем больше векторов нужно одинаково поворачивать.

Isaev в сообщении #1336158 писал(а):
Нигде не нашёл формулу перевода кватерниона в вектор...
А её и нет.

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение03.09.2018, 11:18 
Аватара пользователя


20/07/16
14
Germany
arseniiv в сообщении #1336188 писал(а):
Так вы вектор диагональной матрицей представили — а зачем? Это столбец должен быть. (А матрица правильная получилась.

где-то в сети нашёл такой пример перевода вектора в матрицу... Теперь всё проясняется, спасибо.

arseniiv в сообщении #1336188 писал(а):
Кстати если вам важна будет производительность, её вычисление можно оптимизировать до 12 умножений и 12 сложений.) Тогда и результат будет $(4, 6, 0)^t$.

производительность будет нужна, очень... я потому до последнего и не хотел связываться с матрицами, т.к. координаты целочисленные в пределах [0..6], кватернионы единичные, для них и я вообще сделал предварительно вычисленную табличку умножения и производительность не потерялась, потому результат тоже всегда целочисленный... А операции с матрицами какие-то затратные... Потому хотелось обойтись без них, но без них получается слишком много кода, который сложно отлаживать, потому решил попробовать таки их использовать и посмотреть что в производительности потеряется.

Для второго пункта, например, чтобы по начальному и конечному положению вычислить кватернион, придётся же умножать одну матрицу на обратную другой? Чтобы найти обратную матрицу, нужно делить элементы на определитель и без плавающей арифметики не обойтись? Или таки для целочисленных вычислений есть какие-то свои методы?

arseniiv в сообщении #1336188 писал(а):
но уже для двух векторов с матрицей будет быстрее

У меня же два вектора получается? Координат и размеров... или их можно в одну матрицу запаковать?

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение03.09.2018, 17:43 
Заслуженный участник


27/04/09
28128
Isaev в сообщении #1336303 писал(а):
кватернионы единичные
Ну, если они соответствуют только поворотам, которые переставляют координаты и иногда меняют им знаки, то, видимо, можно просто запоминать перестановку (и смены знака) и применять её, но это может оказаться дольше из-за неугадываний ветки условного перехода процессором, а как сделать такое без проверки условий, в отличие от умножения матрицы на столбец, не представлю. Если у вас такие повороты, то и матрицы можно брать (и куда-нибудь записать, конечно) целочисленные из $0,\pm1$ — неужели 9 целочисленных умножений и 6 сложений — так плохо?

В принципе можно попытаться заменить умножения какими-то битовыми операциями, но присутствие $-1$ усложняет дело, и я в таких совсем уж низкоуровневых оптимизациях не разбираюсь, но кто-нибудь, возможно, что-то предложит.

Isaev в сообщении #1336303 писал(а):
У меня же два вектора получается? Координат и размеров... или их можно в одну матрицу запаковать?
Можно запаковать, приставив их друг к другу, но не имею понятия, даст ли это какой-то выигрыш. Что умеют векторные операции процессора, тоже не знаю.

Isaev в сообщении #1336303 писал(а):
Для второго пункта, например, чтобы по начальному и конечному положению вычислить кватернион, придётся же умножать одну матрицу на обратную другой? Чтобы найти обратную матрицу, нужно делить элементы на определитель и без плавающей арифметики не обойтись? Или таки для целочисленных вычислений есть какие-то свои методы?
Целых чисел в любом случае не хватит, если повороты не просто переставляют координаты и меняют им знаки. А если нет, то можно попробовать найти интересующую перестановку как-то в обход, смотря непосредственно кто куда переходит. Но опять не уверен, будет ли это быстрее и таким кодом, на который приятно смотреть и легко отладить.

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение03.09.2018, 18:01 
Аватара пользователя


20/07/16
14
Germany
arseniiv в сообщении #1336410 писал(а):
Можно запаковать, приставив их друг к другу, но не имею понятия, даст ли это какой-то выигрыш.
Одно умножение матриц вместо двух, надеялся я.. нет? Мы же один и тот же кватернион применяем и к координатам и к размерам объекта

arseniiv в сообщении #1336410 писал(а):
Целых чисел в любом случае не хватит, если повороты не просто переставляют координаты и меняют им знаки.
Все вращения и перемещения исключительно в границах положительного октанта, никаких смен знаков

arseniiv в сообщении #1336410 писал(а):
А если нет, то можно попробовать найти интересующую перестановку как-то в обход, смотря непосредственно кто куда переходит. Но опять не уверен, будет ли это быстрее и таким кодом, на который приятно смотреть и легко отладить.
это сейчас примерно так и работает, выглядит ужасно (потому и подумал о перестройке), работает быстро (быстродействие терять не хотелось бы)

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение03.09.2018, 18:10 
Заслуженный участник


27/04/09
28128
Хм, интересно. Ну, мне пока нечего добавить. :-)

Isaev в сообщении #1336415 писал(а):
Одно умножение матриц вместо двух, надеялся я.. нет?
Но общее число операций-то не поменяется. :-) Вот если использовать векторные операции процессора, наверно такое объединение осмысленно. Но лучше подождать тех, кто знает — я даже не в курсе, есть ли целочисленные, или они только для флоатов.

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение13.05.2019, 18:02 
Аватара пользователя


20/07/16
14
Germany
Я в общем снова запутался в теории...
У меня трёхмерное пространство, есть вектор координат кубоида (т.е. координаты его левого нижнего ближнего угла), допустим С(0,2,1) и вектор его размеров, например S(2,1,1).
[1]. Мне его нужно повернуть на 90° вокруг оси Y, проходящей через точку O(1,1,1).
У меня есть единичный кватернион поворота вокруг оси Y Q$\left( \begin{matrix}1/\sqrt{2} \\ 0 \\ 1/\sqrt{2} \\ 0 \end{matrix} \right)$. Но я же не могу его просто применить к координатам? Мне нужна матрица смещения сначала, чтобы вернуться к началу координат так? т.е.
$
\left( \begin{matrix}1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
-1 & -1 & -1 & 1 \end{matrix} \right)$
потом нужно кватернион перевести в матричный вид, по этой формуле
потом сделать обратное смещение на
$
\left( \begin{matrix}1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
1 & 1 & 1 & 1 \end{matrix} \right)$
и в результате я ну никак не получаю в ответе C'(1,2,1). А для размеров хотелось бы получить S'(1,1,2).
и ещё получается матрица 4х4, что меня так же путает, как вернуться к трём координатам?
Это по идее получится при идентичных манипуляциях, как с координатами или тут нужно что-то другое думать?
в каком месте я не прав?

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение13.05.2019, 19:12 
Заслуженный участник


27/04/09
28128
Так, ну если вы пользуетесь матрицами 4×4, чтобы делать параллельные переносы и прочие дополнительные штуки (типа центральной проекции на какой-нибудь экран), то четвёртой координатой точки надо брать единицу, и потом, если всё было корректно, она останется единицей, и её можно проигнорировать в конце, взяв опять три первые координаты. (Ещё если понадобится преобразовывать векторы, им надо брать четвёртой координатой ноль; опять же его сохранение в конце — маркер того, что код правильный.)

А вот несовпадение может быть, например, от того, что смещение было в обратную сторону. Здесь правда всё с этим хорошо, зато есть другая причина: кто-то может умножать строку из координат точки на матрицу, а кто-то матрицу на столбец координат; те, которые вы написали — для первого случая, а во втором они дадут действительно не то: столбец $\begin{bmatrix}x & y & z & 1\end{bmatrix}^t$ переведётся второй матрицей в $\begin{bmatrix}x & y & z & x+y+z+1\end{bmatrix}^t$, то есть мы сделали, если руководствоваться правилами выше, что-то не то. Если же транспонировать эти матрицы, всё будет правильно: в этом случае выйдет $\begin{bmatrix}x+1 & y+1 & z+1 & 1\end{bmatrix}^t$. Вот транспонированные в случае умножения на столбец и берут.

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение14.05.2019, 11:49 
Аватара пользователя


20/07/16
14
Germany
[1] начальные координаты: $\left(\begin{matrix} 0&0&0&0 \\ 2&0&0&0 \\ 1&0&0&0 \\ 0&0&0&0 \end{matrix} \right)$

[2] матрица смещения к O: $\left(\begin{matrix} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&1&0 \\ -1&-1&-1&1 \end{matrix} \right)$

[3] кватернион Q: $\left(\begin{matrix} 1/\sqrt{2} \\ 0 \\ 1/\sqrt{2} \\ 0 \end{matrix} \right)$ = $\left(\begin{matrix} 0&0&1&0 \\ 0&1&0&0 \\ -1&0&0&0 \\ 0&0&0&0 \end{matrix} \right)$

[4] матрица смещения назад: $\left(\begin{matrix} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&1&0 \\ 1&1&1&1 \end{matrix} \right)$

тут почему-то смещения никакого не происходит:
[5] = [1] * [2] = $\left(\begin{matrix} 0&0&0&0 \\ 2&0&0&0 \\ 1&0&0&0 \\ 0&0&0&0 \end{matrix} \right)$

[6] = [4] * [3] = $\left(\begin{matrix} 0&0&0&0 \\ 0&0&2&0 \\ 0&0&1&0 \\ 0&0&0&0 \end{matrix} \right)$

ну и назад нет смещения:
[7] = [6] * [4] = $\left(\begin{matrix} 0&0&0&0 \\ 0&0&2&0 \\ 0&0&1&0 \\ 0&0&0&0 \end{matrix} \right)$

-- 14.05.2019, 09:56 --

arseniiv в сообщении #1392805 писал(а):
если вы пользуетесь матрицами 4×4, чтобы делать параллельные переносы и прочие дополнительные штуки (типа центральной проекции на какой-нибудь экран)

я думал это необходимость, т.к. вращение не относительно центра координат... или в этом простом случае это можно упростить?

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение14.05.2019, 18:54 
Заслуженный участник


27/04/09
28128
Isaev в сообщении #1392911 писал(а):
[1] начальные координаты: $\left(\begin{matrix} 0&0&0&0 \\ 2&0&0&0 \\ 1&0&0&0 \\ 0&0&0&0 \end{matrix} \right)$
Здесь не обязательно брать прям матрицу, можно один столбец, если что. И вы забыли единицу четвёртой координатой поставить. :-) Она в некотором смысле отвечает за учёт параллельных переносов — если вместо неё ноль, они пройдут мимо, а если $a$, они будут в $a$ раз больше, чем надо. И опять несоответствующая «раскладка» компонент. Смотрите, или перенос получается как $$\begin{bmatrix} 1 & 0 & 0 & a_x \\ 0 & 1 & 0 & a_y \\ 0 & 0 & 1 & a_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} x + a_x \\ y + a_y \\ z + a_z \\ 1 \end{bmatrix},$$или, если всё транспонировать, как $$\begin{bmatrix} x & y & z & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ a_x & a_y & a_z & 1 \end{bmatrix} = \begin{bmatrix} x + a_x & y + a_y & z + a_z & 1 \end{bmatrix}.$$По-другому получится действительно не то. :-)

Isaev в сообщении #1392911 писал(а):
я думал это необходимость, т.к. вращение не относительно центра координат... или в этом простом случае это можно упростить?
Смотря что значит упростить. Матрицы используются, потому что можно всё преобразование целиком, ещё и со всякими перспективными искажениями, потом задать одной такой матрицей и наприменять её ко всем нужным точкам. Если например для преобразований вида $A\vec v + \vec b$ хранить матрицу $A$ и вектор $\vec b$, то композиция преобразований $(A,\vec b)$ и $(A',\vec b')$ будет равна $(AA', A\vec b' + \vec b)$, а если затолкать это всё в одну большую матрицу, мы их просто умножаем и не паримся. В оптимизированных алгоритмах в принципе может быть и так, и так, в зависимости от того, какие векторные операции процессор поддерживает (тут я не разбираюсь).

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение15.05.2019, 17:11 
Аватара пользователя


20/07/16
14
Germany
Заработал разворот, это большой шаг вперёд, огромное спасибо! :-)

arseniiv в сообщении #1392994 писал(а):
Матрицы используются, потому что можно всё преобразование целиком, ещё и со всякими перспективными искажениями, потом задать одной такой матрицей и наприменять её ко всем нужным точкам. Если например для преобразований вида $A\vec v + \vec b$ хранить матрицу $A$ и вектор $\vec b$, то композиция преобразований $(A,\vec b)$ и $(A',\vec b')$ будет равна $(AA', A\vec b' + \vec b)$, а если затолкать это всё в одну большую матрицу, мы их просто умножаем и не паримся.

1. Тут как бы запаковать перенос туда и обратно не получится же? они взаимоисключающие... всё равно придётся их использовать отдельно друг от друга?

Вопрос номер 2.: С размером, естественно, по той же схеме не работает (и не должно по идее)... Как его посчитать?
это какая-то проекция чтоли, даже не представляю... как бы объяснить... Идея в том, что если объект имеет размеры (2, 3, 4), мы поворачиваем вокруг оси Y, при этом конечно размеры не меняются. А вот если мы теряем информацию о повороте, то перед нами объект с размерами (4, 3, 2). Как это вычислить?

И номер 3.: имея начальный и конечный вектор получить кватернион поворота. Тут как я понимаю порядок действий обратный, но делить мы матрицы не можем, потому умножаем конечную на инвертированную начальную?

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение16.05.2019, 00:12 
Заслуженный участник


27/04/09
28128
Isaev в сообщении #1393178 писал(а):
1. Тут как бы запаковать перенос туда и обратно не получится же? они взаимоисключающие... всё равно придётся их использовать отдельно друг от друга?
Не, можно. Перенос на $\vec b$, поворот $R$ и перенос обратно дают $R(\vec v + \vec b) - \vec b = R\vec v + R\vec b - \vec b$, что нормально задаётся парой $(R, R\vec b - \vec b)$. Вот проективные преобразования сюда уже не влезут.

Про размеры. Ну, если повороты оставляют кирпич ориентированным по осям, то если взять векторы $\Delta x\vec\imath, \Delta y\vec\jmath, \Delta z\vec k$ и повернуть так же, новое $\Delta x'$ будет модулем того из результатов, который коллинеарен $\vec\imath$ и т. д.. Практически, если не прибегать всё-таки к явной записи перестановок (со знаками) вместо поворотов, можно это сделать, записав $\Delta x\vec\imath, \Delta y\vec\jmath, \Delta z\vec k$ друг за другом в матрицу (получится диагональная $\operatorname{diag}(\Delta x, \Delta y, \Delta z)$), действовать поворотом на неё, а потом взять максимальное по модулю число в первой строке как $\Delta x'$, максимальное по модулю во второй строке как $\Delta y'$, ну и с третьей $\Delta z'$. (Беря максимум по модулю, избежим потенциального превращения нулей во что-то маленькое. Впрочем если у вас можно сделать всё целочисленным, можно будет прямо проверять на не нулевые значения, и даже просто брать суммы элементов строки, что должно быть чуть быстрее на процессорах, угадывающих альтернативы if.)

Но если у вас только повороты—симметрии куба (переставляющие декартовы оси местами, плюс-минус знаки), я бы это закодировал (что упомянуто выше) именно тем, какая перестановка и какое изменение знаков. Тогда перестановку можно применять к $(\Delta x,\Delta y,\Delta z)$ и получать новые размерности кирпича, да и к координатам точек тоже можно применять, ну а перенос делать отдельно, что уж. Где-то с кем-то вроде эти перестановки обсуждали недавно, но забыл где и с кем.

Isaev в сообщении #1393178 писал(а):
И номер 3.: имея начальный и конечный вектор получить кватернион поворота. Тут как я понимаю порядок действий обратный, но делить мы матрицы не можем, потому умножаем конечную на инвертированную начальную?
Не, тут хитрее. Во-первых, можно повернуть один вектор в другой не единственным способом. Ну, вам наверно нужен был поворот на наименьший угол — тогда всё почти всегда хорошо, если только векторы не противоположны. Тогда есть куча равноценных поворотов (на 180°), где ничего уже не уточнить. В этом случае стоит поворачивать пару (неколлинеарных) векторов в пару векторов — вот тогда результат будет однозначен (но и угол не обязательно будет наименьшим).

Определять для одиночных векторов $\vec v,\vec v'$ можно, найдя, раз тут трёхмерие, вектор, ортогональный плоскости $\langle\vec v,\vec v'\rangle$, просто взяв их векторное произведение. Заодно оно же даст и угол, на который надо будет поворачивать. По оси и углу можно найти матрицу поворота.

Для пар векторов иначе: дополняем их до правой тройки каждую, а вот уже после этого можно записать из столбцов координат первых матрицу $A$, из столбцов вторых матрицу $B$, и взять $BA^{-1}$.

(В представлении перестановками можно было бы просто посмотреть, куда переходит $(x,0,0)$, куда $(0,y,0)$, куда $(0,0,z)$, причём третий вектор по двум заданным можно опять определить векторным произведением, или сократить вычисления, просто поставив единицу в оставшейся координате и поставив там минус, если тройка получается левая.)

 Профиль  
                  
 
 Re: Нахождение применённого кватерниона
Сообщение16.05.2019, 02:03 
Аватара пользователя


20/07/16
14
Germany
arseniiv в сообщении #1393245 писал(а):
Перенос на $\vec b$, поворот $R$ и перенос обратно дают $R(\vec v + \vec b) - \vec b = R\vec v + R\vec b - \vec b$, что нормально задаётся парой $(R, R\vec b - \vec b)$.

Можно это в виде матрицы, если не сложно?
При переносе, кстати, в моём случае всегда $\Delta x = \Delta y = \Delta z$, думаю это тоже может всё упростить...

arseniiv в сообщении #1393245 писал(а):
Ну, если повороты оставляют кирпич ориентированным по осям

Оставляют, повороты только на единичные кватернионы, потому ориентация по осям никогда не нарушается.

arseniiv в сообщении #1393245 писал(а):
Впрочем если у вас можно сделать всё целочисленным, можно будет прямо проверять на не нулевые значения

Да, я так и обнулял эти ошибки переполнения.

arseniiv в сообщении #1393245 писал(а):
Но если у вас только повороты—симметрии куба (переставляющие декартовы оси местами, плюс-минус знаки), я бы это закодировал (что упомянуто выше) именно тем, какая перестановка и какое изменение знаков. Тогда перестановку можно применять к $(\Delta x,\Delta y,\Delta z)$ и получать новые размерности кирпича, да и к координатам точек тоже можно применять

Да, именно тот случай, только симметрии...
Кстати да, очень не плохая идея. Я на это смотрел с позиции объекта, а не поворота и получалось очень не красиво это всё хранить.

arseniiv в сообщении #1393245 писал(а):
Во-первых, можно повернуть один вектор в другой не единственным способом. Ну, вам наверно нужен был поворот на наименьший угол — тогда всё почти всегда хорошо, если только векторы не противоположны. Тогда есть куча равноценных поворотов (на 180°), где ничего уже не уточнить.

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

Далее по третьему пункту запутался, можно пример с конкретными цифрами?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Gg322


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group