source: 2014/24/EemeliK/Zombieland/Jypeli/AdvanceMath/Matrix2x3.cs @ 5974

Revision 5974, 46.0 KB checked in by empaheik, 4 years ago (diff)
Line 
1#region MIT License
2/*
3 * Copyright (c) 2005-2008 Jonathan Mark Porter. http://physics2d.googlepages.com/
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights to
7 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
8 * the Software, and to permit persons to whom the Software is furnished to do so,
9 * subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be
12 * included in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
15 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
16 * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
17 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
18 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
19 * OTHER DEALINGS IN THE SOFTWARE.
20 */
21#endregion
22
23
24#if UseDouble
25using Scalar = System.Double;
26#else
27using Scalar = System.Single;
28#endif
29using System;
30using System.Runtime.InteropServices;
31using AdvanceMath.Design;
32using System.Xml.Serialization;
33
34
35// NOTE. The (x,y,z) coordinate system is assumed to be right-handed.
36// Coordinate axis rotation matrices are of the form
37// RX = 1 0 0
38// 0 cos(t) -sin(t)
39// 0 sin(t) cos(t)
40// where t > 0 indicates a counterclockwise rotation in the yz-plane
41// RY = cos(t) 0 sin(t)
42// 0 1 0
43// -sin(t) 0 cos(t)
44// where t > 0 indicates a counterclockwise rotation in the zx-plane
45// RZ = cos(t) -sin(t) 0
46// sin(t) cos(t) 0
47// 0 0 1
48// where t > 0 indicates a counterclockwise rotation in the xy-plane.
49
50namespace AdvanceMath
51{
52    /// <summary>
53    /// A 2x3 matrix which can represent rotations around axes.
54    /// </summary>
55    [StructLayout(LayoutKind.Sequential, Size = Matrix2x3.Size)]
56    [AdvBrowsableOrder("Rx,Ry")]
57#if !CompactFramework && !WindowsCE && !PocketPC && !XBOX360 && !SILVERLIGHT && !WINDOWS_PHONE
58    [Serializable]
59    [System.ComponentModel.TypeConverter(typeof(AdvTypeConverter<Matrix2x3>))]
60#endif
61    public struct Matrix2x3 : IMatrix<Matrix2x3,Vector2D, Vector3D>
62    {
63        #region const fields
64        /// <summary>
65        /// The number of rows.
66        /// </summary>
67        public const int RowCount = 2;
68        /// <summary>
69        /// The number of columns.
70        /// </summary>
71        public const int ColumnCount = 3;
72        /// <summary>
73        /// The number of Scalar values in the class.
74        /// </summary>
75        public const int Count = RowCount * ColumnCount;
76        /// <summary>
77        /// The Size of the class in bytes;
78        /// </summary>
79        public const int Size = sizeof(Scalar) * Count;
80        #endregion
81        #region static fields
82        private readonly static string FormatString = MatrixHelper.CreateMatrixFormatString(RowCount, ColumnCount);
83        private readonly static string FormatableString = MatrixHelper.CreateMatrixFormatableString(RowCount, ColumnCount);
84
85        public static readonly Matrix2x3 Identity = new Matrix2x3(
86        1, 0, 0,
87        0, 1, 0);
88        public static readonly Matrix2x3 Zero = new Matrix2x3(
89        0, 0, 0,
90        0, 0, 0);
91        #endregion
92        #region static methods
93
94        public static void Copy(ref Matrix2x3 matrix, Scalar[] destArray)
95        {
96            Copy(ref matrix, destArray, 0);
97        }
98        public static void Copy(ref Matrix2x3 matrix, Scalar[] destArray, int index)
99        {
100            ThrowHelper.CheckCopy(destArray, index, Count);
101
102            destArray[index] = matrix.m00;
103            destArray[++index] = matrix.m01;
104            destArray[++index] = matrix.m02;
105
106            destArray[++index] = matrix.m10;
107            destArray[++index] = matrix.m11;
108            destArray[++index] = matrix.m12;
109
110        }
111        public static void Copy(Scalar[] sourceArray, out Matrix2x3 result)
112        {
113            Copy(sourceArray, 0, out result);
114        }
115        public static void Copy(Scalar[] sourceArray, int index, out Matrix2x3 result)
116        {
117            ThrowHelper.CheckCopy(sourceArray, index, Count);
118
119            result.m00 = sourceArray[index];
120            result.m01 = sourceArray[++index];
121            result.m02 = sourceArray[++index];
122
123            result.m10 = sourceArray[++index];
124            result.m11 = sourceArray[++index];
125            result.m12 = sourceArray[++index];
126
127        }
128
129
130        public static void Copy(ref Matrix4x4 source, out Matrix2x3 dest)
131        {
132            dest.m00 = source.m00;
133            dest.m01 = source.m01;
134            dest.m02 = source.m02;
135
136            dest.m10 = source.m10;
137            dest.m11 = source.m11;
138            dest.m12 = source.m12;
139
140        }
141        public static void Copy(ref Matrix2x2 source, ref Matrix2x3 dest)
142        {
143            dest.m00 = source.m00;
144            dest.m01 = source.m01;
145
146            dest.m10 = source.m10;
147            dest.m11 = source.m11;
148        }
149
150
151
152        public static void Copy2DToOpenGlMatrix(ref Matrix2x3 source, Scalar[] destArray)
153        {
154            destArray[0] = source.m00;
155            destArray[1] = source.m10;
156
157
158            destArray[4] = source.m01;
159            destArray[5] = source.m11;
160
161
162            destArray[12] = source.m02;
163            destArray[13] = source.m12;
164
165            destArray[10] = 1;
166            destArray[15] = 1;
167        }
168        public static void Copy2DFromOpenGlMatrix(Scalar[] destArray, out Matrix2x3 result)
169        {
170            result.m00 = destArray[0];
171            result.m10 = destArray[1];
172
173            result.m01 = destArray[4];
174            result.m11 = destArray[5];
175
176            result.m02 = destArray[12];
177            result.m12 = destArray[13];
178        }
179
180        public static Matrix2x3 Lerp(Matrix2x3 left, Matrix2x3 right, Scalar amount)
181        {
182            Matrix2x3 result;
183            Lerp(ref left, ref right, ref amount, out result);
184            return result;
185        }
186        public static void Lerp(ref Matrix2x3 left, ref  Matrix2x3 right, ref  Scalar amount, out Matrix2x3 result)
187        {
188            result.m00 = (right.m00 - left.m00) * amount + left.m00;
189            result.m01 = (right.m01 - left.m01) * amount + left.m01;
190            result.m02 = (right.m02 - left.m02) * amount + left.m02;
191
192            result.m10 = (right.m10 - left.m10) * amount + left.m10;
193            result.m11 = (right.m11 - left.m11) * amount + left.m11;
194            result.m12 = (right.m12 - left.m12) * amount + left.m12;
195
196        }
197
198
199        /// <summary>
200        /// Used to multiply (concatenate) two Matrix4x4s.
201        /// </summary>
202        /// <param name="left"></param>
203        /// <param name="right"></param>
204        /// <returns></returns>
205        public static Matrix2x3 Multiply(Matrix2x3 left, Matrix2x3 right)
206        {
207            Matrix2x3 result;
208
209            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
210            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
211            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 ;
212
213            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
214            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
215            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12;
216
217
218            return result;
219        }
220        public static void Multiply(ref Matrix2x3 left, ref Matrix2x3 right, out Matrix2x3 result)
221        {
222            Scalar m00 = left.m00 * right.m00 + left.m01 * right.m10;
223            Scalar m01 = left.m00 * right.m01 + left.m01 * right.m11;
224            Scalar m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02;
225
226            Scalar m10 = left.m10 * right.m00 + left.m11 * right.m10;
227            Scalar m11 = left.m10 * right.m01 + left.m11 * right.m11;
228            Scalar m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12;
229
230            result.m00 = m00;
231            result.m01 = m01;
232            result.m02 = m02;
233
234            result.m10 = m10;
235            result.m11 = m11;
236            result.m12 = m12;
237        }
238
239        /// <summary>
240        /// Used to multiply a Matrix2x3 object by a scalar value..
241        /// </summary>
242        /// <param name="left"></param>
243        /// <param name="scalar"></param>
244        /// <returns></returns>
245        public static Matrix2x3 Multiply(Matrix2x3 left, Scalar scalar)
246        {
247            Matrix2x3 result;
248
249            result.m00 = left.m00 * scalar;
250            result.m01 = left.m01 * scalar;
251            result.m02 = left.m02 * scalar;
252
253            result.m10 = left.m10 * scalar;
254            result.m11 = left.m11 * scalar;
255            result.m12 = left.m12 * scalar;
256
257
258            return result;
259        }
260        public static void Multiply(ref Matrix2x3 left, ref Scalar scalar, out Matrix2x3 result)
261        {
262
263            result.m00 = left.m00 * scalar;
264            result.m01 = left.m01 * scalar;
265            result.m02 = left.m02 * scalar;
266
267            result.m10 = left.m10 * scalar;
268            result.m11 = left.m11 * scalar;
269            result.m12 = left.m12 * scalar;
270
271        }
272
273        /// <summary>
274        /// Used to multiply (concatenate) a Matrix2x3 and a Matrix2x2.
275        /// </summary>
276        /// <param name="left"></param>
277        /// <param name="right"></param>
278        /// <returns></returns>
279        public static Matrix2x3 Multiply(Matrix2x3 left, Matrix2x2 right)
280        {
281            Matrix2x3 result;
282
283            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
284            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
285            result.m02 = left.m02;
286
287            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
288            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
289            result.m12 = left.m12;
290
291            return result;
292        }
293        public static void Multiply(ref Matrix2x3 left, ref Matrix2x2 right, out Matrix2x3 result)
294        {
295            Scalar m00 = left.m00 * right.m00 + left.m01 * right.m10;
296            Scalar m01 = left.m00 * right.m01 + left.m01 * right.m11;
297
298            Scalar m10 = left.m10 * right.m00 + left.m11 * right.m10;
299            Scalar m11 = left.m10 * right.m01 + left.m11 * right.m11;
300
301
302            result.m00 = m00;
303            result.m01 = m01;
304            result.m02 = left.m02;
305
306            result.m10 = m10;
307            result.m11 = m11;
308            result.m12 = left.m12;
309
310        }
311
312        /// <summary>
313        /// Used to multiply (concatenate) a Matrix2x3 and a Matrix2x2.
314        /// </summary>
315        /// <param name="left"></param>
316        /// <param name="right"></param>
317        /// <returns></returns>
318        public static Matrix2x3 Multiply(Matrix2x2 left, Matrix2x3 right)
319        {
320            Matrix2x3 result;
321
322            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
323            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
324            result.m02 = left.m00 * right.m02 + left.m01 * right.m12;
325
326            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
327            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
328            result.m12 = left.m10 * right.m02 + left.m11 * right.m12;
329
330
331            return result;
332        }
333        public static void Multiply(ref Matrix2x2 left, ref Matrix2x3 right, out Matrix2x3 result)
334        {
335            Scalar m00 = left.m00 * right.m00 + left.m01 * right.m10;
336            Scalar m01 = left.m00 * right.m01 + left.m01 * right.m11;
337            Scalar m02 = left.m00 * right.m02 + left.m01 * right.m12;
338
339            Scalar m10 = left.m10 * right.m00 + left.m11 * right.m10;
340            Scalar m11 = left.m10 * right.m01 + left.m11 * right.m11;
341            Scalar m12 = left.m10 * right.m02 + left.m11 * right.m12;
342
343            result.m00 = m00;
344            result.m01 = m01;
345            result.m02 = m02;
346
347            result.m10 = m10;
348            result.m11 = m11;
349            result.m12 = m12;
350
351
352
353        }
354
355
356        /// <summary>
357        /// Used to add two matrices together.
358        /// </summary>
359        /// <param name="left"></param>
360        /// <param name="right"></param>
361        /// <returns></returns>
362        public static Matrix2x3 Add(Matrix2x3 left, Matrix2x3 right)
363        {
364            Matrix2x3 result;
365
366            result.m00 = left.m00 + right.m00;
367            result.m01 = left.m01 + right.m01;
368            result.m02 = left.m02 + right.m02;
369
370            result.m10 = left.m10 + right.m10;
371            result.m11 = left.m11 + right.m11;
372            result.m12 = left.m12 + right.m12;
373
374
375            return result;
376        }
377        public static void Add(ref Matrix2x3 left, ref Matrix2x3 right, out Matrix2x3 result)
378        {
379            result.m00 = left.m00 + right.m00;
380            result.m01 = left.m01 + right.m01;
381            result.m02 = left.m02 + right.m02;
382
383            result.m10 = left.m10 + right.m10;
384            result.m11 = left.m11 + right.m11;
385            result.m12 = left.m12 + right.m12;
386
387
388        }
389
390        public static Matrix2x3 Add(Matrix2x2 left, Matrix2x3 right)
391        {
392            Matrix2x3 result;
393            Add(ref left, ref right, out result);
394            return result;
395        }
396        public static void Add(ref Matrix2x2 left, ref Matrix2x3 right, out Matrix2x3 result)
397        {
398            result.m00 = left.m00 + right.m00;
399            result.m01 = left.m01 + right.m01;
400            result.m02 = right.m02;
401
402            result.m10 = left.m10 + right.m10;
403            result.m11 = left.m11 + right.m11;
404            result.m12 = right.m12;
405
406        }
407        public static Matrix2x3 Add(Matrix2x3 left, Matrix2x2 right)
408        {
409            Matrix2x3 result;
410            Add(ref left, ref right, out result);
411            return result;
412        }
413        public static void Add(ref Matrix2x3 left, ref Matrix2x2 right, out Matrix2x3 result)
414        {
415            result.m00 = left.m00 + right.m00;
416            result.m01 = left.m01 + right.m01;
417            result.m02 = left.m02;
418
419            result.m10 = left.m10 + right.m10;
420            result.m11 = left.m11 + right.m11;
421            result.m12 = left.m12;
422
423        }
424
425        public static Matrix2x3 Transpose(Matrix2x3 source)
426        {
427            Matrix2x3 result;
428            Transpose(ref source, out result);
429            return result;
430        }
431        public static void Transpose(ref Matrix2x3 source, out Matrix2x3 result)
432        {
433            Scalar m01 = source.m01;
434            Scalar m02 = source.m02;
435            Scalar m12 = source.m12;
436
437            result.m00 = source.m00;
438            result.m01 = source.m10;
439            result.m02 = 0;
440
441            result.m10 = m01;
442            result.m11 = source.m11;
443            result.m12 = 0;
444
445
446
447
448        }
449
450        /// <summary>
451        /// Used to subtract two matrices.
452        /// </summary>
453        /// <param name="left"></param>
454        /// <param name="right"></param>
455        /// <returns></returns>
456        public static Matrix2x3 Subtract(Matrix2x3 left, Matrix2x3 right)
457        {
458            Matrix2x3 result;
459
460            result.m00 = left.m00 - right.m00;
461            result.m01 = left.m01 - right.m01;
462            result.m02 = left.m02 - right.m02;
463
464            result.m10 = left.m10 - right.m10;
465            result.m11 = left.m11 - right.m11;
466            result.m12 = left.m12 - right.m12;
467
468
469            return result;
470        }
471        public static void Subtract(ref Matrix2x3 left, ref Matrix2x3 right, out Matrix2x3 result)
472        {
473            result.m00 = left.m00 - right.m00;
474            result.m01 = left.m01 - right.m01;
475            result.m02 = left.m02 - right.m02;
476
477            result.m10 = left.m10 - right.m10;
478            result.m11 = left.m11 - right.m11;
479            result.m12 = left.m12 - right.m12;
480
481
482        }
483
484        public static Matrix2x3 Subtract(Matrix2x2 left, Matrix2x3 right)
485        {
486            Matrix2x3 result;
487            Subtract(ref left, ref right, out result);
488            return result;
489        }
490        public static void Subtract(ref Matrix2x2 left, ref Matrix2x3 right, out Matrix2x3 result)
491        {
492            result.m00 = left.m00 - right.m00;
493            result.m01 = left.m01 - right.m01;
494            result.m02 = -right.m02;
495
496            result.m10 = left.m10 - right.m10;
497            result.m11 = left.m11 - right.m11;
498            result.m12 = -right.m12;
499
500        }
501        public static Matrix2x3 Subtract(Matrix2x3 left, Matrix2x2 right)
502        {
503            Matrix2x3 result;
504            Subtract(ref left, ref right, out result);
505            return result;
506        }
507        public static void Subtract(ref Matrix2x3 left, ref Matrix2x2 right, out Matrix2x3 result)
508        {
509            result.m00 = left.m00 - right.m00;
510            result.m01 = left.m01 - right.m01;
511            result.m02 = left.m02;
512
513            result.m10 = left.m10 - right.m10;
514            result.m11 = left.m11 - right.m11;
515            result.m12 = left.m12;
516
517        }
518
519        /// <summary>
520        /// Negates a Matrix2x3.
521        /// </summary>
522        /// <param name="left"></param>
523        /// <param name="right"></param>
524        /// <returns></returns>
525        public static Matrix2x3 Negate(Matrix2x3 source)
526        {
527            Matrix2x3 result;
528
529            result.m00 = -source.m00;
530            result.m01 = -source.m01;
531            result.m02 = -source.m02;
532
533            result.m10 = -source.m10;
534            result.m11 = -source.m11;
535            result.m12 = -source.m12;
536
537
538
539            return result;
540        }
541        [CLSCompliant(false)]
542        public static void Negate(ref Matrix2x3 source)
543        {
544            Negate(ref source, out source);
545        }
546        public static void Negate(ref Matrix2x3 source, out Matrix2x3 result)
547        {
548            result.m00 = -source.m00;
549            result.m01 = -source.m01;
550            result.m02 = -source.m02;
551
552            result.m10 = -source.m10;
553            result.m11 = -source.m11;
554            result.m12 = -source.m12;
555
556        }
557
558        public static Matrix2x3 Invert(Matrix2x3 source)
559        {
560            Matrix2x3 result;
561            Invert(ref source, out result);
562            return result;
563        }
564        public static void Invert(ref Matrix2x3 source, out Matrix2x3 result)
565        {
566            Scalar m01 = source.m01;
567            Scalar m02 = source.m02;
568
569            Scalar m11 = source.m11;
570            Scalar m12 = source.m12;
571
572
573
574
575            // Scalar m11m22m12m21 = (m11);
576            // Scalar m10m22m12m20 = (source.m10 );
577            // Scalar m10m21m11m20 = 0;
578
579
580
581            Scalar detInv = 1 / (source.m00 * m11 - m01 * source.m10);
582
583
584            result.m01 = detInv * (-m01);
585            result.m02 = detInv * (m01 * m12 - m02 * m11);
586
587            result.m11 = detInv * (source.m00);
588            result.m12 = detInv * (-(source.m00 * m12 - m02 * source.m10));
589
590            result.m00 = detInv * (m11);
591            result.m10 = detInv * (-source.m10);
592        }
593
594        public static Scalar GetDeterminant(Matrix2x3 source)
595        {
596            Scalar result;
597            GetDeterminant(ref source, out result);
598            return result;
599        }
600        public static void GetDeterminant(ref Matrix2x3 source, out Scalar result)
601        {
602            result =
603                source.m00 * (source.m11) -
604                source.m01 * (source.m10);
605        }
606
607        /*  public static Matrix2x3 Transpose(Matrix2x3 source)
608         {
609             Matrix2x3 result;
610             Transpose(ref source, out result);
611             return result;
612         }
613        public static void Transpose(ref Matrix2x3 source, out Matrix2x3 result)
614         {
615             Scalar m01 = source.m01;
616             Scalar m02 = source.m02;
617             Scalar m12 = source.m12;
618
619             result.m00 = source.m00;
620             result.m01 = source.m10;
621             result.m02 = source.m20;
622
623             result.m10 = m01;
624             result.m11 = source.m11;
625             result.m12 = source.m21;
626
627             result.m20 = m02;
628             result.m21 = m12;
629             result.m22 = source.m22;
630
631
632
633         }*/
634
635        public static Matrix2x3 GetAdjoint(Matrix2x3 source)
636        {
637            Matrix2x3 result;
638            GetAdjoint(ref source, out result);
639            return result;
640        }
641        public static void GetAdjoint(ref Matrix2x3 source, out Matrix2x3 result)
642        {
643            Scalar m01 = source.m01;
644            Scalar m02 = source.m02;
645            Scalar m11 = source.m11;
646            Scalar m12 = source.m12;
647
648
649            result.m01 = (-(m01 * 1 - m02 * 0));
650            result.m02 = (m01 * m12 - m02 * m11);
651
652            result.m11 = (source.m00);
653            result.m12 = (-(source.m00 * m12 - m02 * source.m10));
654
655            result.m00 = (m11);
656            result.m10 = (-(source.m10));
657        }
658
659        public static Matrix2x3 GetCofactor(Matrix2x3 source)
660        {
661            Matrix2x3 result;
662            GetCofactor(ref source, out result);
663            return result;
664        }
665        public static void GetCofactor(ref Matrix2x3 source, out Matrix2x3 result)
666        {
667            Scalar m01 = source.m01;
668            Scalar m02 = source.m02;
669            Scalar m11 = source.m11;
670            Scalar m12 = source.m12;
671
672            result.m01 = m01;
673            result.m02 = -(m01 * m12 - m02 * m11);
674
675            result.m11 = -source.m00;
676            result.m12 = source.m00 * m12 - m02 * source.m10;
677
678            result.m00 = -m11;
679            result.m10 = source.m10;
680
681        }
682
683
684        public static Matrix2x3 FromTransformation(Scalar rotation, Vector2D translation)
685        {
686            Matrix2x3 result;
687            FromTransformation(ref rotation, ref translation, out result);
688            return result;
689        }
690        public static void FromTransformation(ref Scalar rotation, ref Vector2D translation, out Matrix2x3 result)
691        {
692            result.m00 = MathHelper.Cos(rotation);
693            result.m10 = MathHelper.Sin(rotation);
694            result.m01 = -result.m10;
695            result.m11 = result.m00;
696            result.m02 = translation.X;
697            result.m12 = translation.Y;
698        }
699
700
701        public static Matrix2x3 FromArray(Scalar[] array)
702        {
703            Matrix2x3 result;
704            Copy(array, 0, out result);
705            return result;
706        }
707       /* public static Matrix2x3 FromTransposedArray(Scalar[] array)
708        {
709            Matrix2x3 result;
710            CopyTranspose(array, 0, out result);
711            return result;
712        }*/
713
714        public static Matrix2x3 FromRotationZ(Scalar radianAngle)
715        {
716            Matrix2x3 result;
717
718            result.m10 = MathHelper.Sin(radianAngle);
719
720
721            result.m00 = MathHelper.Cos(radianAngle);
722            result.m01 = -result.m10;
723            result.m02 = 0;
724
725            result.m11 = result.m00;
726            result.m12 = 0;
727
728            return result;
729        }
730        public static void FromRotationZ(ref Scalar radianAngle, out Matrix2x3 result)
731        {
732
733            result.m10 = MathHelper.Sin(radianAngle);
734
735            result.m00 = MathHelper.Cos(radianAngle);
736            result.m01 = -result.m10;
737            result.m02 = 0;
738
739            result.m11 = result.m00;
740            result.m12 = 0;
741
742
743        }
744
745
746
747        public static Matrix2x3 FromScale(Vector2D scale)
748        {
749            Matrix2x3 result;
750
751            result.m00 = scale.X;
752            result.m01 = 0;
753            result.m02 = 0;
754
755            result.m10 = 0;
756            result.m11 = scale.Y;
757            result.m12 = 0;
758
759            return result;
760        }
761        public static void FromScale(ref Vector2D scale, out Matrix2x3 result)
762        {
763            result.m00 = scale.X;
764            result.m01 = 0;
765            result.m02 = 0;
766
767            result.m10 = 0;
768            result.m11 = scale.Y;
769            result.m12 = 0;
770
771        }
772
773        public static Matrix2x3 FromTranslate2D(Vector2D value)
774        {
775            Matrix2x3 result;
776
777            result.m00 = 1;
778            result.m01 = 0;
779            result.m02 = value.X;
780
781            result.m10 = 0;
782            result.m11 = 1;
783            result.m12 = value.Y;
784
785
786            return result;
787        }
788        public static void FromTranslate2D(ref Vector2D value, out Matrix2x3 result)
789        {
790            result.m00 = 1;
791            result.m01 = 0;
792            result.m02 = value.X;
793
794            result.m10 = 0;
795            result.m11 = 1;
796            result.m12 = value.Y;
797        }
798
799        public static Scalar GetDeterminant(Scalar m00, Scalar m01, Scalar m02,
800            Scalar m10, Scalar m11, Scalar m12,
801            Scalar m20, Scalar m21, Scalar m22)
802        {
803            Scalar cofactor00 = m11 * m22 - m12 * m21;
804            Scalar cofactor10 = m12 * m20 - m10 * m22;
805            Scalar cofactor20 = m10 * m21 - m11 * m20;
806            Scalar result =
807            m00 * cofactor00 +
808            m01 * cofactor10 +
809            m02 * cofactor20;
810            return result;
811        }
812        public static Scalar GetDeterminant(Vector3D Rx, Vector3D Ry, Vector3D Rz)
813        {
814            Scalar cofactor00 = Ry.Y * Rz.Z - Ry.Z * Rz.Y;
815            Scalar cofactor10 = Ry.Z * Rz.X - Ry.X * Rz.Z;
816            Scalar cofactor20 = Ry.X * Rz.Y - Ry.Y * Rz.X;
817            Scalar result =
818            Rx.X * cofactor00 +
819            Rx.Y * cofactor10 +
820            Rx.Z * cofactor20;
821            return result;
822        }
823
824
825        [ParseMethod]
826        public static Matrix2x3 Parse(string s)
827        {
828            Matrix2x3 rv = Zero;
829            ParseHelper.ParseMatrix<Matrix2x3>(s, ref rv);
830            return rv;
831        }
832#if !CompactFramework && !WindowsCE && !PocketPC && !XBOX360 && !SILVERLIGHT
833        public static bool TryParse(string s, out Matrix2x3 result)
834        {
835            result = Zero;
836            return ParseHelper.TryParseMatrix<Matrix2x3>(s, ref result);
837        }
838#endif
839
840
841        public static bool Equals(Matrix2x3 left, Matrix2x3 right)
842        {
843            return
844                left.m00 == right.m00 && left.m01 == right.m01 && left.m02 == right.m02 &&
845                left.m10 == right.m10 && left.m11 == right.m11 && left.m12 == right.m12;
846        }
847        [CLSCompliant(false)]
848        public static bool Equals(ref Matrix2x3 left, ref Matrix2x3 right)
849        {
850            return
851                left.m00 == right.m00 && left.m01 == right.m01 && left.m02 == right.m02 &&
852                left.m10 == right.m10 && left.m11 == right.m11 && left.m12 == right.m12;
853        }
854
855        #endregion
856        #region fields
857
858        // | m00 m01 m02 |
859        // | m10 m11 m12 |
860        [XmlIgnore]
861        public Scalar m00, m01, m02;
862        [XmlIgnore]
863        public Scalar m10, m11, m12;
864
865        #endregion
866        #region Constructors
867
868        /// <summary>
869        /// Creates a new Matrix3 with all the specified parameters.
870        /// </summary>
871        public Matrix2x3(Scalar m00, Scalar m01, Scalar m02,
872        Scalar m10, Scalar m11, Scalar m12)
873        {
874            this.m00 = m00; this.m01 = m01; this.m02 = m02;
875            this.m10 = m10; this.m11 = m11; this.m12 = m12;
876        }
877
878        /// <summary>
879        /// Create a new Matrix from 3 Vertex3 objects.
880        /// </summary>
881        /// <param name="xAxis"></param>
882        /// <param name="yAxis"></param>
883        /// <param name="zAxis"></param>
884        [InstanceConstructor("Rx,Ry")]
885        public Matrix2x3(Vector3D xAxis, Vector3D yAxis)
886        {
887            this.m00 = xAxis.X; this.m01 = xAxis.Y; this.m02 = xAxis.Z;
888            this.m10 = yAxis.X; this.m11 = yAxis.Y; this.m12 = yAxis.Z;
889        }
890        public Matrix2x3(Scalar[] values) : this(values, 0) { }
891        public Matrix2x3(Scalar[] values, int index)
892        {
893            Copy(values, index, out this);
894        }
895        #endregion
896        #region Properties
897        [AdvBrowsable]
898        [System.ComponentModel.Description("The First row of the Matrix2x3")]
899        public Vector3D Rx
900        {
901            get
902            {
903                Vector3D value;
904                value.X = m00;
905                value.Y = m01;
906                value.Z = m02;
907                return value;
908            }
909            set
910            {
911                m00 = value.X;
912                m01 = value.Y;
913                m02 = value.Z;
914            }
915        }
916        [AdvBrowsable]
917        [System.ComponentModel.Description("The Second row of the Matrix2x3")]
918        public Vector3D Ry
919        {
920            get
921            {
922                Vector3D value;
923                value.X = m10;
924                value.Y = m11;
925                value.Z = m12;
926                return value;
927            }
928            set
929            {
930                m10 = value.X;
931                m11 = value.Y;
932                m12 = value.Z;
933            }
934        }
935        [XmlIgnore]
936        public Vector2D Cx
937        {
938            get
939            {
940                return new Vector2D(m00, m10);
941            }
942            set
943            {
944                this.m00 = value.X;
945                this.m10 = value.Y;
946            }
947        }
948        [XmlIgnore]
949        public Vector2D Cy
950        {
951            get
952            {
953                return new Vector2D(m01, m11);
954            }
955            set
956            {
957                this.m01 = value.X;
958                this.m11 = value.Y;
959            }
960        }
961        [XmlIgnore]
962        public Vector2D Cz
963        {
964            get
965            {
966                return new Vector2D(m02, m12);
967            }
968            set
969            {
970                this.m02 = value.X;
971                this.m12 = value.Y;
972            }
973        }
974
975        public Scalar Determinant
976        {
977            get
978            {
979                Scalar result;
980                GetDeterminant(ref this, out result);
981                return result;
982            }
983        }
984        /// <summary>
985        /// Swap the rows of the matrix with the columns.
986        /// </summary>
987        /// <returns>A transposed Matrix.</returns>
988        public Matrix2x3 Transposed
989        {
990            get
991            {
992                throw new NotSupportedException();
993              /*  Matrix2x3 result;
994                Transpose(ref this, out result);
995                return result;*/
996            }
997        }
998        public Matrix2x3 Adjoint
999        {
1000            get
1001            {
1002                Matrix2x3 result;
1003                GetAdjoint(ref this, out result);
1004                return result;
1005            }
1006        }
1007        public Matrix2x3 Cofactor
1008        {
1009            get
1010            {
1011                Matrix2x3 result;
1012                GetCofactor(ref this, out result);
1013                return result;
1014            }
1015        }
1016        public Matrix2x3 Inverted
1017        {
1018            get
1019            {
1020                Matrix2x3 result;
1021                Invert(ref this, out result);
1022                return result;
1023            }
1024        }
1025
1026        int IAdvanceValueType.Count { get { return Count; } }
1027        int IMatrix.RowCount { get { return RowCount; } }
1028        int IMatrix.ColumnCount { get { return ColumnCount; } }
1029        #endregion Properties
1030        #region Methods
1031
1032        public Vector2D GetColumn(int columnIndex)
1033        {
1034            switch (columnIndex)
1035            {
1036                case 0:
1037                    return Cx;
1038                case 1:
1039                    return Cy;
1040                case 2:
1041                    return Cz;
1042            }
1043            throw ThrowHelper.GetThrowIndex("columnIndex", ColumnCount);
1044        }
1045        public void SetColumn(int columnIndex, Vector2D value)
1046        {
1047            switch (columnIndex)
1048            {
1049                case 0:
1050                    Cx = value;
1051                    return;
1052                case 1:
1053                    Cy = value;
1054                    return;
1055                case 2:
1056                    Cz = value;
1057                    return;
1058            }
1059            throw ThrowHelper.GetThrowIndex("columnIndex", ColumnCount);
1060        }
1061        public Vector3D GetRow(int rowIndex)
1062        {
1063            switch (rowIndex)
1064            {
1065                case 0:
1066                    return Rx;
1067                case 1:
1068                    return Ry;
1069            }
1070            throw ThrowHelper.GetThrowIndex("rowIndex", RowCount);
1071        }
1072        public void SetRow(int rowIndex, Vector3D value)
1073        {
1074            switch (rowIndex)
1075            {
1076                case 0:
1077                    Rx = value;
1078                    return;
1079                case 1:
1080                    Ry = value;
1081                    return;
1082            }
1083            throw ThrowHelper.GetThrowIndex("rowIndex", RowCount);
1084        }
1085
1086        public Scalar[,] ToMatrixArray()
1087        {
1088            return new Scalar[RowCount, ColumnCount]{ { m00, m01, m02 }, { m10, m11, m12 } };
1089        }
1090        public Scalar[] ToArray()
1091        {
1092            return new Scalar[Count] { m00, m01, m02, m10, m11, m12 };
1093        }
1094        public Scalar[] ToTransposedArray()
1095        {
1096            throw new NotSupportedException();
1097          //  return new Scalar[Count] { m00, m10, m20, m01, m11, m21, m02, m12, m22 };
1098        }
1099
1100        public Matrix4x4 ToMatrix4x4From2D()
1101        {
1102            Matrix4x4 result = Matrix4x4.Identity;
1103            result.m00 = this.m00; result.m01 = this.m01; result.m03 = this.m02;
1104            result.m10 = this.m10; result.m11 = this.m11; result.m13 = this.m12;
1105            return result;
1106        }
1107        public Matrix4x4 ToMatrix4x4()
1108        {
1109            Matrix4x4 result = Matrix4x4.Identity;
1110            result.m00 = this.m00; result.m01 = this.m01; result.m02 = this.m02;
1111            result.m10 = this.m10; result.m11 = this.m11; result.m12 = this.m12;
1112            return result;
1113        }
1114
1115        public void CopyTo(Scalar[] array, int index)
1116        {
1117            Copy(ref this, array, index);
1118        }
1119        public void CopyTransposedTo(Scalar[] array, int index)
1120        {
1121            throw new NotSupportedException();
1122           // CopyTranspose(ref this, array, index);
1123        }
1124        public void CopyFrom(Scalar[] array, int index)
1125        {
1126            Copy(array, index, out this);
1127        }
1128        public void CopyTransposedFrom(Scalar[] array, int index)
1129        {
1130            throw new NotSupportedException();
1131           // CopyTranspose(array, index, out this);
1132        }
1133
1134
1135
1136        private string ToStringInternal(string FormatString)
1137        {
1138            return string.Format(FormatString,
1139            m00, m01, m02,
1140            m10, m11, m12);
1141        }
1142        public string ToString(string format)
1143        {
1144            return ToStringInternal(string.Format(FormatableString, format));
1145        }
1146        public override string ToString()
1147        {
1148            return ToStringInternal(FormatString);
1149        }
1150
1151        public override int GetHashCode()
1152        {
1153            return
1154            m00.GetHashCode() ^ m01.GetHashCode() ^ m02.GetHashCode() ^
1155            m10.GetHashCode() ^ m11.GetHashCode() ^ m12.GetHashCode();
1156        }
1157
1158        public override bool Equals(object obj)
1159        {
1160            return
1161                (obj is Matrix2x3) &&
1162                Equals((Matrix2x3)obj);
1163        }
1164        public bool Equals(Matrix2x3 other)
1165        {
1166            return Equals(ref this, ref other);
1167        }
1168
1169        #endregion
1170        #region Indexors
1171#if UNSAFE
1172        /// <summary>
1173        /// Allows the Matrix to be accessed like a 2d array (i.e. matrix[2,3])
1174        /// </summary>
1175        /// <remarks>
1176        /// This indexer is only provided as a convenience, and is <b>not</b> recommended for use in
1177        /// intensive applications.
1178        /// </remarks>
1179        public Scalar this[int rowIndex, int columnIndex]
1180        {
1181            get
1182            {
1183                ThrowHelper.CheckIndex("rowIndex", rowIndex, RowCount);
1184                ThrowHelper.CheckIndex("columnIndex", columnIndex, ColumnCount);
1185                unsafe
1186                {
1187                    fixed (Scalar* pM = &m00)
1188                    {
1189                        return pM[(ColumnCount * rowIndex) + columnIndex];
1190                    }
1191                }
1192            }
1193            set
1194            {
1195                ThrowHelper.CheckIndex("rowIndex", rowIndex, RowCount);
1196                ThrowHelper.CheckIndex("columnIndex", columnIndex, ColumnCount);
1197                unsafe
1198                {
1199                    fixed (Scalar* pM = &m00)
1200                    {
1201                        pM[(ColumnCount * rowIndex) + columnIndex] = value;
1202                    }
1203                }
1204            }
1205        }
1206        /// <summary>
1207        /// Allows the Matrix to be accessed linearly (m[0] -> m[ColumnCount*RowCount-1]).
1208        /// </summary>
1209        /// <remarks>
1210        /// This indexer is only provided as a convenience, and is <b>not</b> recommended for use in
1211        /// intensive applications.
1212        /// </remarks>
1213        public Scalar this[int index]
1214        {
1215            get
1216            {
1217                ThrowHelper.CheckIndex("index", index, Count);
1218                unsafe
1219                {
1220                    fixed (Scalar* pMatrix = &this.m00)
1221                    {
1222                        return pMatrix[index];
1223                    }
1224                }
1225            }
1226            set
1227            {
1228                ThrowHelper.CheckIndex("index", index, Count);
1229                unsafe
1230                {
1231                    fixed (Scalar* pMatrix = &this.m00)
1232                    {
1233                        pMatrix[index] = value;
1234                    }
1235                }
1236            }
1237        }
1238#endif
1239        #endregion
1240        #region Operator overloads
1241        /// <summary>
1242        /// Multiply (concatenate) two Matrix3 instances together.
1243        /// </summary>
1244        /// <param name="left"></param>
1245        /// <param name="right"></param>
1246        /// <returns></returns>
1247        public static Matrix2x3 operator *(Matrix2x3 left, Matrix2x3 right)
1248        {
1249
1250            Matrix2x3 result;
1251
1252            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
1253            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
1254            result.m02 = left.m00 * right.m02 + left.m01 * right.m12 + left.m02 ;
1255
1256            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
1257            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
1258            result.m12 = left.m10 * right.m02 + left.m11 * right.m12 + left.m12 ;
1259
1260            return result;
1261        }
1262        /// <summary>
1263        /// Multiply (concatenate) a Matrix2x3 and a Matrix2x2
1264        /// </summary>
1265        /// <param name="left"></param>
1266        /// <param name="right"></param>
1267        /// <returns></returns>
1268        public static Matrix2x3 operator *(Matrix2x2 left, Matrix2x3 right)
1269        {
1270
1271            Matrix2x3 result;
1272
1273            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
1274            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
1275            result.m02 = left.m00 * right.m02 + left.m01 * right.m12;
1276
1277            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
1278            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
1279            result.m12 = left.m10 * right.m02 + left.m11 * right.m12;
1280
1281            return result;
1282        }
1283        /// <summary>
1284        /// Multiply (concatenate) a Matrix2x3 and a Matrix2x2
1285        /// </summary>
1286        /// <param name="left"></param>
1287        /// <param name="right"></param>
1288        /// <returns></returns>
1289        public static Matrix2x3 operator *(Matrix2x3 left, Matrix2x2 right)
1290        {
1291
1292            Matrix2x3 result;
1293
1294            result.m00 = left.m00 * right.m00 + left.m01 * right.m10;
1295            result.m01 = left.m00 * right.m01 + left.m01 * right.m11;
1296            result.m02 = left.m02;
1297
1298            result.m10 = left.m10 * right.m00 + left.m11 * right.m10;
1299            result.m11 = left.m10 * right.m01 + left.m11 * right.m11;
1300            result.m12 = left.m12;
1301
1302            return result;
1303        }
1304
1305        /// <summary>
1306        /// Multiplies all the items in the Matrix3 by a scalar value.
1307        /// </summary>
1308        /// <param name="matrix"></param>
1309        /// <param name="scalar"></param>
1310        /// <returns></returns>
1311        public static Matrix2x3 operator *(Matrix2x3 matrix, Scalar scalar)
1312        {
1313            Matrix2x3 result;
1314
1315            result.m00 = matrix.m00 * scalar;
1316            result.m01 = matrix.m01 * scalar;
1317            result.m02 = matrix.m02 * scalar;
1318            result.m10 = matrix.m10 * scalar;
1319            result.m11 = matrix.m11 * scalar;
1320            result.m12 = matrix.m12 * scalar;
1321
1322            return result;
1323        }
1324        /// <summary>
1325        /// Multiplies all the items in the Matrix3 by a scalar value.
1326        /// </summary>
1327        /// <param name="matrix"></param>
1328        /// <param name="scalar"></param>
1329        /// <returns></returns>
1330        public static Matrix2x3 operator *(Scalar scalar, Matrix2x3 matrix)
1331        {
1332            Matrix2x3 result;
1333
1334            result.m00 = matrix.m00 * scalar;
1335            result.m01 = matrix.m01 * scalar;
1336            result.m02 = matrix.m02 * scalar;
1337            result.m10 = matrix.m10 * scalar;
1338            result.m11 = matrix.m11 * scalar;
1339            result.m12 = matrix.m12 * scalar;
1340
1341            return result;
1342        }
1343        /// <summary>
1344        /// Used to add two matrices together.
1345        /// </summary>
1346        /// <param name="left"></param>
1347        /// <param name="right"></param>
1348        /// <returns></returns>
1349        public static Matrix2x3 operator +(Matrix2x3 left, Matrix2x3 right)
1350        {
1351            Matrix2x3 result;
1352
1353            result.m00 = left.m00 + right.m00;
1354            result.m01 = left.m01 + right.m01;
1355            result.m02 = left.m02 + right.m02;
1356
1357            result.m10 = left.m10 + right.m10;
1358            result.m11 = left.m11 + right.m11;
1359            result.m12 = left.m12 + right.m12;
1360
1361
1362            return result;
1363        }
1364        public static Matrix2x3 operator +(Matrix2x2 left, Matrix2x3 right)
1365        {
1366            Matrix2x3 result;
1367            Add(ref left, ref right, out result);
1368            return result;
1369        }
1370        public static Matrix2x3 operator +(Matrix2x3 left, Matrix2x2 right)
1371        {
1372            Matrix2x3 result;
1373            Add(ref left, ref right, out result);
1374            return result;
1375        }
1376        /// <summary>
1377        /// Used to subtract two matrices.
1378        /// </summary>
1379        /// <param name="left"></param>
1380        /// <param name="right"></param>
1381        /// <returns></returns>
1382        public static Matrix2x3 operator -(Matrix2x3 left, Matrix2x3 right)
1383        {
1384            Matrix2x3 result;
1385
1386            result.m00 = left.m00 - right.m00;
1387            result.m01 = left.m01 - right.m01;
1388            result.m02 = left.m02 - right.m02;
1389
1390            result.m10 = left.m10 - right.m10;
1391            result.m11 = left.m11 - right.m11;
1392            result.m12 = left.m12 - right.m12;
1393
1394
1395            return result;
1396        }
1397        public static Matrix2x3 operator -(Matrix2x2 left, Matrix2x3 right)
1398        {
1399            Matrix2x3 result;
1400            Subtract(ref left, ref right, out result);
1401            return result;
1402        }
1403        public static Matrix2x3 operator -(Matrix2x3 left, Matrix2x2 right)
1404        {
1405            Matrix2x3 result;
1406            Subtract(ref left, ref right, out result);
1407            return result;
1408        }
1409        /// <summary>
1410        /// Negates all the items in the Matrix.
1411        /// </summary>
1412        /// <param name="matrix"></param>
1413        /// <returns></returns>
1414        public static Matrix2x3 operator -(Matrix2x3 matrix)
1415        {
1416            Matrix2x3 result;
1417
1418            result.m00 = -matrix.m00;
1419            result.m01 = -matrix.m01;
1420            result.m02 = -matrix.m02;
1421            result.m10 = -matrix.m10;
1422            result.m11 = -matrix.m11;
1423            result.m12 = -matrix.m12;
1424
1425            return result;
1426        }
1427        /// <summary>
1428        /// Test two matrices for (value) equality
1429        /// </summary>
1430        /// <param name="left"></param>
1431        /// <param name="right"></param>
1432        /// <returns></returns>
1433        public static bool operator ==(Matrix2x3 left, Matrix2x3 right)
1434        {
1435            return
1436            left.m00 == right.m00 && left.m01 == right.m01 && left.m02 == right.m02 &&
1437            left.m10 == right.m10 && left.m11 == right.m11 && left.m12 == right.m12;
1438        }
1439        public static bool operator !=(Matrix2x3 left, Matrix2x3 right)
1440        {
1441            return !(left == right);
1442        }
1443
1444
1445        public static explicit operator Matrix2x3(Matrix4x4 source)
1446        {
1447            Matrix2x3 result;
1448
1449            result.m00 = source.m00;
1450            result.m01 = source.m01;
1451            result.m02 = source.m02;
1452
1453            result.m10 = source.m10;
1454            result.m11 = source.m11;
1455            result.m12 = source.m12;
1456
1457
1458            return result;
1459        }
1460        public static explicit operator Matrix2x3(Matrix2x2 source)
1461        {
1462            Matrix2x3 result;
1463
1464            result.m00 = source.m00;
1465            result.m01 = source.m01;
1466            result.m02 = 0;
1467
1468            result.m10 = source.m10;
1469            result.m11 = source.m11;
1470            result.m12 = 0;
1471
1472
1473
1474
1475
1476
1477            return result;
1478        }
1479
1480        #endregion
1481
1482
1483    }
1484}
Note: See TracBrowser for help on using the repository browser.