Matrix

 
0
 
.NET
ava
RageHunter | 17.03.2013, 05:34
Доброе время суток.
Использую OpenTk.
там есть структура Matrix4, есть реализация оператора "*"
public static void Mult(ref Matrix4 left, ref Matrix4 right, out Matrix4 result)
{
    result = new Matrix4(
        left.M11 * right.M11 + left.M12 * right.M21 + left.M13 * right.M31 + left.M14 * right.M41,
        left.M11 * right.M12 + left.M12 * right.M22 + left.M13 * right.M32 + left.M14 * right.M42,
        left.M11 * right.M13 + left.M12 * right.M23 + left.M13 * right.M33 + left.M14 * right.M43,
        left.M11 * right.M14 + left.M12 * right.M24 + left.M13 * right.M34 + left.M14 * right.M44,
        left.M21 * right.M11 + left.M22 * right.M21 + left.M23 * right.M31 + left.M24 * right.M41,
        left.M21 * right.M12 + left.M22 * right.M22 + left.M23 * right.M32 + left.M24 * right.M42,
        left.M21 * right.M13 + left.M22 * right.M23 + left.M23 * right.M33 + left.M24 * right.M43,
        left.M21 * right.M14 + left.M22 * right.M24 + left.M23 * right.M34 + left.M24 * right.M44,
        left.M31 * right.M11 + left.M32 * right.M21 + left.M33 * right.M31 + left.M34 * right.M41,
        left.M31 * right.M12 + left.M32 * right.M22 + left.M33 * right.M32 + left.M34 * right.M42,
        left.M31 * right.M13 + left.M32 * right.M23 + left.M33 * right.M33 + left.M34 * right.M43,
        left.M31 * right.M14 + left.M32 * right.M24 + left.M33 * right.M34 + left.M34 * right.M44,
        left.M41 * right.M11 + left.M42 * right.M21 + left.M43 * right.M31 + left.M44 * right.M41,
        left.M41 * right.M12 + left.M42 * right.M22 + left.M43 * right.M32 + left.M44 * right.M42,
        left.M41 * right.M13 + left.M42 * right.M23 + left.M43 * right.M33 + left.M44 * right.M43,
        left.M41 * right.M14 + left.M42 * right.M24 + left.M43 * right.M34 + left.M44 * right.M44);
}

но нет реализации оператора "+" и "-".
Вопрос. Честно я эти матрицы вообще не понимаю.
Для создания операторов "+" и "-" достаточно ли будет заменить "*" на них, или все намного хитрее?
Kommentare (5)
ava
DarkDragon | 17.03.2013, 07:24 #
Цитата (RageHunter @  17.3.2013,  04:34 findReferencedText)
Для создания операторов "+" и "-" достаточно ли будет заменить "*" на них, или все намного хитрее? 
 smile Я бы сказал что наоборот. Сложение и вычитание выполняется по компонентно, а это значить что:

m1 = m2 + m3:

m1.M11 = m2.M11 + m3.M11;
...
m1.M44 = m2.M44 + m3.M44;


m1 = m2 - m3:

m1.M11 = m2.M11 - m3.M11;
...
m1.M44 = m2.M44 - m3.M44;
ava
RageHunter | 17.03.2013, 13:51 #
DarkDragon, я Вас правильно понял?

public static void Plus(ref Matrix4 left, ref Matrix4 right, out Matrix4 result)
{
    result = new Matrix4(
    left.M11 + right.M11,
    left.M12 + right.M12,
    left.M13 + right.M13,
    left.M14 + right.M14,
    left.M21 + right.M21,
    left.M22 + right.M22,
    left.M23 + right.M23,
    left.M24 + right.M24,
    left.M31 + right.M31,
    left.M32 + right.M32,
    left.M33 + right.M33,
    left.M34 + right.M34,
    left.M41 + right.M41,
    left.M42 + right.M42,
    left.M43 + right.M43,
    left.M44 + right.M44);
}

public static void Minus(ref Matrix4 left, ref Matrix4 right, out Matrix4 result)
{
    result = new Matrix4(
    left.M11 - right.M11,
    left.M12 - right.M12,
    left.M13 - right.M13,
    left.M14 - right.M14,
    left.M21 - right.M21,
    left.M22 - right.M22,
    left.M23 - right.M23,
    left.M24 - right.M24,
    left.M31 - right.M31,
    left.M32 - right.M32,
    left.M33 - right.M33,
    left.M34 - right.M34,
    left.M41 - right.M41,
    left.M42 - right.M42,
    left.M43 - right.M43,
    left.M44 - right.M44);
}

ava
DarkDragon | 17.03.2013, 13:57 #
RageHunter, да, все верно.
ava
RageHunter | 20.03.2013, 03:41 #
Еще вопросик!
не стал создавать нову тему.
в с++ есть строка

if(poles & ( 1 << ( pole_y/2 * 4 + pole_x/2 ))
     ........................

но C# ругается на такую стороку "Неявное преобразование типа "long" в "bool" невозможно"
Вопросик, как можно это же переписать под С#, сразу пояню что 100 раз пытался понять что происходит при оперторе << сдвиге в лево, но тока и не опнял.
При отладке программы значение true выражения достигается когда
poles = 0;
pole_y = 2;
pole_x = 4;
ava
DarkDragon | 20.03.2013, 09:46 #
тогда наверно лучше так:

if((poles & ( 1 << ( pole_y/2 * 4 + pole_x/2 )) != 0)

true - все что не ноль
false - только ноль
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden