/* * 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 Geometry { public class SPMatrixProduct { public static void Get2x2At2x2(in SPMatrix2x2 left, in SPMatrix2x2 right, out SPMatrix2x2 product) { float r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1; float r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2; float r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1; float r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2; product.r1c1 = r1c1; product.r1c2 = r1c2; product.r2c1 = r2c1; product.r2c2 = r2c2; } public static void Get2x2At3x2(in SPMatrix2x2 left, in SPMatrix3x2 right, out SPMatrix3x2 product) { float r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1; float r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2; float r1c3 = left.r1c1 * right.r1c3 + left.r1c2 * right.r2c3; float r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1; float r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2; float r2c3 = left.r2c1 * right.r1c3 + left.r2c2 * right.r2c3; product.r1c1 = r1c1; product.r1c2 = r1c2; product.r1c3 = r1c3; product.r2c1 = r2c1; product.r2c2 = r2c2; product.r2c3 = r2c3; } public static void Get2x3At2x2(in SPMatrix2x3 left, in SPMatrix2x2 right, out SPMatrix2x3 product) { float r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1; float r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2; float r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1; float r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2; float r3c1 = left.r3c1 * right.r1c1 + left.r3c2 * right.r2c1; float r3c2 = left.r3c1 * right.r1c2 + left.r3c2 * right.r2c2; product.r1c1 = r1c1; product.r1c2 = r1c2; product.r2c1 = r2c1; product.r2c2 = r2c2; product.r3c1 = r3c1; product.r3c2 = r3c2; } public static void Get2x3At3x2(in SPMatrix2x3 left, in SPMatrix3x2 right, out SPMatrix3x3 product) { float r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1; float r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2; float r1c3 = left.r1c1 * right.r1c3 + left.r1c2 * right.r2c3; float r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1; float r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2; float r2c3 = left.r2c1 * right.r1c3 + left.r2c2 * right.r2c3; float r3c1 = left.r3c1 * right.r1c1 + left.r3c2 * right.r2c1; float r3c2 = left.r3c1 * right.r1c2 + left.r3c2 * right.r2c2; float r3c3 = left.r3c1 * right.r1c2 + left.r3c2 * right.r2c3; product.r1c1 = r1c1; product.r1c2 = r1c2; product.r1c3 = r1c3; product.r2c1 = r2c1; product.r2c2 = r2c2; product.r2c3 = r2c3; product.r3c1 = r3c1; product.r3c2 = r3c2; product.r3c3 = r3c3; } public static void Get3x2At3x3(in SPMatrix3x2 left, in SPMatrix3x3 right, out SPMatrix3x2 product) { float r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1 + left.r1c3 * right.r3c1; float r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2 + left.r1c3 * right.r3c2; float r1c3 = left.r1c1 * right.r1c3 + left.r1c2 * right.r2c3 + left.r1c3 * right.r3c3; float r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1 + left.r2c3 * right.r3c1; float r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2 + left.r2c3 * right.r3c2; float r2c3 = left.r2c1 * right.r1c3 + left.r2c2 * right.r2c3 + left.r2c3 * right.r3c3; product.r1c1 = r1c1; product.r1c2 = r1c2; product.r1c3 = r1c3; product.r2c1 = r2c1; product.r2c2 = r2c2; product.r2c3 = r2c3; } public static void Get3x2At2x3(in SPMatrix3x2 left, in SPMatrix2x3 right, out SPMatrix2x2 product) { float r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1 + left.r1c3 * right.r3c1; float r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2 + left.r1c3 * right.r3c2; float r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1 + left.r2c3 * right.r3c1; float r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2 + left.r2c3 * right.r3c2; product.r1c1 = r1c1; product.r1c2 = r1c2; product.r2c1 = r2c1; product.r2c2 = r2c2; } public static void Get3x3At2x3(in SPMatrix3x3 left, in SPMatrix2x3 right, out SPMatrix2x3 product) { float r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1 + left.r1c3 * right.r3c1; float r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2 + left.r1c3 * right.r3c2; float r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1 + left.r2c3 * right.r3c1; float r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2 + left.r2c3 * right.r3c2; float r3c1 = left.r3c1 * right.r1c1 + left.r3c2 * right.r2c1 + left.r3c3 * right.r3c1; float r3c2 = left.r3c1 * right.r1c2 + left.r3c2 * right.r2c2 + left.r3c3 * right.r3c2; product.r1c1 = r1c1; product.r1c2 = r1c2; product.r2c1 = r2c1; product.r2c2 = r2c2; product.r3c1 = r3c1; product.r3c2 = r3c2; } public static void Get3x3At3x3(in SPMatrix3x3 left, in SPMatrix3x3 right, out SPMatrix3x3 product) { float r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1 + left.r1c3 * right.r3c1; float r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2 + left.r1c3 * right.r3c2; float r1c3 = left.r1c1 * right.r1c3 + left.r1c2 * right.r2c3 + left.r1c3 * right.r3c3; float r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1 + left.r2c3 * right.r3c1; float r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2 + left.r2c3 * right.r3c2; float r2c3 = left.r2c1 * right.r1c3 + left.r2c2 * right.r2c3 + left.r2c3 * right.r3c3; float r3c1 = left.r3c1 * right.r1c1 + left.r3c2 * right.r2c1 + left.r3c3 * right.r3c1; float r3c2 = left.r3c1 * right.r1c2 + left.r3c2 * right.r2c2 + left.r3c3 * right.r3c2; float r3c3 = left.r3c1 * right.r1c3 + left.r3c2 * right.r2c3 + left.r3c3 * right.r3c3; product.r1c1 = r1c1; product.r1c2 = r1c2; product.r1c3 = r1c3; product.r2c1 = r2c1; product.r2c2 = r2c2; product.r2c3 = r2c3; product.r3c1 = r3c1; product.r3c2 = r3c2; product.r3c3 = r3c3; } } }