Войти
ПрограммированиеФорумГрафика

Матрицы (3 стр)

Страницы: 1 2 3 4 5 Следующая »
#30
16:21, 26 июня 2008

  Есть программист и есть кодер. Вот кодер пусть решает конкретную задачу. А у программиста задача глобальная. Если рассматривать к примеру наши отечественные компании, которые маленькие и бедные, тут да, обычно кодер и программист это одно и тоже лицо, мало того одно и тоже лицо часто отвечает за несколько глобальных задач - физика, рендер, аи, механика ... 
Но это ж неправильно.
  Если стремится писать убийц кризисов, анрилов, то сперва нужно посмотреть на их тех процесс. К примеру у кризиса 40 программистов. Уверен, что как минимум 30 из них, очень хорошие специалисты, с очень хорошей математической или физической базой, но они кодеры и навряд ли когда нибуть поднимутся выше. Их задача конкретная и локализированная. Остальные как максимум 10 - действительно программисты и скорее не имеют ничего общего с локальными мат. задачами и вся слава у них.
  Понятно, если речь идет о конкретно программист 3д графики - шейдера и т.д. , да эта позиция требует хороших знаний, но эта позиция максимум 5 из тех 40. Смысл в том, что геймдев это не только писать шейдер. У такой компании есть все шансы на будущее и быть топовой в технологиях.

  Давайте глянем, кто в этих компаниях работает. Например насколько знаю, кризис на половину из русских состоит. т.е. есть косвенная связь что русские в большинстве умный/образованный народ. Но почему среди Росси/Украины/Белорусии нет конкурентов? Может быть по тому, что неправельно акценты расставляются, когда набирают программистов? Может быть потому, что действительно берут на лидовые должности мега-математиков, которые в итоге треш вырыгивают.


#31
16:56, 26 июня 2008

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

Для моделирования и организации сложных алгоритмических структур математическое мышление не менее необходимо чем для написания AI, физики и 3д эфектов.
Математика, впервую очередь, учит мыслить. Повышает уровень абстрактности и структурированности мышления. Человек с математическим образованием может оперировать более куда более сложными сущностями, нежели человек без оного. 
К тому же математику всегда проще освоить гуманитарные дисциплины, нежели гуманитарию технические. Потому что у первого мозг работает на порядок эффективнее.

> Может быть потому, что действительно берут на лидовые должности мега-математиков, которые в итоге треш вырыгивают.
Можно конкретные примеры? с именами, фамилиями и названиями проектов.
Иначе это звучит как абсолютно необоснованное утверждение. Ибо у наших программистов как раз математика не в почёте. За примерами ходить далеко не надо посмотрите на этот форум и на вопросы которые тут задаются. Людей которые могут поговорить на математические темы единицы. Суслик в этой теме написал довольно элементарную штуку, но даже такое высказывание подняло кучу негодований со стороны тех, кто "ниасилил"

#32
17:05, 26 июня 2008

CyberZX
>Математика, впервую очередь, учит мыслить. Повышает уровень абстрактности и структурированности мышления. Человек с математическим образованием может >оперировать более куда более сложными сущностями, нежели человек без оного.
+100
>К тому же математику всегда проще освоить гуманитарные дисциплины, нежели гуманитарию технические. Потому что у первого мозг работает на порядок >эффективнее.
+200

#33
18:21, 26 июня 2008

>Ибо у наших программистов как раз математика не в почёте... За примерами ходить далеко не надо. Суслик в этой теме написал...

Ну да, я не спорю, не в почете. Неправильно он написал, спутал жорданово разложение и полярную декомпозицию. Ну, не знают в массе математику, и шо? Меня это совсем не парит. 

Я вот кстати не знаю, как ответить на исходный вопросец

>Существует ли формула, по которой из матрицы можно убрать масштабирование, не зная коэффициентов масштабирования???

Известно, что любую обратимую матрицу M над действительными числами можно однозначно представить как M = U * P. Где U - вращение, а P - положительно определенная матрица. Формально, P = sqrt( M^t * M ).  Вычислить P можно, только счастья будет мало.

Потому что матрицу можно представить в виде M = P' * U'. В другом порядке, с другими матричками.

С одной стороны возникает желание взять матрицу U, с другой U'. Совершенно непонятно, почему один из выборов ( правый или левый ) являет предпочтительным.

#34
18:37, 26 июня 2008

А, пардон, ошибся. M = P' * U c той же матрицей U.

Так что да, полярное разложение решает.

#35
22:11, 26 июня 2008

Ехал в метро, думал как аккуратно решить.

Позитивная наука предполагает извлекать положительный квадратный корень из матрицы таки с помощью нахождения характеристических чисел. Собственные числа->собственные значения->извлечение из них корня->обращение.

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

В общем и целом кажется, что решать надо как-то не так.

Решил попробовать решать итеративно, тупым методом Ньютона для нахождения квадратного корня.

http://www.everfall.com/paste/id.php?msns5u1raple

Вроде сходится за 3-4 итерациидля ужасных, рандомных матриц. Которые почти сингулярные и злые.

#36
22:21, 26 июня 2008

у меня есть такое решение, естественно оно не мое, но тем не менее

 TTransType = (ttScaleX, ttScaleY, ttScaleZ,
               ttShearXY, ttShearXZ, ttShearYZ,
               ttRotateX, ttRotateY, ttRotateZ,
               ttTranslateX, ttTranslateY, ttTranslateZ,
               ttPerspectiveX, ttPerspectiveY, ttPerspectiveZ, ttPerspectiveW);

 // used to describe a sequence of transformations in following order:
 // [Sx][Sy][Sz][ShearXY][ShearXZ][ShearZY][Rx][Ry][Rz][Tx][Ty][Tz][P(x,y,z,w)]
 // constants are declared for easier access (see MatrixDecompose below)

 TTransformations  = array [TTransType] of Single;


// Decompose a non-degenerated 4x4 transformation matrix into the sequence of transformations that produced it.
// Modified by ml then eg, original Author: Spencer W. Thomas, University of Michigan
// The coefficient of each transformation is returned in the corresponding
// element of the vector Tran.
// Returns true upon success, false if the matrix is singular.
function  MatrixDecompose(const M: TMatrix; var Tran: TTransformations): Boolean;
begin
var
   I, J: Integer;
   LocMat, pmat, invpmat, tinvpmat: TMatrix;
   prhs, psol: TVector;
   row0, row1, row2 : TAffineVector;
   f : Single;
begin
   Result:=False;
   locmat:=M;
   // normalize the matrix
   if locmat[W, W] = 0 then Exit;
   for I:=0 to 3 do
   for J:=0 to 3 do
   locmat[I, J]:=locmat[I, J] / locmat[W, W];

   // pmat is used to solve for perspective, but it also provides
   // an easy way to test for singularity of the upper 3x3 component.

   pmat:=locmat;
   for I:=0 to 2 do pmat[I, W]:=0;
   pmat[W, W]:=1;

   if MatrixDeterminant(pmat) = 0 then Exit;

   // First, isolate perspective.  This is the messiest.
   if (locmat[X, W] <> 0) or (locmat[Y, W] <> 0) or (locmat[Z, W] <> 0) then 
   begin
      // prhs is the right hand side of the equation.
      prhs[X]:=locmat[X, W];
      prhs[Y]:=locmat[Y, W];
      prhs[Z]:=locmat[Z, W];
      prhs[W]:=locmat[W, W];

      // Solve the equation by inverting pmat and multiplying
      // prhs by the inverse.  (This is the easiest way, not
      // necessarily the best.)

      invpmat:=pmat;
      InvertMatrix(invpmat);
      TransposeMatrix(invpmat);
      psol:=VectorTransform(prhs, tinvpmat);

      // stuff the answer away
      Tran[ttPerspectiveX]:=psol[X];
      Tran[ttPerspectiveY]:=psol[Y];
      Tran[ttPerspectiveZ]:=psol[Z];
      Tran[ttPerspectiveW]:=psol[W];

      // clear the perspective partition
      locmat[X, W]:=0;
      locmat[Y, W]:=0;
      locmat[Z, W]:=0;
      locmat[W, W]:=1;
   end 
   else 
   begin
      // no perspective
      Tran[ttPerspectiveX]:=0;
      Tran[ttPerspectiveY]:=0;
      Tran[ttPerspectiveZ]:=0;
      Tran[ttPerspectiveW]:=0;
   end;

   // next take care of translation (easy)
   for I:=0 to 2 do 
   begin
      Tran[TTransType(Ord(ttTranslateX) + I)]:=locmat[W, I];
      locmat[W, I]:=0;
   end;

   // now get scale and shear
   SetVector(row0, locmat[0]);
   SetVector(row1, locmat[1]);
   SetVector(row2, locmat[2]);

   // compute X scale factor and normalize first row
   Tran[ttScaleX]:=VectorNorm(row0);
   VectorScale(row0, RSqrt(Tran[ttScaleX]));

   // compute XY shear factor and make 2nd row orthogonal to 1st
   Tran[ttShearXY]:=VectorDotProduct(row0, row1);
   f:=-Tran[ttShearXY];
   CombineVector(row1, row0, f);

   // now, compute Y scale and normalize 2nd row
   Tran[ttScaleY]:=VectorNorm(row1);
   VectorScale(row1, RSqrt(Tran[ttScaleY]));
   Tran[ttShearXY]:=Tran[ttShearXY]/Tran[ttScaleY];

   // compute XZ and YZ shears, orthogonalize 3rd row
   Tran[ttShearXZ]:=VectorDotProduct(row0, row2);
   f:=-Tran[ttShearXZ];
   CombineVector(row2, row0, f);
   Tran[ttShearYZ]:=VectorDotProduct(row1, row2);
   f:=-Tran[ttShearYZ];
   CombineVector(row2, row1, f);

   // next, get Z scale and normalize 3rd row
   Tran[ttScaleZ]:=VectorNorm(row2);
   VectorScale(row2, RSqrt(Tran[ttScaleZ]));
   Tran[ttShearXZ]:=Tran[ttShearXZ] / tran[ttScaleZ];
   Tran[ttShearYZ]:=Tran[ttShearYZ] / Tran[ttScaleZ];

   // At this point, the matrix (in rows[]) is orthonormal.
   // Check for a coordinate system flip.  If the determinant
   // is -1, then negate the matrix and the scaling factors.
   if VectorDotProduct(row0, VectorCrossProduct(row1, row2)) < 0 then 
   begin
      for I:=0 to 2 do
        Tran[TTransType(Ord(ttScaleX) + I)]:=-Tran[TTransType(Ord(ttScaleX) + I)];
      NegateVector(row0);
      NegateVector(row1);
      NegateVector(row2);
   end;

   // now, get the rotations out, as described in the gem
   Tran[ttRotateY]:=arcsin(-row0[Z]);
   if cos(Tran[ttRotateY]) <> 0 then 
   begin
      Tran[ttRotateX]:=arctan2(row1[Z], row2[Z]);
      Tran[ttRotateZ]:=arctan2(row0[Y], row0[X]);
   end 
   else 
   begin
      tran[ttRotateX]:=arctan2(row1[X], row1[Y]);
      tran[ttRotateZ]:=0;
   end;
   // All done!
   Result:=True;
end;
#37
22:25, 26 июня 2008

Собственно кому интересно, собрание замечательных реализаций можна взять тут
http://www.koders.com/delphi/fid6EF9533D671A2E0AA0A5011659B5CAB82619DBA4.aspx

эта версия неполная, если поискать можно найти поновее.

PS. Ориентирована на делфийцев.

#38
23:16, 26 июня 2008

IronPeter
>>http://www.everfall.com/paste/id.php?w7xwwt03tyfx
Согласен полностью, есть много верного в написанном как по мне.

#39
0:11, 28 июня 2008

Т.к. в матрице лежат фактически вектора базиса, то логично вроде, что коэффициенты масштабирования будут как-то зависеть от длин этих векторов.;)
Интересно, что тут еще и перспективу учесть можно.
К сожалению, ни математическое, ни гуманитарное образование соображать такие вещи не научат. Соображаловка, она много раньше возникает...

О связи между грамотностью и способностью к программированию еще, кажется, Дейкстра, писал.

#40
1:03, 28 июня 2008

IronPeter
>Неправильно он написал, спутал жорданово разложение и полярную декомпозицию.
Так, стоп. Жорданово разложение и жордавнова цепочка - вообще слабо кореллирующие понятия. Жордановой цепочкой называется базис из собственных векторов и сопоставленных им собственных чисел.

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

#41
1:30, 28 июня 2008

>я умышленно не стал писать, понимая, что топикстартеру это не поможет.

Суслик vs  осиное гнездо.

#42
1:38, 28 июня 2008

dave
>>я умышленно не стал писать, понимая, что топикстартеру это не поможет.
>Суслик vs  осиное гнездо.
Если найдётся ещё хотя б пара человек, таких, как Nighthunter, которым по каким-то причинам меня читать легче, чем учебник, и которые при этом меня понимают, я с радостью допишу этот артикл и, если понадобится, ещё.

#43
3:20, 28 июня 2008

>Всем привет!!! Существует ли формула, по которой из матрицы можно убрать масштабирование, не зная коэффициентов масштабирования???
Автор, попробуй нормализовать столбцы или строки в верхней левой части матрицы, взяв их как трёхмерные векторы.

#44
3:25, 28 июня 2008

JohnSmith
и чё это будет? :)

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.