/* * Copyright 2019-2025 Andrey Pokidov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; /* * Author: Andrey Pokidov * Date: 11 Nov 2024 */ namespace BGC { public struct F64Matrix3x2 { public double r1c1, r1c2, r1c3; public double r2c1, r2c2, r2c3; public F64Matrix3x2() { this.r1c1 = 0.0; this.r1c2 = 0.0; this.r1c3 = 0.0; this.r2c1 = 0.0; this.r2c2 = 0.0; this.r2c3 = 0.0; } public F64Matrix3x2(in F64Matrix3x2 matrix) { this.r1c1 = matrix.r1c1; this.r1c2 = matrix.r1c2; this.r1c3 = matrix.r1c3; this.r2c1 = matrix.r2c1; this.r2c2 = matrix.r2c2; this.r2c3 = matrix.r2c3; } public F64Matrix3x2(in F32Matrix3x2 matrix) { this.r1c1 = matrix.r1c1; this.r1c2 = matrix.r1c2; this.r1c3 = matrix.r1c3; this.r2c1 = matrix.r2c1; this.r2c2 = matrix.r2c2; this.r2c3 = matrix.r2c3; } public F64Matrix3x2(in F64Matrix2x3 matrix) { this.r1c1 = matrix.r1c1; this.r1c2 = matrix.r2c1; this.r1c3 = matrix.r3c1; this.r2c1 = matrix.r1c2; this.r2c2 = matrix.r2c2; this.r2c3 = matrix.r2c2; } public F64Matrix3x2(in F32Matrix2x3 matrix) { this.r1c1 = matrix.r1c1; this.r1c2 = matrix.r2c1; this.r1c3 = matrix.r3c1; this.r2c1 = matrix.r1c2; this.r2c2 = matrix.r2c2; this.r2c3 = matrix.r2c2; } public void Reset() { this.r1c1 = 0.0; this.r1c2 = 0.0; this.r1c3 = 0.0; this.r2c1 = 0.0; this.r2c2 = 0.0; this.r2c3 = 0.0; } public void SetValues(in F64Matrix3x2 matrix) { this.r1c1 = matrix.r1c1; this.r1c2 = matrix.r1c2; this.r1c3 = matrix.r1c3; this.r2c1 = matrix.r2c1; this.r2c2 = matrix.r2c2; this.r2c3 = matrix.r2c3; } public void SetValues(in F32Matrix3x2 matrix) { this.r1c1 = matrix.r1c1; this.r1c2 = matrix.r1c2; this.r1c3 = matrix.r1c3; this.r2c1 = matrix.r2c1; this.r2c2 = matrix.r2c2; this.r2c3 = matrix.r2c3; } public void SetTransposed(in F64Matrix2x3 matrix) { this.r1c1 = matrix.r1c1; this.r1c2 = matrix.r2c1; this.r1c3 = matrix.r3c1; this.r2c1 = matrix.r1c2; this.r2c2 = matrix.r2c2; this.r2c3 = matrix.r2c2; } public void SetTransposed(in F32Matrix2x3 matrix) { this.r1c1 = matrix.r1c1; this.r1c2 = matrix.r2c1; this.r1c3 = matrix.r3c1; this.r2c1 = matrix.r1c2; this.r2c2 = matrix.r2c2; this.r2c3 = matrix.r2c2; } public void SetRow1(double c1, double c2, double c3) { this.r1c1 = c1; this.r1c2 = c2; this.r1c3 = c3; } public void SetRow2(double c1, double c2, double c3) { this.r2c1 = c1; this.r2c2 = c2; this.r2c3 = c3; } public void SetColumn1(double r1, double r2) { this.r1c1 = r1; this.r2c1 = r2; } public void SetColumn2(double r1, double r2) { this.r1c2 = r1; this.r2c2 = r2; } public void SetColumn3(double r1, double r2) { this.r1c3 = r1; this.r2c3 = r2; } public static void Add(in F64Matrix3x2 matrix1, in F64Matrix3x2 matrix2, out F64Matrix3x2 sum) { sum.r1c1 = matrix1.r1c1 + matrix2.r1c1; sum.r1c2 = matrix1.r1c2 + matrix2.r1c2; sum.r1c3 = matrix1.r1c3 + matrix2.r1c3; sum.r2c1 = matrix1.r2c1 + matrix2.r2c1; sum.r2c2 = matrix1.r2c2 + matrix2.r2c2; sum.r2c3 = matrix1.r2c3 + matrix2.r2c3; } public static void Subtract(in F64Matrix3x2 minuend, in F64Matrix3x2 subtrahend, out F64Matrix3x2 difference) { difference.r1c1 = minuend.r1c1 - subtrahend.r1c1; difference.r1c2 = minuend.r1c2 - subtrahend.r1c2; difference.r1c3 = minuend.r1c3 - subtrahend.r1c3; difference.r2c1 = minuend.r2c1 - subtrahend.r2c1; difference.r2c2 = minuend.r2c2 - subtrahend.r2c2; difference.r2c3 = minuend.r2c3 - subtrahend.r2c3; } public static void Multiply(in F64Matrix3x2 multiplicand, double multiplier, out F64Matrix3x2 product) { product.r1c1 = multiplicand.r1c1 * multiplier; product.r1c2 = multiplicand.r1c2 * multiplier; product.r1c3 = multiplicand.r1c3 * multiplier; product.r2c1 = multiplicand.r2c1 * multiplier; product.r2c2 = multiplicand.r2c2 * multiplier; product.r2c3 = multiplicand.r2c3 * multiplier; } public static void Divide(in F64Matrix3x2 dividend, double divisor, out F64Matrix3x2 quotient) { quotient.r1c1 = dividend.r1c1 / divisor; quotient.r1c2 = dividend.r1c2 / divisor; quotient.r1c3 = dividend.r1c3 / divisor; quotient.r2c1 = dividend.r2c1 / divisor; quotient.r2c2 = dividend.r2c2 / divisor; quotient.r2c3 = dividend.r2c3 / divisor; } public static void GetWeightedSum2( double weight1, in F64Matrix3x2 matrix1, double weight2, in F64Matrix3x2 matrix2, out F64Matrix3x2 sum) { sum.r1c1 = matrix1.r1c1 * weight1 + matrix2.r1c1 * weight2; sum.r1c2 = matrix1.r1c2 * weight1 + matrix2.r1c2 * weight2; sum.r1c3 = matrix1.r1c3 * weight1 + matrix2.r1c3 * weight2; sum.r2c1 = matrix1.r2c1 * weight1 + matrix2.r2c1 * weight2; sum.r2c2 = matrix1.r2c2 * weight1 + matrix2.r2c2 * weight2; sum.r2c3 = matrix1.r2c3 * weight1 + matrix2.r2c3 * weight2; } public static void GetWeightedSum3( double weight1, in F64Matrix3x2 matrix1, double weight2, in F64Matrix3x2 matrix2, double weight3, in F64Matrix3x2 matrix3, out F64Matrix3x2 sum) { sum.r1c1 = matrix1.r1c1 * weight1 + matrix2.r1c1 * weight2 + matrix3.r1c1 * weight3; sum.r1c2 = matrix1.r1c2 * weight1 + matrix2.r1c2 * weight2 + matrix3.r1c2 * weight3; sum.r1c3 = matrix1.r1c3 * weight1 + matrix2.r1c3 * weight2 + matrix3.r1c3 * weight3; sum.r2c1 = matrix1.r2c1 * weight1 + matrix2.r2c1 * weight2 + matrix3.r2c1 * weight3; sum.r2c2 = matrix1.r2c2 * weight1 + matrix2.r2c2 * weight2 + matrix3.r2c2 * weight3; sum.r2c3 = matrix1.r2c3 * weight1 + matrix2.r2c3 * weight2 + matrix3.r2c3 * weight3; } public static void GetWeightedSum4( double weight1, in F64Matrix3x2 matrix1, double weight2, in F64Matrix3x2 matrix2, double weight3, in F64Matrix3x2 matrix3, double weight4, in F64Matrix3x2 matrix4, out F64Matrix3x2 sum) { sum.r1c1 = (matrix1.r1c1 * weight1 + matrix2.r1c1 * weight2) + (matrix3.r1c1 * weight3 + matrix4.r1c1 * weight4); sum.r1c2 = (matrix1.r1c2 * weight1 + matrix2.r1c2 * weight2) + (matrix3.r1c2 * weight3 + matrix4.r1c2 * weight4); sum.r1c3 = (matrix1.r1c3 * weight1 + matrix2.r1c3 * weight2) + (matrix3.r1c3 * weight3 + matrix4.r1c3 * weight4); sum.r2c1 = (matrix1.r2c1 * weight1 + matrix2.r2c1 * weight2) + (matrix3.r2c1 * weight3 + matrix4.r2c1 * weight4); sum.r2c2 = (matrix1.r2c2 * weight1 + matrix2.r2c2 * weight2) + (matrix3.r2c2 * weight3 + matrix4.r2c2 * weight4); sum.r2c3 = (matrix1.r2c3 * weight1 + matrix2.r2c3 * weight2) + (matrix3.r2c3 * weight3 + matrix4.r2c3 * weight4); } public static void GetWeightedSum5( double weight1, in F64Matrix3x2 matrix1, double weight2, in F64Matrix3x2 matrix2, double weight3, in F64Matrix3x2 matrix3, double weight4, in F64Matrix3x2 matrix4, double weight5, in F64Matrix3x2 matrix5, out F64Matrix3x2 sum) { sum.r1c1 = (matrix1.r1c1 * weight1 + matrix2.r1c1 * weight2) + (matrix3.r1c1 * weight3 + matrix4.r1c1 * weight4) + matrix5.r1c1 * weight5; sum.r1c2 = (matrix1.r1c2 * weight1 + matrix2.r1c2 * weight2) + (matrix3.r1c2 * weight3 + matrix4.r1c2 * weight4) + matrix5.r1c2 * weight5; sum.r1c3 = (matrix1.r1c3 * weight1 + matrix2.r1c3 * weight2) + (matrix3.r1c3 * weight3 + matrix4.r1c3 * weight4) + matrix5.r1c3 * weight5; sum.r2c1 = (matrix1.r2c1 * weight1 + matrix2.r2c1 * weight2) + (matrix3.r2c1 * weight3 + matrix4.r2c1 * weight4) + matrix5.r2c1 * weight5; sum.r2c2 = (matrix1.r2c2 * weight1 + matrix2.r2c2 * weight2) + (matrix3.r2c2 * weight3 + matrix4.r2c2 * weight4) + matrix5.r2c2 * weight5; sum.r2c3 = (matrix1.r2c3 * weight1 + matrix2.r2c3 * weight2) + (matrix3.r2c3 * weight3 + matrix4.r2c3 * weight4) + matrix5.r2c3 * weight5; } public static void GetRightProduct(in F64Matrix3x2 matrix, in F64Vector3 vector, out F64Vector2 result) { result.x1 = matrix.r1c1 * vector.x1 + matrix.r1c2 * vector.x2 + matrix.r1c3 * vector.x3; result.x2 = matrix.r2c1 * vector.x1 + matrix.r2c2 * vector.x2 + matrix.r2c3 * vector.x3; } public static void GetLeftProduct(in F64Vector2 vector, in F64Matrix3x2 matrix, out F64Vector3 result) { result.x1 = vector.x1 * matrix.r1c1 + vector.x2 * matrix.r2c1; result.x2 = vector.x1 * matrix.r1c2 + vector.x2 * matrix.r2c2; result.x3 = vector.x1 * matrix.r1c3 + vector.x2 * matrix.r2c3; } } }