Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Вниз

Помогите с геометрией начальной школы !   Найти похожие ветки 

 
learner ©   (2006-08-12 16:53) [0]

Есть единичный трехмерный кубик.
Поместили его в начало координат, ровненько :)
Потом сделали поворот осей на углы @x, @y, и @z, соответственно.
Надо найти размер его проекций на каждую ось исходной
системы координат.
P.S. Краснею от стыда.


 
palva ©   (2006-08-12 17:09) [1]

Что такое ровненько: в начале координат одна из вершин куба или его центр, как при этом куб ориентирован относительно осей.
Что такое поворот осей? Сам куб при этом не повернулся что ли?
Что такое размер проекции на ось? Длина этой проекции что ли?

И последний вопрос чем кубик отличается от куба. Что означает ваша терминология?


 
learner ©   (2006-08-12 17:21) [2]

>в начале координат одна из вершин куба или его центр,
>как при этом куб ориентирован относительно осей.
В начале координат одна из вершин.
Три его грани лежат на осях
Что такое поворот осей? Сам куб при этом не повернулся что ли?
Повернулся вместе с ними
>Что такое размер проекции на ось? Длина этой проекции что ли?
Да
>И последний вопрос чем кубик отличается от куба.
Неужели непонятно. Кубик это куб, только маленький, единичный :))


 
palva ©   (2006-08-12 17:46) [3]

> Три его грани лежат на осях
Это невозможно ось может лежать на грани, а грань на оси не может. Может вы хотели сказать ребра а не грани?

>> Сам куб при этом не повернулся что ли?
> Повернулся вместе с ними
То есть это поворот пространства как целого, а не оси. Может быть это поворот ВОКРУГ оси? Подумайте, что вы имели ввиду: при повороте ось остается неподвижной? тогда это поворот вокруг оси, и тогда надо конкретизировать какое направление поворота считается положительным.

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


 
learner ©   (2006-08-12 18:00) [4]

>Может вы хотели сказать ребра а не грани?
Да. Разумеется грани.
>То есть это поворот пространства как целого, а не оси. Может быть это
> поворот ВОКРУГ оси? Подумайте, что вы имели ввиду: при повороте ось
> остается неподвижной? тогда это поворот вокруг оси, и тогда надо
> конкретизировать какое направление поворота считается положительным.
Повернули пространство вокруг оси 0X по часовой стрелке (если стоять спиной к началу координат) на угол @x, потом проделали тоже с остальными осями.
>Я понимаю так, что здесь требуется знать синусы и прочую тригонометрию.
>Так что это выходит за рамки "геометрии начальной школы".
Так это, вроде, классе в шестом проходят.
Я уже замучалась с "направляющими косинусами" - ничего не получается :((


 
palva ©   (2006-08-12 18:42) [5]

> Я уже замучалась с "направляющими косинусами" - ничего не получается :((
Здесь надо мучаться с матрицами третьего порядка - перемножать их. Например, если повернуть пространство вокруг оси x на угол alfa, то точка с координатами (a,b,c) переместится в точку с координатами A*(a,b,c) Здесь умножение матрицы A на столбец (a,b,c). А называется матрицей преобразования координат и в этом простейшем случае будет равна

1       0           0
0  cos(alfa) sin(alfa)
0 -sin(alfa) cos(alfa)

Если сделать несколько поворотов, то соответствующие матрицы будут перемножаться.

А второй поворот будет делаться относительно старого или относительно нового положения оси Y ?


 
learner ©   (2006-08-12 19:07) [6]

>А второй поворот будет делаться относительно старого или
>относительно нового положения оси Y ?
Относительно нового.
Поверните мне, пожалуйста, две оси. С третьей попробую сделать по аналогии


 
palva ©   (2006-08-12 19:12) [7]

Ага, ну все равно это будет перемножение матриц. В первом случае B*C*A, во втором A*B*C, где матрицы B и C - матрицы поворота вокруг осей y и z на углы beta и gamma и равны соответственно:


cos(beta)  0  -sin(beta)
   0         1     0
sin(beta)   0  cos(beta)

и

cos(gamma)   sin(gamma)  0
-sin(gamma)  cos(gamma)  0
      0             0             1


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


 
palva ©   (2006-08-12 19:15) [8]

Старые координаты куба это вот такие тройки из нулей и единиц: (0,1,0) (1,0,1) (1,1,1) ...


 
learner ©   (2006-08-12 21:19) [9]

Спасибо большое ! Попробую во всем этом разобраться.


 
Anatoly Podgoretsky ©   (2006-08-12 21:27) [10]

Так это точка наблюдения в простанстве изменилась.


 
palva ©   (2006-08-12 21:48) [11]

Нашел хорошую статью про повороты вокруг осей, проходящих через начало координат.
http://www.sources.ru/magazine/0804/3d_rot.html
У игроделов очень популярно использование кватернионов для представления поворотов.


 
Sapersky   (2006-08-12 23:02) [12]

Для "начальной школы" есть такой метод - берём формулу поворота на плоскости:
n1 := c1 * Cos(a) - c2 * Sin(a);
n2 := c1 * Sin(a) + c2 * Cos(a);
и последовательно применяем её ко всем трём углам (a) и соответствующим (которые изменяются при повороте относительно данной оси) парам координат (c1, c2).
Фактически получается то же, что и с матрицами; несколько медленнее (12 умножений на вершину вместо 9), но для куба (6 вершин) это неважно.


 
Sapersky   (2006-08-12 23:05) [13]

То есть 8 вершин. Перепутал с гранями.


 
learner ©   (2006-08-12 23:49) [14]

>palva ©   (12.08.06 21:48)
>Нашел хорошую статью
Спасибо. Обязательно посмотрю.
>[12] Sapersky(12.08.06 23:02) Да... Как все просто становиться, когда тебе объясняют.
Я, тоже кое что нашла. Выкладываю. Может кому-то и понадобиться

function CreateRotationMatrix(Axis: TAffineVector; Angle: Single): TMatrix; register;

// Create a rotation matrix along the given axis by the given angle in radians.
// The axis is a set of direction cosines.

var cosine, sine,
   one_minus_cosine : Extended;

begin
   SinCos(Angle,Sine,Cosine);
   one_minus_cosine:=1-cosine;

   Result[X,X]:=SQR(Axis[X])+(1-SQR(axis[X]))*cosine;
   Result[X,Y]:=Axis[X]*Axis[Y]*one_minus_cosine+Axis[Z]*sine;
   Result[X,Z]:=Axis[X]*Axis[Z]*one_minus_cosine-Axis[Y]*sine;
   Result[X,W]:=0;

   Result[Y,X]:=Axis[X]*Axis[Y]*one_minus_cosine-Axis[Z]*sine;
   Result[Y,Y]:=SQR(Axis[Y])+(1-SQR(axis[Y]))*cosine;
   Result[Y,Z]:=Axis[Y]*Axis[Z]*one_minus_cosine+Axis[X]*sine;
   Result[Y,W]:=0;

   Result[Z,X]:=Axis[X]*Axis[Z]*one_minus_cosine+Axis[Y]*sine;
   Result[Z,Y]:=Axis[Y]*Axis[Z]*one_minus_cosine-Axis[X]*sine;
   Result[Z,Z]:=SQR(Axis[Z])+(1-SQR(axis[Z]))*cosine;
   Result[Z,W]:=0;

   Result[W,X]:=0;
   Result[W,Y]:=0;
   Result[W,Z]:=0;
   Result[W,W]:=1;
end;

//------------------------------------------------------------------------------

function ConvertRotation(Angles: TAffineVector): TVector; register;

{ Turn a triplet of rotations about x, y, and z (in that order) into an
  equivalent rotation around a single axis (all in radians).

  Rotation of the angle t about the axis (X,Y,Z) is given by:

    | X^2+(1-X^2) Cos(t),    XY(1-Cos(t)) + Z Sin(t), XZ(1-Cos(t))-Y Sin(t) |
M = | XY(1-Cos(t))-Z Sin(t), Y^2+(1-Y^2) Cos(t),      YZ(1-Cos(t))+X Sin(t) |
    | XZ(1-Cos(t))+Y Sin(t), YZ(1-Cos(t))-X Sin(t),   Z^2+(1-Z^2) Cos(t)    |

  Rotation about the three axes (angles a1, a2, a3) can be represented as
  the product of the individual rotation matrices:

     | 1  0       0       | | Cos(a2) 0 -Sin(a2) | |  Cos(a3) Sin(a3) 0 |
     | 0  Cos(a1) Sin(a1) |*| 0       1  0       |*| -Sin(a3) Cos(a3) 0 |
     | 0 -Sin(a1) Cos(a1) | | Sin(a2) 0  Cos(a2) | |  0       0       1 |
     Mx                       My                     Mz

  We now want to solve for X, Y, Z, and t given 9 equations in 4 unknowns.
  Using the diagonal elements of the two matrices, we get:

     X^2+(1-X^2) Cos(t) = M[0][0]
     Y^2+(1-Y^2) Cos(t) = M[1][1]
     Z^2+(1-Z^2) Cos(t) = M[2][2]

  Adding the three equations, we get:

     X^2 + Y^2 + Z^2 - (M[0][0] + M[1][1] + M[2][2]) =
 - (3 - X^2 - Y^2 - Z^2) Cos(t)

  Since (X^2 + Y^2 + Z^2) = 1, we can rewrite as:

     Cos(t) = (1 - (M[0][0] + M[1][1] + M[2][2])) / 2

  Solving for t, we get:

     t = Acos(((M[0][0] + M[1][1] + M[2][2]) - 1) / 2)

   We can substitute t into the equations for X^2, Y^2, and Z^2 above
   to get the values for X, Y, and Z.  To find the proper signs we note
   that:

2 X Sin(t) = M[1][2] - M[2][1]
2 Y Sin(t) = M[2][0] - M[0][2]
2 Z Sin(t) = M[0][1] - M[1][0]
}

var Axis1, Axis2 : TAffineVector;
   M, M1, M2    : TMatrix;
   cost, cost1,
   sint,
   s1, s2, s3   : Single;
   I            : Integer;

begin
 // see if we are only rotating about a single axis
 if Abs(Angles[X]) < EPSILON then
 begin
   if Abs(Angles[Y]) < EPSILON then
   begin
     Result:=MakeVector([0,0,1,Angles[Z]]);
     Exit;
   end
   else
     if Abs(Angles[Z]) < EPSILON then
     begin
       Result:=MakeVector([0,1,0,Angles[Y]]);
       Exit;
     end
  end
  else
    if (Abs(Angles[Y]) < EPSILON) and
       (Abs(Angles[Z]) < EPSILON) then
    begin
      Result:=MakeVector([1,0,0,Angles[X]]);
      Exit;
    end;

 // make the rotation matrix
 Axis1:=MakeAffineVector([1,0,0]);
 M:=CreateRotationMatrix(Axis1,Angles[X]);

 Axis2:=MakeAffineVector([0,1,0]);
 M2:=CreateRotationMatrix(Axis2,Angles[Y]);
 M1:=MatrixMultiply(M,M2);

 Axis2:=MakeAffineVector([0,0,1]);
 M2:=CreateRotationMatrix(Axis2,Angles[Z]);
 M:=MatrixMultiply(M1,M2);

 cost:=((M[X,X]+M[Y,Y]+M[Z,Z])-1)/2;
 if cost < -1 then cost:=-1
              else
   if cost > 1-EPSILON then
   begin
     // Bad angle - this would cause a crash
     Result:=MakeVector([1,0,0,0]);
     Exit;
   end;

 cost1:=1-cost;
 Result:=Makevector([Sqrt((M[X,X]-cost)/cost1),
                     Sqrt((M[Y,Y]-cost)/cost1),
                     sqrt((M[Z,Z]-cost)/cost1),
                     arccos(cost)]);

 sint:=2*Sqrt(1-cost*cost); // This is actually 2 Sin(t)

 // Determine the proper signs
 for I:=0 to 7 do
 begin
   if (I and 1) > 1 then s1:=-1 else s1:=1;
   if (I and 2) > 1 then s2:=-1 else s2:=1;
   if (I and 4) > 1 then s3:=-1 else s3:=1;
   if (Abs(s1*Result[X]*sint-M[Y,Z]+M[Z,Y]) < EPSILON2) and
      (Abs(s2*Result[Y]*sint-M[Z,X]+M[X,Z]) < EPSILON2) and
      (Abs(s3*Result[Z]*sint-M[X,Y]+M[Y,X]) < EPSILON2) then
       begin
         // We found the right combination of signs
         Result[X]:=Result[X]*s1;
         Result[Y]:=Result[Y]*s2;
         Result[Z]:=Result[Z]*s3;
         Exit;
       end;
 end;
end;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.037 c
1-1153387653
pasha_golub
2006-07-20 13:27
2006.09.03
Перенаправление stdout &amp; stdin консольного приложения


3-1151048150
zdm
2006-06-23 11:35
2006.09.03
FASTReport нумерация полей


1-1153478918
REA
2006-07-21 14:48
2006.09.03
Image List Alpha Channel


2-1155660880
ex32Le
2006-08-15 20:54
2006.09.03
String To array of byte


4-1147241707
Patrick
2006-05-10 10:15
2006.09.03
Существование процесса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский