191 lines
7.7 KiB
C#
191 lines
7.7 KiB
C#
/*
|
|
* Copyright 2019-2025 Andrey Pokidov <andrey.pokidov@gmail.com>
|
|
*
|
|
* 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 DPMatrixProduct
|
|
{
|
|
public static void Get2x2At2x2(in DPMatrix2x2 left, in DPMatrix2x2 right, out DPMatrix2x2 product)
|
|
{
|
|
double r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1;
|
|
double r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2;
|
|
|
|
double r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1;
|
|
double 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 DPMatrix2x2 left, in DPMatrix3x2 right, out DPMatrix3x2 product)
|
|
{
|
|
double r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1;
|
|
double r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2;
|
|
double r1c3 = left.r1c1 * right.r1c3 + left.r1c2 * right.r2c3;
|
|
|
|
double r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1;
|
|
double r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2;
|
|
double 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 DPMatrix2x3 left, in DPMatrix2x2 right, out DPMatrix2x3 product)
|
|
{
|
|
double r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1;
|
|
double r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2;
|
|
|
|
double r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1;
|
|
double r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2;
|
|
|
|
double r3c1 = left.r3c1 * right.r1c1 + left.r3c2 * right.r2c1;
|
|
double 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 DPMatrix2x3 left, in DPMatrix3x2 right, out DPMatrix3x3 product)
|
|
{
|
|
double r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1;
|
|
double r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2;
|
|
double r1c3 = left.r1c1 * right.r1c3 + left.r1c2 * right.r2c3;
|
|
|
|
double r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1;
|
|
double r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2;
|
|
double r2c3 = left.r2c1 * right.r1c3 + left.r2c2 * right.r2c3;
|
|
|
|
double r3c1 = left.r3c1 * right.r1c1 + left.r3c2 * right.r2c1;
|
|
double r3c2 = left.r3c1 * right.r1c2 + left.r3c2 * right.r2c2;
|
|
double 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 DPMatrix3x2 left, in DPMatrix3x3 right, out DPMatrix3x2 product)
|
|
{
|
|
double r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1 + left.r1c3 * right.r3c1;
|
|
double r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2 + left.r1c3 * right.r3c2;
|
|
double r1c3 = left.r1c1 * right.r1c3 + left.r1c2 * right.r2c3 + left.r1c3 * right.r3c3;
|
|
|
|
double r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1 + left.r2c3 * right.r3c1;
|
|
double r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2 + left.r2c3 * right.r3c2;
|
|
double 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 DPMatrix3x2 left, in DPMatrix2x3 right, out DPMatrix2x2 product)
|
|
{
|
|
double r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1 + left.r1c3 * right.r3c1;
|
|
double r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2 + left.r1c3 * right.r3c2;
|
|
|
|
double r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1 + left.r2c3 * right.r3c1;
|
|
double 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 DPMatrix3x3 left, in DPMatrix2x3 right, out DPMatrix2x3 product)
|
|
{
|
|
double r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1 + left.r1c3 * right.r3c1;
|
|
double r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2 + left.r1c3 * right.r3c2;
|
|
|
|
double r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1 + left.r2c3 * right.r3c1;
|
|
double r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2 + left.r2c3 * right.r3c2;
|
|
|
|
double r3c1 = left.r3c1 * right.r1c1 + left.r3c2 * right.r2c1 + left.r3c3 * right.r3c1;
|
|
double 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 DPMatrix3x3 left, in DPMatrix3x3 right, out DPMatrix3x3 product)
|
|
{
|
|
double r1c1 = left.r1c1 * right.r1c1 + left.r1c2 * right.r2c1 + left.r1c3 * right.r3c1;
|
|
double r1c2 = left.r1c1 * right.r1c2 + left.r1c2 * right.r2c2 + left.r1c3 * right.r3c2;
|
|
double r1c3 = left.r1c1 * right.r1c3 + left.r1c2 * right.r2c3 + left.r1c3 * right.r3c3;
|
|
|
|
double r2c1 = left.r2c1 * right.r1c1 + left.r2c2 * right.r2c1 + left.r2c3 * right.r3c1;
|
|
double r2c2 = left.r2c1 * right.r1c2 + left.r2c2 * right.r2c2 + left.r2c3 * right.r3c2;
|
|
double r2c3 = left.r2c1 * right.r1c3 + left.r2c2 * right.r2c3 + left.r2c3 * right.r3c3;
|
|
|
|
double r3c1 = left.r3c1 * right.r1c1 + left.r3c2 * right.r2c1 + left.r3c3 * right.r3c1;
|
|
double r3c2 = left.r3c1 * right.r1c2 + left.r3c2 * right.r2c2 + left.r3c3 * right.r3c2;
|
|
double 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;
|
|
}
|
|
}
|
|
}
|