قم بتوسيع نطاق فئة مصفوفة مخصصة بواسطة متجه

StackOverflow https://stackoverflow.com/questions/4294921

  •  28-09-2019
  •  | 
  •  

سؤال

أنا فظيع مع Matrix Maths ولكن لدي موقف حيث أحتاج إلى توسيع نطاق واحد. المصفوفة هي مثيل أ فئة مخصصة محددة هنا وكائن التحجيم الخاص بي هو متجه يحتوي على 3 عوامات (x ، y ، z). أرغب في الرمز الفعلي الذي أحتاجه بدلاً من تفسير عام لأنني ذهبت بالفعل إلى هذا المسار ولا أفهم الرياضيات المعنية. لحسن الحظ ، ما أحاول إنجازه هو تافهة بشكل معقول بمجرد أن أتمكن من توسيع نطاق المصفوفة.

للتوضيح هنا هو الرمز الذي أقوم بتحديثه. يتكرر على تسلسل هرمي للكائنات المرتبطة مع التحويلات النسبية والتحديثات حصيرة وتحويل مطلق:

void LocalModelPiece::GetPiecePosIter(CMatrix44f* mat) const
{
if (parent) {
    parent->GetPiecePosIter(mat);
}

if (pos.x || pos.y || pos.z) { mat->Translate(pos.x, pos.y, pos.z); }
// --> My problem is here. There is no Scale() method, I need one. <--
if (scale.x!=1.0f || scale.y!=1.0f || scale.z!=1.0f) { mat->Scale(scale.x, scale.y, scale.z); }
if (rot[1]) { mat->RotateY(-rot[1]); }
if (rot[0]) { mat->RotateX(-rot[0]); }
if (rot[2]) { mat->RotateZ(-rot[2]); }

}

هل كانت مفيدة؟

المحلول

نظرت إلى رابط API الذي قدمته ، وبناءً على ذلك ، هكذا سأقوم بتنفيذ طريقة تحجيم لفئة المصفوفة بحيث تتوافق مع طرق الترجمة () وتدوير (). أي أنه يقوم بضرب جانبي يمين مع مصفوفة التحجيم.

على الرغم من أنني شخصياً أجدها غريبًا بعض الشيء ، لأن واجهة برمجة التطبيقات تستخدم مصفوفات نمط OpenGL. هذا يعني أن الضرب الجانبي الأيمن يطبق التحول الجديد قبل جميع التحولات الأخرى الموجودة في المصفوفة ، حيث يطبقه الضرب الجانبي الأيسر بعد التحولات الأخرى. لذلك لست متأكدًا مما إذا كان هذا ما تريده هنا. قد تضطر إلى القيام بجميع التحولات بالترتيب العكسي أو القيام بتكاثر الجانب الأيسر بنفسك.

void CMatrix44f::Scale(float scalex, float scaley, float scaley) 
{
  /* the function should be equivalent to doing this:
  CMatrix44f scalemat;
  scalemat[0] = scalex;
  scalemat[5] = scaley;
  scalemat[10] = scalez;
  *this = Mul(scalemat);
  */

  m[0] *= scalex;
  m[1] *= scalex;
  m[2] *= scalex;
  m[3] *= scalex;

  m[4] *= scaley;
  m[5] *= scaley;
  m[6] *= scaley;
  m[7] *= scaley;

  m[8] *= scalez;
  m[9] *= scalez;
  m[10] *= scalez;
  m[11] *= scalez;
}

نصائح أخرى

ليس من الواضح لي ما ترغب في توسيع نطاقه. هل هي المصفوفة نفسها ، أم تنوي استخدامها لتوسيع نطاق متجه آخر؟

إذا كنت تتحدث عن متجه في الفضاء ثلاثي الأبعاد ، فأنا لا أرى كيف يمكن أن تكون مصفوفة 4x4 هي ما تريد. إن تحجيم المتجه في الفضاء ثلاثي الأبعاد باستخدام مصفوفة يعني وضع عوامل التحجيم على قطري المصفوفة ؛ عناصر خارجية هي صفر.

أنت تربكني عندما ترتبط بمصفوفة 4x4. هل أنت متأكد من أن هذا ما تريد؟

أعتقد أنك تريد هذا:

alt text

إليك بعض الرمز الزائف لإظهار كيف يتم ذلك:

for (int i = 0; i < 3; ++i)
{
    v_prime[i] = c[i]*v[i];
}

إذا كنت ترغب في توسيع نطاق مصفوفة 3 × 3 ، فسيبدو هكذا:

alt text

إليك بعض الرمز الزائف لإظهار كيف يتم ذلك:

for (int i = 0; i < 3; ++i)
{
    for (int j = 0; j < 3; ++j)
    {
        m_prime[i][j] = c[i]*m[i][j];
    }
}

لاحظ أن كلا الحلين يتبعان بيانك أن متجه التحجيم يحتوي على ثلاثة مكونات. إذا لم يكن هذا هو الحال ، فإن جميع الرهانات متوقفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top