daily update on 20230813 by nitload youmu, weritting matrix algs

This commit is contained in:
Nitload
2023-08-13 22:45:22 +08:00
parent f9f339405e
commit 969406c4e4
212 changed files with 14880 additions and 13745 deletions
@@ -3,7 +3,7 @@
public static unsafe partial class Vector
{
public static float Cross(vec2d vec1, vec2d vec2)
public static float Cross(Vec2d vec1, Vec2d vec2)
{
return vec1.X * vec2.Y - vec1.Y * vec2.X;
}
+3 -3
View File
@@ -2,12 +2,12 @@
{
public static unsafe partial class Vector
{
public static float Det(matrix2x2 array)
/*
public static float Det(Matrix2x2 array)
{
return Cross(array.row1, array.row2);
}
/**/
/*
public static unsafe float Det(matrix3x3 array)
@@ -2,7 +2,7 @@
{
public static unsafe partial class Vector
{
public static float GetAngle(vec2d vec1, vec2d vec2)
public static float GetAngle(Vec2d vec1, Vec2d vec2)
{
return Calc.ACos(1
//vec1.multiple(vec2)
@@ -11,7 +11,7 @@
);
}
public static float GetLength(this vec2d vec)
public static float GetLength(this Vec2d vec)
{
return Calc.Sqrt(
vec.X * vec.X +
@@ -3,7 +3,7 @@
public static unsafe partial class Vector
{
/*
public static vec2d GetVector( vec4d pointPair)
public static Vec2d GetVector( vec4d pointPair)
{
return pointPair.Point2-pointPair.Point1;
}
File diff suppressed because it is too large Load Diff
@@ -2,26 +2,26 @@
{
public unsafe static partial class Vector
{
public static Vec3d To3D(vec2d vec)
public static Vec3d To3D(Vec2d vec)
{
return new Vec3d(vec.X, vec.Y, 0.0f);
}
public static vec2d To2D(Vec3d vec, CordinatePlain plain)
public static Vec2d To2D(Vec3d vec, CordinatePlain plain)
{
switch (plain)
{
case CordinatePlain.XY:
return new vec2d(vec.X, vec.Y);
return new Vec2d(vec.X, vec.Y);
break;
case CordinatePlain.YZ:
return new vec2d(vec.Y, vec.Z);
return new Vec2d(vec.Y, vec.Z);
break;
case CordinatePlain.XZ:
return new vec2d(vec.X, vec.Z);
return new Vec2d(vec.X, vec.Z);
break;
default:
return default(vec2d);
return default(Vec2d);
break;
}
}
+96 -151
View File
@@ -1,6 +1,7 @@
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace StgSharp.Math
@@ -11,8 +12,12 @@ namespace StgSharp.Math
Copy
}
public unsafe class Matrix4x4
public unsafe class Matrix4x4:IDisposable
{
public static readonly Matrix4x4 Unit
= new Matrix4x4(
1,0,0,0,
@@ -22,178 +27,118 @@ namespace StgSharp.Math
);
internal M128Map M128Map;
internal M128Map map;
internal IntPtr _colum0Ptr;
internal IntPtr _colum1Ptr;
internal IntPtr _colum2Ptr;
internal IntPtr _colum3Ptr;
//pointers of 4 colums are collected
//in the array referred by these pointer.
internal M128matMap _matMap;
private bool isTransposed=false;
private Matrix4x4 _transpose;
//define if this matrix has correctly stored its transpose matrix
internal bool isTransposed = false;
//store the transpose mat of this one to avoid calculate again
internal M128matMap _transpose;
private bool disposedValue;
internal Matrix4x4()
{
_colum0Ptr = internalIO.load_internal(0,0,0,0);
_colum1Ptr = internalIO.load_internal(0,0,0,0);
_colum2Ptr = internalIO.load_internal(0,0,0,0);
_colum3Ptr = internalIO.load_internal(0,0,0,0);
_transpose = new Matrix4x4(this);
}
//Ctor used for the matixes of transposed matrix
internal Matrix4x4(Matrix4x4 transpose)
{
_colum0Ptr = internalIO.load_internal(0, 0, 0, 0);
_colum1Ptr = internalIO.load_internal(0, 0, 0, 0);
_colum2Ptr = internalIO.load_internal(0, 0, 0, 0);
_colum3Ptr = internalIO.load_internal(0, 0, 0, 0);
_transpose = transpose;
this.isTransposed=true;
}
internal unsafe Matrix4x4(
IntPtr row0Ptr,
IntPtr row1Ptr,
IntPtr row2Ptr,
IntPtr row3Ptr
)
{
_colum0Ptr= row0Ptr;
_colum1Ptr= row1Ptr;
_colum2Ptr= row2Ptr;
_colum3Ptr= row3Ptr;
_transpose = new Matrix4x4(this);
}
public unsafe Matrix4x4(
float a00, float a01, float a02, float a03,
float a10, float a11, float a12, float a13,
float a20, float a21, float a22, float a23,
float a30, float a31, float a32, float a33
)
{
_colum0Ptr = internalIO.load_internal(a00,a10,a20,a30);
_colum1Ptr = internalIO.load_internal(a01,a11,a21,a31);
_colum2Ptr = internalIO.load_internal(a02,a12,a22,a32);
_colum3Ptr = internalIO.load_internal(a03,a13,a23,a33);
_transpose = new Matrix4x4(this);
}
public unsafe Matrix4x4 Transpose(TransposeMode transposeMode)
{
if (!isTransposed)
{
(*(M128*)_transpose._colum0Ptr).single_0 = (*(M128*)_colum0Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_1 = (*(M128*)_colum1Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_2 = (*(M128*)_colum2Ptr).single_0;
(*(M128*)_transpose._colum0Ptr).single_3 = (*(M128*)_colum3Ptr).single_0;
(*(M128*)_transpose._colum1Ptr).single_0 = (*(M128*)_colum0Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_1 = (*(M128*)_colum1Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_2 = (*(M128*)_colum2Ptr).single_1;
(*(M128*)_transpose._colum1Ptr).single_3 = (*(M128*)_colum3Ptr).single_1;
(*(M128*)_transpose._colum2Ptr).single_0 = (*(M128*)_colum0Ptr).single_2;
(*(M128*)_transpose._colum2Ptr).single_1 = (*(M128*)_colum1Ptr).single_2;
(*(M128*)_transpose._colum2Ptr).single_2 = (*(M128*)_colum2Ptr).single_2;
(*(M128*)_transpose._colum2Ptr).single_3 = (*(M128*)_colum3Ptr).single_2;
(*(M128*)_transpose._colum3Ptr).single_0 = (*(M128*)_colum0Ptr).single_3;
(*(M128*)_transpose._colum3Ptr).single_1 = (*(M128*)_colum1Ptr).single_3;
(*(M128*)_transpose._colum3Ptr).single_2 = (*(M128*)_colum2Ptr).single_3;
(*(M128*)_transpose._colum3Ptr).single_3 = (*(M128*)_colum3Ptr).single_3;
isTransposed = true;
}
switch (transposeMode)
{
case TransposeMode.New:
return new Matrix4x4(
internalIO.load_cpy_internal(_transpose._colum0Ptr),
internalIO.load_cpy_internal(_transpose._colum1Ptr),
internalIO.load_cpy_internal(_transpose._colum2Ptr),
internalIO.load_cpy_internal(_transpose._colum3Ptr)
);
break;
case TransposeMode.Copy:
return _transpose;
break;
default:
throw new Exception();
break;
}
}
/**/
public static Matrix4x4 operator +(Matrix4x4 matrix1, Matrix4x4 matrix2)
{
return new Matrix4x4(
internalIO.addps_internal(matrix1._colum0Ptr, matrix2._colum0Ptr),
internalIO.addps_internal(matrix1._colum1Ptr, matrix2._colum1Ptr),
internalIO.addps_internal(matrix1._colum2Ptr, matrix2._colum2Ptr),
internalIO.addps_internal(matrix1._colum3Ptr, matrix2._colum3Ptr)
) ;
}
public static Matrix4x4 operator -(Matrix4x4 matrix1, Matrix4x4 matrix2)
{
return new Matrix4x4(
internalIO.subps_internal(matrix1._colum0Ptr, matrix2._colum0Ptr),
internalIO.subps_internal(matrix1._colum1Ptr, matrix2._colum1Ptr),
internalIO.subps_internal(matrix1._colum2Ptr, matrix2._colum2Ptr),
internalIO.subps_internal(matrix1._colum3Ptr, matrix2._colum3Ptr)
_matMap = new M128matMap(
internalIO.load_internal(0, 0, 0, 0),
internalIO.load_internal(0, 0, 0, 0),
internalIO.load_internal(0, 0, 0, 0),
internalIO.load_internal(0, 0, 0, 0)
);
}
/**/
public static Matrix4x4 operator *(Matrix4x4 matrix, float value)
//constructor used to transform a matMap from C to a Matrix class,
//the original matMap will be cleaned up after transformation
internal Matrix4x4(
ref M128matMap matMap
)
{
return new Matrix4x4(
internalIO.mulps_const_internal(matrix._colum0Ptr,value),
internalIO.mulps_const_internal(matrix._colum1Ptr,value),
internalIO.mulps_const_internal(matrix._colum2Ptr,value),
internalIO.mulps_const_internal(matrix._colum3Ptr,value)
_matMap = matMap;
internalIO .deinitMatmap_sse_internal( ref matMap );
}
internal Matrix4x4(
IntPtr c0Ptr,
IntPtr c1Ptr,
IntPtr c2Ptr,
IntPtr c3Ptr
)
{
_matMap = new M128matMap(c0Ptr,c1Ptr,c2Ptr,c3Ptr);
}
public Matrix4x4(
float a00,float a01,float a02,float a03,
float a10,float a11,float a12,float a13,
float a20,float a21,float a22,float a23,
float a30,float a31,float a32,float a33
)
{
_matMap = new M128matMap(
internalIO.load_internal(a00, a10, a20, a30),
internalIO.load_internal(a01, a11, a21, a31),
internalIO.load_internal(a02, a12, a22, a32),
internalIO.load_internal(a03, a13, a23, a33)
);
}
public override string ToString()
{
return $"{*(M128*)_colum0Ptr}\n{*(M128*)_colum1Ptr}\n{*(M128*)_colum2Ptr}\n{*(M128*)_colum3Ptr}";
}
/**/
~Matrix4x4()
public Matrix4x4 Transpose
{
if (map==null)
{
internalIO.deinitM128_internal(_colum0Ptr);
internalIO.deinitM128_internal(_colum1Ptr);
internalIO.deinitM128_internal(_colum2Ptr);
internalIO.deinitM128_internal(_colum3Ptr);
}
else
{
//in case the matrix is in a M128 map
get {
if (isTransposed)
{
internalIO.deinitMatmap_sse_internal(ref _transpose);
}
return new Matrix4x4(
internalIO.load_cpy_internal(_transpose.colum0Ptr),
internalIO.load_cpy_internal(_transpose.colum1Ptr),
internalIO.load_cpy_internal(_transpose.colum2Ptr),
internalIO.load_cpy_internal(_transpose.colum3Ptr)
);
}
}
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: 释放托管状态(托管对象)
}
// TODO: 释放未托管的资源(未托管的对象)并重写终结器
// TODO: 将大型字段设置为 null
disposedValue = true;
}
}
// // TODO: 仅当“Dispose(bool disposing)”拥有用于释放未托管资源的代码时才替代终结器
// ~Matrix4x4()
// {
// // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
// Dispose(disposing: false);
// }
public void Dispose()
{
// 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
+5
View File
@@ -3,6 +3,11 @@ using System.Runtime.InteropServices;
namespace StgSharp.Math
{
/// <summary>
/// A two dimension vector defined by two elements.
/// Vec2Ds in StgSharp are defaultly usaed as colum vector.
/// </summary>
public class Vec2d
{
+13 -3
View File
@@ -82,17 +82,27 @@ namespace StgSharp.Math
internalIO.divps_const_internal(vec._m128Ptr,value)
);
}
/**/
public static float operator *(Vec3d vec1, Vec3d vec2)
{
return VectorCalc.Multiple(vec1,vec2);
}
//return VectorCalc.Multiple(vec1,vec2);
return 0;
}
/**/
public unsafe override string ToString()
{
return (*(M128*)_m128Ptr).ToString();
}
public unsafe string ToString(string sample)
{
return $"{(*(M128*)_m128Ptr).single_0.ToString(sample)}\t"+
$"{(*(M128*)_m128Ptr).single_1.ToString(sample)}\t"+
$"{(*(M128*)_m128Ptr).single_2.ToString(sample)}\t"+
$"{(*(M128*)_m128Ptr).single_3.ToString(sample)}\t";
}
~Vec3d()
{
if (_map == null)