Skip to content

Commit e0e9f15

Browse files
Implement various convenience methods for System.Numerics types (#115457)
1 parent ffcdaeb commit e0e9f15

20 files changed

+1399
-340
lines changed

src/libraries/System.Numerics.Vectors/ref/System.Numerics.Vectors.cs

Lines changed: 58 additions & 16 deletions
Large diffs are not rendered by default.

src/libraries/System.Numerics.Vectors/tests/Matrix3x2Tests.cs

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,8 @@ public void Matrix3x2InvertAffineTest()
208208
Assert.True(MathHelper.Equal(i, Matrix3x2.Identity));
209209
}
210210

211+
212+
211213
// A test for CreateRotation (float)
212214
[Fact]
213215
public void Matrix3x2CreateRotationTest()
@@ -1081,5 +1083,138 @@ public unsafe void Matrix3x2FieldOffsetTest()
10811083
Assert.Equal(new IntPtr(basePtr + 4), new IntPtr(&mat.M31));
10821084
Assert.Equal(new IntPtr(basePtr + 5), new IntPtr(&mat.M32));
10831085
}
1086+
1087+
[Fact]
1088+
public void Matrix3x2CreateBroadcastScalarTest()
1089+
{
1090+
Matrix3x2 a = Matrix3x2.Create(float.Pi);
1091+
1092+
Assert.Equal(Vector2.Create(float.Pi), a.X);
1093+
Assert.Equal(Vector2.Create(float.Pi), a.Y);
1094+
Assert.Equal(Vector2.Create(float.Pi), a.Z);
1095+
}
1096+
1097+
[Fact]
1098+
public void Matrix3x2CreateBroadcastVectorTest()
1099+
{
1100+
Matrix3x2 a = Matrix3x2.Create(Vector2.Create(float.Pi, float.E));
1101+
1102+
Assert.Equal(Vector2.Create(float.Pi, float.E), a.X);
1103+
Assert.Equal(Vector2.Create(float.Pi, float.E), a.Y);
1104+
Assert.Equal(Vector2.Create(float.Pi, float.E), a.Z);
1105+
}
1106+
1107+
[Fact]
1108+
public void Matrix3x2CreateVectorsTest()
1109+
{
1110+
Matrix3x2 a = Matrix3x2.Create(
1111+
Vector2.Create(11.0f, 12.0f),
1112+
Vector2.Create(21.0f, 22.0f),
1113+
Vector2.Create(31.0f, 32.0f)
1114+
);
1115+
1116+
Assert.Equal(Vector2.Create(11.0f, 12.0f), a.X);
1117+
Assert.Equal(Vector2.Create(21.0f, 22.0f), a.Y);
1118+
Assert.Equal(Vector2.Create(31.0f, 32.0f), a.Z);
1119+
}
1120+
1121+
[Fact]
1122+
public void Matrix3x2GetElementTest()
1123+
{
1124+
Matrix3x2 a = GenerateTestMatrix();
1125+
1126+
Assert.Equal(a.M11, a.X.X);
1127+
Assert.Equal(a.M11, a[0, 0]);
1128+
Assert.Equal(a.M11, a.GetElement(0, 0));
1129+
1130+
Assert.Equal(a.M12, a.X.Y);
1131+
Assert.Equal(a.M12, a[0, 1]);
1132+
Assert.Equal(a.M12, a.GetElement(0, 1));
1133+
1134+
Assert.Equal(a.M21, a.Y.X);
1135+
Assert.Equal(a.M21, a[1, 0]);
1136+
Assert.Equal(a.M21, a.GetElement(1, 0));
1137+
1138+
Assert.Equal(a.M22, a.Y.Y);
1139+
Assert.Equal(a.M22, a[1, 1]);
1140+
Assert.Equal(a.M22, a.GetElement(1, 1));
1141+
1142+
Assert.Equal(a.M31, a.Z.X);
1143+
Assert.Equal(a.M31, a[2, 0]);
1144+
Assert.Equal(a.M31, a.GetElement(2, 0));
1145+
1146+
Assert.Equal(a.M32, a.Z.Y);
1147+
Assert.Equal(a.M32, a[2, 1]);
1148+
Assert.Equal(a.M32, a.GetElement(2, 1));
1149+
}
1150+
1151+
[Fact]
1152+
public void Matrix3x2GetRowTest()
1153+
{
1154+
Matrix3x2 a = GenerateTestMatrix();
1155+
1156+
Vector2 vx = new Vector2(a.M11, a.M12);
1157+
Assert.Equal(vx, a.X);
1158+
Assert.Equal(vx, a[0]);
1159+
Assert.Equal(vx, a.GetRow(0));
1160+
1161+
Vector2 vy = new Vector2(a.M21, a.M22);
1162+
Assert.Equal(vy, a.Y);
1163+
Assert.Equal(vy, a[1]);
1164+
Assert.Equal(vy, a.GetRow(1));
1165+
1166+
Vector2 vz = new Vector2(a.M31, a.M32);
1167+
Assert.Equal(vz, a.Z);
1168+
Assert.Equal(vz, a[2]);
1169+
Assert.Equal(vz, a.GetRow(2));
1170+
}
1171+
1172+
[Fact]
1173+
public void Matrix3x2WithElementTest()
1174+
{
1175+
Matrix3x2 a = Matrix3x2.Identity;
1176+
1177+
a[0, 0] = 11.0f;
1178+
Assert.Equal(11.5f, a.WithElement(0, 0, 11.5f).M11);
1179+
Assert.Equal(11.0f, a.M11);
1180+
1181+
a[0, 1] = 12.0f;
1182+
Assert.Equal(12.5f, a.WithElement(0, 1, 12.5f).M12);
1183+
Assert.Equal(12.0f, a.M12);
1184+
1185+
a[1, 0] = 21.0f;
1186+
Assert.Equal(21.5f, a.WithElement(1, 0, 21.5f).M21);
1187+
Assert.Equal(21.0f, a.M21);
1188+
1189+
a[1, 1] = 22.0f;
1190+
Assert.Equal(22.5f, a.WithElement(1, 1, 22.5f).M22);
1191+
Assert.Equal(22.0f, a.M22);
1192+
1193+
a[2, 0] = 31.0f;
1194+
Assert.Equal(31.5f, a.WithElement(2, 0, 31.5f).M31);
1195+
Assert.Equal(31.0f, a.M31);
1196+
1197+
a[2, 1] = 32.0f;
1198+
Assert.Equal(32.5f, a.WithElement(2, 1, 32.5f).M32);
1199+
Assert.Equal(32.0f, a.M32);
1200+
}
1201+
1202+
[Fact]
1203+
public void Matrix3x2WithRowTest()
1204+
{
1205+
Matrix3x2 a = Matrix3x2.Identity;
1206+
1207+
a[0] = Vector2.Create(11.0f, 12.0f);
1208+
Assert.Equal(Vector2.Create(11.5f, 12.5f), a.WithRow(0, Vector2.Create(11.5f, 12.5f)).X);
1209+
Assert.Equal(Vector2.Create(11.0f, 12.0f), a.X);
1210+
1211+
a[1] = Vector2.Create(21.0f, 22.0f);
1212+
Assert.Equal(Vector2.Create(21.5f, 22.5f), a.WithRow(1, Vector2.Create(21.5f, 22.5f)).Y);
1213+
Assert.Equal(Vector2.Create(21.0f, 22.0f), a.Y);
1214+
1215+
a[2] = Vector2.Create(31.0f, 32.0f);
1216+
Assert.Equal(Vector2.Create(31.5f, 32.5f), a.WithRow(2, Vector2.Create(31.5f, 32.5f)).Z);
1217+
Assert.Equal(Vector2.Create(31.0f, 32.0f), a.Z);
1218+
}
10841219
}
10851220
}

src/libraries/System.Numerics.Vectors/tests/Matrix4x4Tests.cs

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3168,5 +3168,231 @@ public void PerspectiveOffCenterFarPlaneAtInfinityTest()
31683168
Assert.Equal(-1.0f, m.M33);
31693169
Assert.Equal(-nearPlaneDistance, m.M43);
31703170
}
3171+
3172+
[Fact]
3173+
public void Matrix4x4CreateBroadcastScalarTest()
3174+
{
3175+
Matrix4x4 a = Matrix4x4.Create(float.Pi);
3176+
3177+
Assert.Equal(Vector4.Create(float.Pi), a.X);
3178+
Assert.Equal(Vector4.Create(float.Pi), a.Y);
3179+
Assert.Equal(Vector4.Create(float.Pi), a.Z);
3180+
Assert.Equal(Vector4.Create(float.Pi), a.W);
3181+
}
3182+
3183+
[Fact]
3184+
public void Matrix4x4CreateBroadcastVectorTest()
3185+
{
3186+
Matrix4x4 a = Matrix4x4.Create(Vector4.Create(float.Pi, float.E, float.PositiveInfinity, float.NegativeInfinity));
3187+
3188+
Assert.Equal(Vector4.Create(float.Pi, float.E, float.PositiveInfinity, float.NegativeInfinity), a.X);
3189+
Assert.Equal(Vector4.Create(float.Pi, float.E, float.PositiveInfinity, float.NegativeInfinity), a.Y);
3190+
Assert.Equal(Vector4.Create(float.Pi, float.E, float.PositiveInfinity, float.NegativeInfinity), a.Z);
3191+
Assert.Equal(Vector4.Create(float.Pi, float.E, float.PositiveInfinity, float.NegativeInfinity), a.W);
3192+
}
3193+
3194+
[Fact]
3195+
public void Matrix4x4CreateVectorsTest()
3196+
{
3197+
Matrix4x4 a = Matrix4x4.Create(
3198+
Vector4.Create(11.0f, 12.0f, 13.0f, 14.0f),
3199+
Vector4.Create(21.0f, 22.0f, 23.0f, 24.0f),
3200+
Vector4.Create(31.0f, 32.0f, 33.0f, 34.0f),
3201+
Vector4.Create(41.0f, 42.0f, 43.0f, 44.0f)
3202+
);
3203+
3204+
Assert.Equal(Vector4.Create(11.0f, 12.0f, 13.0f, 14.0f), a.X);
3205+
Assert.Equal(Vector4.Create(21.0f, 22.0f, 23.0f, 24.0f), a.Y);
3206+
Assert.Equal(Vector4.Create(31.0f, 32.0f, 33.0f, 34.0f), a.Z);
3207+
Assert.Equal(Vector4.Create(41.0f, 42.0f, 43.0f, 44.0f), a.W);
3208+
}
3209+
3210+
[Fact]
3211+
public void Matrix4x4GetElementTest()
3212+
{
3213+
Matrix4x4 a = GenerateTestMatrix();
3214+
3215+
Assert.Equal(a.M11, a.X.X);
3216+
Assert.Equal(a.M11, a[0, 0]);
3217+
Assert.Equal(a.M11, a.GetElement(0, 0));
3218+
3219+
Assert.Equal(a.M12, a.X.Y);
3220+
Assert.Equal(a.M12, a[0, 1]);
3221+
Assert.Equal(a.M12, a.GetElement(0, 1));
3222+
3223+
Assert.Equal(a.M13, a.X.Z);
3224+
Assert.Equal(a.M13, a[0, 2]);
3225+
Assert.Equal(a.M13, a.GetElement(0, 2));
3226+
3227+
Assert.Equal(a.M14, a.X.W);
3228+
Assert.Equal(a.M14, a[0, 3]);
3229+
Assert.Equal(a.M14, a.GetElement(0, 3));
3230+
3231+
Assert.Equal(a.M21, a.Y.X);
3232+
Assert.Equal(a.M21, a[1, 0]);
3233+
Assert.Equal(a.M21, a.GetElement(1, 0));
3234+
3235+
Assert.Equal(a.M22, a.Y.Y);
3236+
Assert.Equal(a.M22, a[1, 1]);
3237+
Assert.Equal(a.M22, a.GetElement(1, 1));
3238+
3239+
Assert.Equal(a.M23, a.Y.Z);
3240+
Assert.Equal(a.M23, a[1, 2]);
3241+
Assert.Equal(a.M23, a.GetElement(1, 2));
3242+
3243+
Assert.Equal(a.M24, a.Y.W);
3244+
Assert.Equal(a.M24, a[1, 3]);
3245+
Assert.Equal(a.M24, a.GetElement(1, 3));
3246+
3247+
Assert.Equal(a.M31, a.Z.X);
3248+
Assert.Equal(a.M31, a[2, 0]);
3249+
Assert.Equal(a.M31, a.GetElement(2, 0));
3250+
3251+
Assert.Equal(a.M32, a.Z.Y);
3252+
Assert.Equal(a.M32, a[2, 1]);
3253+
Assert.Equal(a.M32, a.GetElement(2, 1));
3254+
3255+
Assert.Equal(a.M33, a.Z.Z);
3256+
Assert.Equal(a.M33, a[2, 2]);
3257+
Assert.Equal(a.M33, a.GetElement(2, 2));
3258+
3259+
Assert.Equal(a.M34, a.Z.W);
3260+
Assert.Equal(a.M34, a[2, 3]);
3261+
Assert.Equal(a.M34, a.GetElement(2, 3));
3262+
3263+
Assert.Equal(a.M41, a.W.X);
3264+
Assert.Equal(a.M41, a[3, 0]);
3265+
Assert.Equal(a.M41, a.GetElement(3, 0));
3266+
3267+
Assert.Equal(a.M42, a.W.Y);
3268+
Assert.Equal(a.M42, a[3, 1]);
3269+
Assert.Equal(a.M42, a.GetElement(3, 1));
3270+
3271+
Assert.Equal(a.M43, a.W.Z);
3272+
Assert.Equal(a.M43, a[3, 2]);
3273+
Assert.Equal(a.M43, a.GetElement(3, 2));
3274+
3275+
Assert.Equal(a.M44, a.W.W);
3276+
Assert.Equal(a.M44, a[3, 3]);
3277+
Assert.Equal(a.M44, a.GetElement(3, 3));
3278+
}
3279+
3280+
[Fact]
3281+
public void Matrix4x4GetRowTest()
3282+
{
3283+
Matrix4x4 a = GenerateTestMatrix();
3284+
3285+
Vector4 vx = new Vector4(a.M11, a.M12, a.M13, a.M14);
3286+
Assert.Equal(vx, a.X);
3287+
Assert.Equal(vx, a[0]);
3288+
Assert.Equal(vx, a.GetRow(0));
3289+
3290+
Vector4 vy = new Vector4(a.M21, a.M22, a.M23, a.M24);
3291+
Assert.Equal(vy, a.Y);
3292+
Assert.Equal(vy, a[1]);
3293+
Assert.Equal(vy, a.GetRow(1));
3294+
3295+
Vector4 vz = new Vector4(a.M31, a.M32, a.M33, a.M34);
3296+
Assert.Equal(vz, a.Z);
3297+
Assert.Equal(vz, a[2]);
3298+
Assert.Equal(vz, a.GetRow(2));
3299+
3300+
Vector4 vw = new Vector4(a.M41, a.M42, a.M43, a.M44);
3301+
Assert.Equal(vw, a.W);
3302+
Assert.Equal(vw, a[3]);
3303+
Assert.Equal(vw, a.GetRow(3));
3304+
}
3305+
3306+
[Fact]
3307+
public void Matrix4x4WithElementTest()
3308+
{
3309+
Matrix4x4 a = Matrix4x4.Identity;
3310+
3311+
a[0, 0] = 11.0f;
3312+
Assert.Equal(11.5f, a.WithElement(0, 0, 11.5f).M11);
3313+
Assert.Equal(11.0f, a.M11);
3314+
3315+
a[0, 1] = 12.0f;
3316+
Assert.Equal(12.5f, a.WithElement(0, 1, 12.5f).M12);
3317+
Assert.Equal(12.0f, a.M12);
3318+
3319+
a[0, 2] = 13.0f;
3320+
Assert.Equal(13.5f, a.WithElement(0, 2, 13.5f).M13);
3321+
Assert.Equal(13.0f, a.M13);
3322+
3323+
a[0, 3] = 14.0f;
3324+
Assert.Equal(14.5f, a.WithElement(0, 3, 14.5f).M14);
3325+
Assert.Equal(14.0f, a.M14);
3326+
3327+
a[1, 0] = 21.0f;
3328+
Assert.Equal(21.5f, a.WithElement(1, 0, 21.5f).M21);
3329+
Assert.Equal(21.0f, a.M21);
3330+
3331+
a[1, 1] = 22.0f;
3332+
Assert.Equal(22.5f, a.WithElement(1, 1, 22.5f).M22);
3333+
Assert.Equal(22.0f, a.M22);
3334+
3335+
a[1, 2] = 23.0f;
3336+
Assert.Equal(23.5f, a.WithElement(1, 2, 23.5f).M23);
3337+
Assert.Equal(23.0f, a.M23);
3338+
3339+
a[1, 3] = 24.0f;
3340+
Assert.Equal(24.5f, a.WithElement(1, 3, 24.5f).M24);
3341+
Assert.Equal(24.0f, a.M24);
3342+
3343+
a[2, 0] = 31.0f;
3344+
Assert.Equal(31.5f, a.WithElement(2, 0, 31.5f).M31);
3345+
Assert.Equal(31.0f, a.M31);
3346+
3347+
a[2, 1] = 32.0f;
3348+
Assert.Equal(32.5f, a.WithElement(2, 1, 32.5f).M32);
3349+
Assert.Equal(32.0f, a.M32);
3350+
3351+
a[2, 2] = 33.0f;
3352+
Assert.Equal(33.5f, a.WithElement(2, 2, 33.5f).M33);
3353+
Assert.Equal(33.0f, a.M33);
3354+
3355+
a[2, 3] = 34.0f;
3356+
Assert.Equal(34.5f, a.WithElement(2, 3, 34.5f).M34);
3357+
Assert.Equal(34.0f, a.M34);
3358+
3359+
a[3, 0] = 41.0f;
3360+
Assert.Equal(41.5f, a.WithElement(3, 0, 41.5f).M41);
3361+
Assert.Equal(41.0f, a.M41);
3362+
3363+
a[3, 1] = 42.0f;
3364+
Assert.Equal(42.5f, a.WithElement(3, 1, 42.5f).M42);
3365+
Assert.Equal(42.0f, a.M42);
3366+
3367+
a[3, 2] = 43.0f;
3368+
Assert.Equal(43.5f, a.WithElement(3, 2, 43.5f).M43);
3369+
Assert.Equal(43.0f, a.M43);
3370+
3371+
a[3, 3] = 44.0f;
3372+
Assert.Equal(44.5f, a.WithElement(3, 3, 44.5f).M44);
3373+
Assert.Equal(44.0f, a.M44);
3374+
}
3375+
3376+
[Fact]
3377+
public void Matrix4x4WithRowTest()
3378+
{
3379+
Matrix4x4 a = Matrix4x4.Identity;
3380+
3381+
a[0] = Vector4.Create(11.0f, 12.0f, 13.0f, 14.0f);
3382+
Assert.Equal(Vector4.Create(11.5f, 12.5f, 13.5f, 14.5f), a.WithRow(0, Vector4.Create(11.5f, 12.5f, 13.5f, 14.5f)).X);
3383+
Assert.Equal(Vector4.Create(11.0f, 12.0f, 13.0f, 14.0f), a.X);
3384+
3385+
a[1] = Vector4.Create(21.0f, 22.0f, 23.0f, 24.0f);
3386+
Assert.Equal(Vector4.Create(21.5f, 22.5f, 23.5f, 24.5f), a.WithRow(1, Vector4.Create(21.5f, 22.5f, 23.5f, 24.5f)).Y);
3387+
Assert.Equal(Vector4.Create(21.0f, 22.0f, 23.0f, 24.0f), a.Y);
3388+
3389+
a[2] = Vector4.Create(31.0f, 32.0f, 33.0f, 34.0f);
3390+
Assert.Equal(Vector4.Create(31.5f, 32.5f, 33.5f, 34.5f), a.WithRow(2, Vector4.Create(31.5f, 32.5f, 33.5f, 34.5f)).Z);
3391+
Assert.Equal(Vector4.Create(31.0f, 32.0f, 33.0f, 34.0f), a.Z);
3392+
3393+
a[3] = Vector4.Create(41.0f, 42.0f, 43.0f, 44.0f);
3394+
Assert.Equal(Vector4.Create(41.5f, 42.5f, 43.5f, 44.5f), a.WithRow(3, Vector4.Create(41.5f, 42.5f, 43.5f, 44.5f)).W);
3395+
Assert.Equal(Vector4.Create(41.0f, 42.0f, 43.0f, 44.0f), a.W);
3396+
}
31713397
}
31723398
}

0 commit comments

Comments
 (0)