Переименование проектов и оптимизация вычислений / Renaming of projects and optimization of computations

This commit is contained in:
Andrey Pokidov 2024-12-04 23:23:44 +07:00
parent 37d86bc4c1
commit 75e5c02609
36 changed files with 177 additions and 379 deletions

View file

@ -3,11 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59 VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BGC", "BGC\BGC.csproj", "{D1869DF0-7B61-4B6F-8C66-6EEF3916FE0A}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicGeometry", "BasicGeometry\BasicGeometry.csproj", "{D1869DF0-7B61-4B6F-8C66-6EEF3916FE0A}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BGCDev", "BGCDev\BGCDev.csproj", "{3D09FF57-02E6-449D-9DE7-0843633FCBA0}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicGeometryDev", "BasicGeometryDev\BasicGeometryDev.csproj", "{3D09FF57-02E6-449D-9DE7-0843633FCBA0}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BGCTest", "BGCTest\BGCTest.csproj", "{51A07B27-43FF-4A12-AEC1-50D32EDA3815}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicGeometryTest", "BasicGeometryTest\BasicGeometryTest.csproj", "{51A07B27-43FF-4A12-AEC1-50D32EDA3815}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution

View file

@ -20,7 +20,7 @@
* Date: 1 Feb 2019 * Date: 1 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public enum AngleUnit public enum AngleUnit
{ {

View file

@ -21,7 +21,7 @@ using System;
* Date: 1 Feb 2019 * Date: 1 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public static class FP32Angle public static class FP32Angle
{ {

View file

@ -4,7 +4,7 @@
* Date: 18 Nov 2024 * Date: 18 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public class FP32Degrees public class FP32Degrees
{ {

View file

@ -21,29 +21,16 @@ using System;
* Date: 10 Feb 2019 * Date: 10 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP32Matrix2x2 public struct FP32Matrix2x2
{ {
public float r1c1, r1c2; public float r1c1 = 0.0f, r1c2 = 0.0f;
public float r2c1 = 0.0f, r2c2 = 0.0f;
public float r2c1, r2c2;
public FP32Matrix2x2()
{
this.r1c1 = 0.0f;
this.r1c2 = 0.0f;
this.r2c1 = 0.0f;
this.r2c2 = 0.0f;
}
public FP32Matrix2x2(float d1, float d2) public FP32Matrix2x2(float d1, float d2)
{ {
this.r1c1 = d1; this.r1c1 = d1;
this.r1c2 = 0.0f;
this.r2c1 = 0.0f;
this.r2c2 = d2; this.r2c2 = d2;
} }
@ -96,11 +83,13 @@ namespace BGC
float r2c1 = -this.r2c1; float r2c1 = -this.r2c1;
float r2c2 = this.r1c1; float r2c2 = this.r1c1;
this.r1c1 = r1c1 / determinant; float multiplier = 1.0f / determinant;
this.r1c2 = r1c2 / determinant;
this.r2c1 = r2c1 / determinant; this.r1c1 = r1c1 * multiplier;
this.r2c2 = r2c2 / determinant; this.r1c2 = r1c2 * multiplier;
this.r2c1 = r2c1 * multiplier;
this.r2c2 = r2c2 * multiplier;
return true; return true;
} }
@ -181,11 +170,13 @@ namespace BGC
float r2c1 = -matrix.r2c1; float r2c1 = -matrix.r2c1;
float r2c2 = matrix.r1c1; float r2c2 = matrix.r1c1;
this.r1c1 = r1c1 / determinant; float multiplier = 1.0f / determinant;
this.r1c2 = r1c2 / determinant;
this.r2c1 = r2c1 / determinant; this.r1c1 = r1c1 * multiplier;
this.r2c2 = r2c2 / determinant; this.r1c2 = r1c2 * multiplier;
this.r2c1 = r2c1 * multiplier;
this.r2c2 = r2c2 * multiplier;
return true; return true;
} }
@ -252,11 +243,7 @@ namespace BGC
public static void Divide(in FP32Matrix2x2 dividend, float divisor, out FP32Matrix2x2 quotient) public static void Divide(in FP32Matrix2x2 dividend, float divisor, out FP32Matrix2x2 quotient)
{ {
quotient.r1c1 = dividend.r1c1 / divisor; Multiply(dividend, 1.0f / divisor, out quotient);
quotient.r1c2 = dividend.r1c2 / divisor;
quotient.r2c1 = dividend.r2c1 / divisor;
quotient.r2c2 = dividend.r2c2 / divisor;
} }
public static void GetRightProduct(in FP32Matrix2x2 matrix, in FP32Vector2 vector, out FP32Vector2 result) public static void GetRightProduct(in FP32Matrix2x2 matrix, in FP32Vector2 vector, out FP32Vector2 result)

View file

@ -20,25 +20,13 @@ using System;
* Author: Andrey Pokidov * Author: Andrey Pokidov
* Date: 11 Nov 2024 * Date: 11 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP32Matrix2x3 public struct FP32Matrix2x3
{ {
public float r1c1, r1c2; public float r1c1 = 0.0f, r1c2 = 0.0f;
public float r2c1, r2c2; public float r2c1 = 0.0f, r2c2 = 0.0f;
public float r3c1, r3c2; public float r3c1 = 0.0f, r3c2 = 0.0f;
public FP32Matrix2x3()
{
this.r1c1 = 0.0f;
this.r1c2 = 0.0f;
this.r2c1 = 0.0f;
this.r2c2 = 0.0f;
this.r3c1 = 0.0f;
this.r3c2 = 0.0f;
}
public FP32Matrix2x3(in FP32Matrix2x3 matrix) public FP32Matrix2x3(in FP32Matrix2x3 matrix)
{ {
@ -230,14 +218,7 @@ namespace BGC
public static void Divide(in FP32Matrix2x3 dividend, float divisor, out FP32Matrix2x3 quotient) public static void Divide(in FP32Matrix2x3 dividend, float divisor, out FP32Matrix2x3 quotient)
{ {
quotient.r1c1 = dividend.r1c1 / divisor; Multiply(dividend, 1.0f / divisor, out quotient);
quotient.r1c2 = dividend.r1c2 / divisor;
quotient.r2c1 = dividend.r2c1 / divisor;
quotient.r2c2 = dividend.r2c2 / divisor;
quotient.r3c1 = dividend.r3c1 / divisor;
quotient.r3c2 = dividend.r3c2 / divisor;
} }
public static void GetRightProduct(in FP32Matrix2x3 matrix, in FP32Vector2 vector, out FP32Vector3 result) public static void GetRightProduct(in FP32Matrix2x3 matrix, in FP32Vector2 vector, out FP32Vector3 result)

View file

@ -18,23 +18,12 @@
* Author: Andrey Pokidov * Author: Andrey Pokidov
* Date: 11 Nov 2024 * Date: 11 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP32Matrix3x2 public struct FP32Matrix3x2
{ {
public float r1c1, r1c2, r1c3; public float r1c1 = 0.0f, r1c2 = 0.0f, r1c3 = 0.0f;
public float r2c1, r2c2, r2c3; public float r2c1 = 0.0f, r2c2 = 0.0f, r2c3 = 0.0f;
public FP32Matrix3x2()
{
this.r1c1 = 0.0f;
this.r1c2 = 0.0f;
this.r1c3 = 0.0f;
this.r2c1 = 0.0f;
this.r2c2 = 0.0f;
this.r2c3 = 0.0f;
}
public FP32Matrix3x2(in FP32Matrix3x2 matrix) public FP32Matrix3x2(in FP32Matrix3x2 matrix)
{ {
@ -213,13 +202,7 @@ namespace BGC
public static void Divide(in FP32Matrix3x2 dividend, float divisor, out FP32Matrix3x2 quotient) public static void Divide(in FP32Matrix3x2 dividend, float divisor, out FP32Matrix3x2 quotient)
{ {
quotient.r1c1 = dividend.r1c1 / divisor; Multiply(dividend, 1.0f / divisor, out quotient);
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 GetRightProduct(in FP32Matrix3x2 matrix, in FP32Vector3 vector, out FP32Vector2 result) public static void GetRightProduct(in FP32Matrix3x2 matrix, in FP32Vector3 vector, out FP32Vector2 result)

View file

@ -21,43 +21,18 @@ using System;
* Date: 10 Feb 2019 * Date: 10 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP32Matrix3x3 public struct FP32Matrix3x3
{ {
public float r1c1, r1c2, r1c3; public float r1c1 = 0.0f, r1c2 = 0.0f, r1c3 = 0.0f;
public float r2c1 = 0.0f, r2c2 = 0.0f, r2c3 = 0.0f;
public float r2c1, r2c2, r2c3; public float r3c1 = 0.0f, r3c2 = 0.0f, r3c3 = 0.0f;
public float r3c1, r3c2, r3c3;
public FP32Matrix3x3()
{
this.r1c1 = 0.0f;
this.r1c2 = 0.0f;
this.r1c3 = 0.0f;
this.r2c1 = 0.0f;
this.r2c2 = 0.0f;
this.r2c3 = 0.0f;
this.r3c1 = 0.0f;
this.r3c2 = 0.0f;
this.r3c3 = 0.0f;
}
public FP32Matrix3x3(float d1, float d2, float d3) public FP32Matrix3x3(float d1, float d2, float d3)
{ {
this.r1c1 = d1; this.r1c1 = d1;
this.r1c2 = 0.0f;
this.r1c3 = 0.0f;
this.r2c1 = 0.0f;
this.r2c2 = d2; this.r2c2 = d2;
this.r2c3 = 0.0f;
this.r3c1 = 0.0f;
this.r3c2 = 0.0f;
this.r3c3 = d3; this.r3c3 = d3;
} }
@ -131,17 +106,19 @@ namespace BGC
float r3c2 = this.r1c2 * this.r3c1 - this.r1c1 * this.r3c2; float r3c2 = this.r1c2 * this.r3c1 - this.r1c1 * this.r3c2;
float r3c3 = this.r1c1 * this.r2c2 - this.r1c2 * this.r2c1; float r3c3 = this.r1c1 * this.r2c2 - this.r1c2 * this.r2c1;
this.r1c1 = r1c1 / determinant; float mutiplier = 1.0f / determinant;
this.r1c2 = r1c2 / determinant;
this.r1c3 = r1c3 / determinant;
this.r2c1 = r2c1 / determinant; this.r1c1 = r1c1 * mutiplier;
this.r2c2 = r2c2 / determinant; this.r1c2 = r1c2 * mutiplier;
this.r2c3 = r2c3 / determinant; this.r1c3 = r1c3 * mutiplier;
this.r3c1 = r3c1 / determinant; this.r2c1 = r2c1 * mutiplier;
this.r3c2 = r3c2 / determinant; this.r2c2 = r2c2 * mutiplier;
this.r3c3 = r3c3 / determinant; this.r2c3 = r2c3 * mutiplier;
this.r3c1 = r3c1 * mutiplier;
this.r3c2 = r3c2 * mutiplier;
this.r3c3 = r3c3 * mutiplier;
return true; return true;
} }
@ -267,17 +244,19 @@ namespace BGC
float r3c2 = matrix.r1c2 * matrix.r3c1 - matrix.r1c1 * matrix.r3c2; float r3c2 = matrix.r1c2 * matrix.r3c1 - matrix.r1c1 * matrix.r3c2;
float r3c3 = matrix.r1c1 * matrix.r2c2 - matrix.r1c2 * matrix.r2c1; float r3c3 = matrix.r1c1 * matrix.r2c2 - matrix.r1c2 * matrix.r2c1;
this.r1c1 = r1c1 / determinant; float mutiplier = 1.0f / determinant;
this.r1c2 = r1c2 / determinant;
this.r1c3 = r1c3 / determinant;
this.r2c1 = r2c1 / determinant; this.r1c1 = r1c1 * mutiplier;
this.r2c2 = r2c2 / determinant; this.r1c2 = r1c2 * mutiplier;
this.r2c3 = r2c3 / determinant; this.r1c3 = r1c3 * mutiplier;
this.r3c1 = r3c1 / determinant; this.r2c1 = r2c1 * mutiplier;
this.r3c2 = r3c2 / determinant; this.r2c2 = r2c2 * mutiplier;
this.r3c3 = r3c3 / determinant; this.r2c3 = r2c3 * mutiplier;
this.r3c1 = r3c1 * mutiplier;
this.r3c2 = r3c2 * mutiplier;
this.r3c3 = r3c3 * mutiplier;
return true; return true;
} }
@ -386,17 +365,7 @@ namespace BGC
public static void Divide(in FP32Matrix3x3 dividend, float divisor, out FP32Matrix3x3 quotient) public static void Divide(in FP32Matrix3x3 dividend, float divisor, out FP32Matrix3x3 quotient)
{ {
quotient.r1c1 = dividend.r1c1 / divisor; Multiply(dividend, 1.0f / divisor, out quotient);
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;
quotient.r3c1 = dividend.r3c1 / divisor;
quotient.r3c2 = dividend.r3c2 / divisor;
quotient.r3c3 = dividend.r3c3 / divisor;
} }
public static void GetRightProduct(in FP32Matrix3x3 matrix, in FP32Vector3 vector, out FP32Vector3 result) public static void GetRightProduct(in FP32Matrix3x3 matrix, in FP32Vector3 vector, out FP32Vector3 result)

View file

@ -20,7 +20,7 @@ using System;
* Author: Andrey Pokidov * Author: Andrey Pokidov
* Date: 11 Nov 2024 * Date: 11 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public class FP32MatrixProduct public class FP32MatrixProduct
{ {

View file

@ -1,10 +1,10 @@
using System; using System;
namespace BGC namespace BasicGeometry
{ {
public struct FP32Quaternion public struct FP32Quaternion
{ {
public float s0, x1, x2, x3; public float s0 = 0.0f, x1 = 0.0f, x2 = 0.0f, x3 = 0.0f;
public FP32Quaternion(float s0, float x1, float x2, float x3) public FP32Quaternion(float s0, float x1, float x2, float x3)
{ {

View file

@ -4,7 +4,7 @@
* Date: 18 Nov 2024 * Date: 18 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public class FP32Radians public class FP32Radians
{ {

View file

@ -21,11 +21,11 @@ using System;
* Date: 2 Feb 2019 * Date: 2 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP32Rotation3 public struct FP32Rotation3
{ {
private float angle; private float angle = 0.0f;
private FP32Vector3 axis; private FP32Vector3 axis;

View file

@ -4,7 +4,7 @@
* Date: 18 Nov 2024 * Date: 18 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public class FP32Turns public class FP32Turns
{ {

View file

@ -1,6 +1,6 @@
using System; using System;
namespace BGC namespace BasicGeometry
{ {
public class FP32Utility public class FP32Utility
{ {

View file

@ -21,14 +21,14 @@ using System;
* Date: 1 Feb 2019 * Date: 1 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP32Vector2 public struct FP32Vector2
{ {
public static readonly FP32Vector2 ZERO = new FP32Vector2(0.0f, 0.0f); public static readonly FP32Vector2 ZERO = new FP32Vector2(0.0f, 0.0f);
public float x1; public float x1 = 0.0f;
public float x2; public float x2 = 0.0f;
public FP32Vector2(float x1, float x2) public FP32Vector2(float x1, float x2)
{ {
@ -157,7 +157,7 @@ namespace BGC
difference.x2 = minuend.x2 - subtrahend.x2; difference.x2 = minuend.x2 - subtrahend.x2;
} }
public static void Muliply(in FP32Vector2 multiplicand, float multiplier, out FP32Vector2 product) public static void Multiply(in FP32Vector2 multiplicand, float multiplier, out FP32Vector2 product)
{ {
product.x1 = multiplicand.x1 * multiplier; product.x1 = multiplicand.x1 * multiplier;
product.x2 = multiplicand.x2 * multiplier; product.x2 = multiplicand.x2 * multiplier;
@ -165,8 +165,7 @@ namespace BGC
public static void Divide(in FP32Vector2 dividend, float divisor, out FP32Vector2 quotient) public static void Divide(in FP32Vector2 dividend, float divisor, out FP32Vector2 quotient)
{ {
quotient.x1 = dividend.x1 / divisor; Multiply(dividend, 1.0f / divisor, out quotient);
quotient.x2 = dividend.x2 / divisor;
} }
public static void GetMean2(in FP32Vector2 vector1, in FP32Vector2 vector2, out FP32Vector2 result) public static void GetMean2(in FP32Vector2 vector1, in FP32Vector2 vector2, out FP32Vector2 result)

View file

@ -21,15 +21,15 @@ using System;
* Date: 1 Feb 2019 * Date: 1 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP32Vector3 public struct FP32Vector3
{ {
public static readonly FP32Vector3 ZERO = new FP32Vector3(0.0f, 0.0f, 0.0f); public static readonly FP32Vector3 ZERO = new FP32Vector3(0.0f, 0.0f, 0.0f);
public float x1; public float x1 = 0.0f;
public float x2; public float x2 = 0.0f;
public float x3; public float x3 = 0.0f;
public FP32Vector3(float x1, float x2, float x3) public FP32Vector3(float x1, float x2, float x3)
{ {
@ -172,7 +172,7 @@ namespace BGC
difference.x3 = minuend.x3 - subtrahend.x3; difference.x3 = minuend.x3 - subtrahend.x3;
} }
public static void Muliply(in FP32Vector3 multiplicand, float multiplier, out FP32Vector3 product) public static void Multiply(in FP32Vector3 multiplicand, float multiplier, out FP32Vector3 product)
{ {
product.x1 = multiplicand.x1 * multiplier; product.x1 = multiplicand.x1 * multiplier;
product.x2 = multiplicand.x2 * multiplier; product.x2 = multiplicand.x2 * multiplier;
@ -181,9 +181,7 @@ namespace BGC
public static void Divide(in FP32Vector3 dividend, float divisor, out FP32Vector3 quotient) public static void Divide(in FP32Vector3 dividend, float divisor, out FP32Vector3 quotient)
{ {
quotient.x1 = dividend.x1 / divisor; Multiply(dividend, 1.0f / divisor, out quotient);
quotient.x2 = dividend.x2 / divisor;
quotient.x3 = dividend.x3 / divisor;
} }
public static void GetMean2(in FP32Vector3 vector1, in FP32Vector3 vector2, out FP32Vector3 result) public static void GetMean2(in FP32Vector3 vector1, in FP32Vector3 vector2, out FP32Vector3 result)

View file

@ -19,22 +19,14 @@
* Date: 20 Oct 2024 * Date: 20 Oct 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP32Versor public struct FP32Versor
{ {
private float s0; private float s0 = 1.0f;
private float x1; private float x1 = 0.0f;
private float x2; private float x2 = 0.0f;
private float x3; private float x3 = 0.0f;
public FP32Versor()
{
this.s0 = 1.0f;
this.x1 = 0.0f;
this.x2 = 0.0f;
this.x3 = 0.0f;
}
public FP32Versor(float s0, float x1, float x2, float x3) public FP32Versor(float s0, float x1, float x2, float x3)
{ {
@ -178,12 +170,6 @@ namespace BGC
if (1.0f - FP32Utility.TWO_EPSYLON <= squareModule && squareModule <= 1.0f + FP32Utility.TWO_EPSYLON) if (1.0f - FP32Utility.TWO_EPSYLON <= squareModule && squareModule <= 1.0f + FP32Utility.TWO_EPSYLON)
{ {
if (-1.0f + FP32Utility.EPSYLON < s0)
{
return;
}
this.Reset();
return; return;
} }
@ -254,18 +240,18 @@ namespace BGC
private void Normalize(float squareModule) private void Normalize(float squareModule)
{ {
if (squareModule <= FP32Utility.SQUARE_EPSYLON || (this.x1 * this.x1 + this.x2 * this.x2 + this.x3 * this.x3) <= FP32Utility.SQUARE_EPSYLON * squareModule) if (squareModule <= FP32Utility.SQUARE_EPSYLON)
{ {
this.Reset(); this.Reset();
return; return;
} }
float module = MathF.Sqrt(squareModule); float multiplier = MathF.Sqrt(1.0f / squareModule);
this.s0 /= module; this.s0 *= multiplier;
this.x1 /= module; this.x1 *= multiplier;
this.x2 /= module; this.x2 *= multiplier;
this.x3 /= module; this.x3 *= multiplier;
} }
public static void Combine(in FP32Versor second, in FP32Versor first, out FP32Versor result) public static void Combine(in FP32Versor second, in FP32Versor first, out FP32Versor result)
@ -282,10 +268,12 @@ namespace BGC
result.x2 = x2; result.x2 = x2;
result.x3 = x3; result.x3 = x3;
if (squareModule < 1.0f - FP32Utility.TWO_EPSYLON || 1.0f + FP32Utility.TWO_EPSYLON < squareModule) if (1.0f - FP32Utility.TWO_EPSYLON <= squareModule && squareModule <= 1.0f + FP32Utility.TWO_EPSYLON)
{ {
result.Normalize(squareModule); return;
} }
result.Normalize(squareModule);
} }
public static void LoadIdle(out FP32Versor versor) public static void LoadIdle(out FP32Versor versor)
@ -307,12 +295,6 @@ namespace BGC
if (1.0f - FP32Utility.TWO_EPSYLON <= squareModule && squareModule <= 1.0f + FP32Utility.TWO_EPSYLON) if (1.0f - FP32Utility.TWO_EPSYLON <= squareModule && squareModule <= 1.0f + FP32Utility.TWO_EPSYLON)
{ {
if (-1.0f + FP32Utility.EPSYLON < s0)
{
return;
}
versor.Reset();
return; return;
} }

View file

@ -21,7 +21,7 @@ using System;
* Date: 1 Feb 2019 * Date: 1 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public static class FP64Angle public static class FP64Angle
{ {

View file

@ -4,7 +4,7 @@
* Date: 18 Nov 2024 * Date: 18 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public class FP64Degrees public class FP64Degrees
{ {

View file

@ -21,29 +21,16 @@ using System;
* Date: 10 Feb 2019 * Date: 10 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP64Matrix2x2 public struct FP64Matrix2x2
{ {
public double r1c1, r1c2; public double r1c1 = 0.0, r1c2 = 0.0;
public double r2c1 = 0.0, r2c2 = 0.0;
public double r2c1, r2c2;
public FP64Matrix2x2()
{
this.r1c1 = 0.0;
this.r1c2 = 0.0;
this.r2c1 = 0.0;
this.r2c2 = 0.0;
}
public FP64Matrix2x2(double d1, double d2) public FP64Matrix2x2(double d1, double d2)
{ {
this.r1c1 = d1; this.r1c1 = d1;
this.r1c2 = 0.0;
this.r2c1 = 0.0;
this.r2c2 = d2; this.r2c2 = d2;
} }
@ -96,11 +83,13 @@ namespace BGC
double r2c1 = -this.r2c1; double r2c1 = -this.r2c1;
double r2c2 = this.r1c1; double r2c2 = this.r1c1;
this.r1c1 = r1c1 / determinant; double multiplier = 1.0 / determinant;
this.r1c2 = r1c2 / determinant;
this.r2c1 = r2c1 / determinant; this.r1c1 = r1c1 * multiplier;
this.r2c2 = r2c2 / determinant; this.r1c2 = r1c2 * multiplier;
this.r2c1 = r2c1 * multiplier;
this.r2c2 = r2c2 * multiplier;
return true; return true;
} }
@ -181,11 +170,13 @@ namespace BGC
double r2c1 = -matrix.r2c1; double r2c1 = -matrix.r2c1;
double r2c2 = matrix.r1c1; double r2c2 = matrix.r1c1;
this.r1c1 = r1c1 / determinant; double multiplier = 1.0 / determinant;
this.r1c2 = r1c2 / determinant;
this.r2c1 = r2c1 / determinant; this.r1c1 = r1c1 * multiplier;
this.r2c2 = r2c2 / determinant; this.r1c2 = r1c2 * multiplier;
this.r2c1 = r2c1 * multiplier;
this.r2c2 = r2c2 * multiplier;
return true; return true;
} }
@ -252,11 +243,7 @@ namespace BGC
public static void Divide(in FP64Matrix2x2 dividend, double divisor, out FP64Matrix2x2 quotient) public static void Divide(in FP64Matrix2x2 dividend, double divisor, out FP64Matrix2x2 quotient)
{ {
quotient.r1c1 = dividend.r1c1 / divisor; Multiply(dividend, 1.0 / divisor, out quotient);
quotient.r1c2 = dividend.r1c2 / divisor;
quotient.r2c1 = dividend.r2c1 / divisor;
quotient.r2c2 = dividend.r2c2 / divisor;
} }
public static void GetRightProduct(in FP64Matrix2x2 matrix, in FP64Vector2 vector, out FP64Vector2 result) public static void GetRightProduct(in FP64Matrix2x2 matrix, in FP64Vector2 vector, out FP64Vector2 result)

View file

@ -20,25 +20,13 @@ using System;
* Author: Andrey Pokidov * Author: Andrey Pokidov
* Date: 11 Nov 2024 * Date: 11 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP64Matrix2x3 public struct FP64Matrix2x3
{ {
public double r1c1, r1c2; public double r1c1 = 0.0, r1c2 = 0.0;
public double r2c1, r2c2; public double r2c1 = 0.0, r2c2 = 0.0;
public double r3c1, r3c2; public double r3c1 = 0.0, r3c2 = 0.0;
public FP64Matrix2x3()
{
this.r1c1 = 0.0;
this.r1c2 = 0.0;
this.r2c1 = 0.0;
this.r2c2 = 0.0;
this.r3c1 = 0.0;
this.r3c2 = 0.0;
}
public FP64Matrix2x3(in FP64Matrix2x3 matrix) public FP64Matrix2x3(in FP64Matrix2x3 matrix)
{ {
@ -230,14 +218,7 @@ namespace BGC
public static void Divide(in FP64Matrix2x3 dividend, double divisor, out FP64Matrix2x3 quotient) public static void Divide(in FP64Matrix2x3 dividend, double divisor, out FP64Matrix2x3 quotient)
{ {
quotient.r1c1 = dividend.r1c1 / divisor; Multiply(dividend, 1.0 / divisor, out quotient);
quotient.r1c2 = dividend.r1c2 / divisor;
quotient.r2c1 = dividend.r2c1 / divisor;
quotient.r2c2 = dividend.r2c2 / divisor;
quotient.r3c1 = dividend.r3c1 / divisor;
quotient.r3c2 = dividend.r3c2 / divisor;
} }
public static void GetRightProduct(in FP64Matrix2x3 matrix, in FP64Vector2 vector, out FP64Vector3 result) public static void GetRightProduct(in FP64Matrix2x3 matrix, in FP64Vector2 vector, out FP64Vector3 result)

View file

@ -20,23 +20,12 @@ using System;
* Author: Andrey Pokidov * Author: Andrey Pokidov
* Date: 11 Nov 2024 * Date: 11 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP64Matrix3x2 public struct FP64Matrix3x2
{ {
public double r1c1, r1c2, r1c3; public double r1c1 = 0.0, r1c2 = 0.0, r1c3 = 0.0;
public double r2c1, r2c2, r2c3; public double r2c1 = 0.0, r2c2 = 0.0, r2c3 = 0.0;
public FP64Matrix3x2()
{
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 FP64Matrix3x2(in FP64Matrix3x2 matrix) public FP64Matrix3x2(in FP64Matrix3x2 matrix)
{ {
@ -216,13 +205,7 @@ namespace BGC
public static void Divide(in FP64Matrix3x2 dividend, double divisor, out FP64Matrix3x2 quotient) public static void Divide(in FP64Matrix3x2 dividend, double divisor, out FP64Matrix3x2 quotient)
{ {
quotient.r1c1 = dividend.r1c1 / divisor; Multiply(dividend, 1.0 / divisor, out quotient);
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 GetRightProduct(in FP64Matrix3x2 matrix, in FP64Vector3 vector, out FP64Vector2 result) public static void GetRightProduct(in FP64Matrix3x2 matrix, in FP64Vector3 vector, out FP64Vector2 result)

View file

@ -21,43 +21,18 @@ using System;
* Date: 10 Feb 2019 * Date: 10 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP64Matrix3x3 public struct FP64Matrix3x3
{ {
public double r1c1, r1c2, r1c3; public double r1c1 = 0.0, r1c2 = 0.0, r1c3 = 0.0;
public double r2c1 = 0.0, r2c2 = 0.0, r2c3 = 0.0;
public double r2c1, r2c2, r2c3; public double r3c1 = 0.0, r3c2 = 0.0, r3c3 = 0.0;
public double r3c1, r3c2, r3c3;
public FP64Matrix3x3()
{
this.r1c1 = 0.0;
this.r1c2 = 0.0;
this.r1c3 = 0.0;
this.r2c1 = 0.0;
this.r2c2 = 0.0;
this.r2c3 = 0.0;
this.r3c1 = 0.0;
this.r3c2 = 0.0;
this.r3c3 = 0.0;
}
public FP64Matrix3x3(double d1, double d2, double d3) public FP64Matrix3x3(double d1, double d2, double d3)
{ {
this.r1c1 = d1; this.r1c1 = d1;
this.r1c2 = 0.0;
this.r1c3 = 0.0;
this.r2c1 = 0.0;
this.r2c2 = d2; this.r2c2 = d2;
this.r2c3 = 0.0;
this.r3c1 = 0.0;
this.r3c2 = 0.0;
this.r3c3 = d3; this.r3c3 = d3;
} }
@ -131,17 +106,19 @@ namespace BGC
double r3c2 = this.r1c2 * this.r3c1 - this.r1c1 * this.r3c2; double r3c2 = this.r1c2 * this.r3c1 - this.r1c1 * this.r3c2;
double r3c3 = this.r1c1 * this.r2c2 - this.r1c2 * this.r2c1; double r3c3 = this.r1c1 * this.r2c2 - this.r1c2 * this.r2c1;
this.r1c1 = r1c1 / determinant; double mutiplier = 1.0 / determinant;
this.r1c2 = r1c2 / determinant;
this.r1c3 = r1c3 / determinant;
this.r2c1 = r2c1 / determinant; this.r1c1 = r1c1 * mutiplier;
this.r2c2 = r2c2 / determinant; this.r1c2 = r1c2 * mutiplier;
this.r2c3 = r2c3 / determinant; this.r1c3 = r1c3 * mutiplier;
this.r3c1 = r3c1 / determinant; this.r2c1 = r2c1 * mutiplier;
this.r3c2 = r3c2 / determinant; this.r2c2 = r2c2 * mutiplier;
this.r3c3 = r3c3 / determinant; this.r2c3 = r2c3 * mutiplier;
this.r3c1 = r3c1 * mutiplier;
this.r3c2 = r3c2 * mutiplier;
this.r3c3 = r3c3 * mutiplier;
return true; return true;
} }
@ -263,17 +240,19 @@ namespace BGC
double r3c2 = matrix.r1c2 * matrix.r3c1 - matrix.r1c1 * matrix.r3c2; double r3c2 = matrix.r1c2 * matrix.r3c1 - matrix.r1c1 * matrix.r3c2;
double r3c3 = matrix.r1c1 * matrix.r2c2 - matrix.r1c2 * matrix.r2c1; double r3c3 = matrix.r1c1 * matrix.r2c2 - matrix.r1c2 * matrix.r2c1;
this.r1c1 = r1c1 / determinant; double mutiplier = 1.0 / determinant;
this.r1c2 = r1c2 / determinant;
this.r1c3 = r1c3 / determinant;
this.r2c1 = r2c1 / determinant; this.r1c1 = r1c1 * mutiplier;
this.r2c2 = r2c2 / determinant; this.r1c2 = r1c2 * mutiplier;
this.r2c3 = r2c3 / determinant; this.r1c3 = r1c3 * mutiplier;
this.r3c1 = r3c1 / determinant; this.r2c1 = r2c1 * mutiplier;
this.r3c2 = r3c2 / determinant; this.r2c2 = r2c2 * mutiplier;
this.r3c3 = r3c3 / determinant; this.r2c3 = r2c3 * mutiplier;
this.r3c1 = r3c1 * mutiplier;
this.r3c2 = r3c2 * mutiplier;
this.r3c3 = r3c3 * mutiplier;
return true; return true;
} }
@ -382,17 +361,7 @@ namespace BGC
public static void Divide(in FP64Matrix3x3 dividend, double divisor, out FP64Matrix3x3 quotient) public static void Divide(in FP64Matrix3x3 dividend, double divisor, out FP64Matrix3x3 quotient)
{ {
quotient.r1c1 = dividend.r1c1 / divisor; Multiply(dividend, 1.0 / divisor, out quotient);
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;
quotient.r3c1 = dividend.r3c1 / divisor;
quotient.r3c2 = dividend.r3c2 / divisor;
quotient.r3c3 = dividend.r3c3 / divisor;
} }
public static void GetRightProduct(in FP64Matrix3x3 matrix, in FP64Vector3 vector, out FP64Vector3 result) public static void GetRightProduct(in FP64Matrix3x3 matrix, in FP64Vector3 vector, out FP64Vector3 result)

View file

@ -20,7 +20,7 @@ using System;
* Author: Andrey Pokidov * Author: Andrey Pokidov
* Date: 11 Nov 2024 * Date: 11 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public class FP64MatrixProduct public class FP64MatrixProduct
{ {

View file

@ -1,11 +1,11 @@
using System; using System;
using System.Numerics; using System.Numerics;
namespace BGC namespace BasicGeometry
{ {
public struct FP64Quaternion public struct FP64Quaternion
{ {
public double s0, x1, x2, x3; public double s0 = 0.0, x1 = 0.0, x2 = 0.0, x3 = 0.0;
public FP64Quaternion(double s0, double x1, double x2, double x3) public FP64Quaternion(double s0, double x1, double x2, double x3)
{ {

View file

@ -4,7 +4,7 @@
* Date: 18 Nov 2024 * Date: 18 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public class FP64Radians public class FP64Radians
{ {

View file

@ -4,7 +4,7 @@
* Date: 18 Nov 2024 * Date: 18 Nov 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public class FP64Turns public class FP64Turns
{ {

View file

@ -1,6 +1,6 @@
using System; using System;
namespace BGC namespace BasicGeometry
{ {
public class FP64Utility public class FP64Utility
{ {

View file

@ -21,14 +21,14 @@ using System;
* Date: 1 Feb 2019 * Date: 1 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP64Vector2 public struct FP64Vector2
{ {
public static readonly FP64Vector2 ZERO = new FP64Vector2(0.0, 0.0); public static readonly FP64Vector2 ZERO = new FP64Vector2(0.0, 0.0);
public double x1; public double x1 = 0.0;
public double x2; public double x2 = 0.0;
public FP64Vector2(double x1, double x2) public FP64Vector2(double x1, double x2)
{ {
@ -157,7 +157,7 @@ namespace BGC
difference.x2 = minuend.x2 - subtrahend.x2; difference.x2 = minuend.x2 - subtrahend.x2;
} }
public static void Muliply(in FP64Vector2 multiplicand, double multiplier, out FP64Vector2 product) public static void Multiply(in FP64Vector2 multiplicand, double multiplier, out FP64Vector2 product)
{ {
product.x1 = multiplicand.x1 * multiplier; product.x1 = multiplicand.x1 * multiplier;
product.x2 = multiplicand.x2 * multiplier; product.x2 = multiplicand.x2 * multiplier;
@ -165,8 +165,7 @@ namespace BGC
public static void Divide(in FP64Vector2 dividend, double divisor, out FP64Vector2 quotient) public static void Divide(in FP64Vector2 dividend, double divisor, out FP64Vector2 quotient)
{ {
quotient.x1 = dividend.x1 / divisor; Multiply(dividend, 1.0 / divisor, out quotient);
quotient.x2 = dividend.x2 / divisor;
} }
public static void GetMean2(in FP64Vector2 vector1, in FP64Vector2 vector2, out FP64Vector2 result) public static void GetMean2(in FP64Vector2 vector1, in FP64Vector2 vector2, out FP64Vector2 result)

View file

@ -21,15 +21,15 @@ using System;
* Date: 1 Feb 2019 * Date: 1 Feb 2019
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP64Vector3 public struct FP64Vector3
{ {
public static readonly FP64Vector3 ZERO = new FP64Vector3(0.0, 0.0, 0.0); public static readonly FP64Vector3 ZERO = new FP64Vector3(0.0, 0.0, 0.0);
public double x1; public double x1 = 0.0;
public double x2; public double x2 = 0.0;
public double x3; public double x3 = 0.0;
public FP64Vector3(double x1, double x2, double x3) public FP64Vector3(double x1, double x2, double x3)
{ {
@ -172,7 +172,7 @@ namespace BGC
difference.x3 = minuend.x3 - subtrahend.x3; difference.x3 = minuend.x3 - subtrahend.x3;
} }
public static void Muliply(in FP64Vector3 multiplicand, double multiplier, out FP64Vector3 product) public static void Multiply(in FP64Vector3 multiplicand, double multiplier, out FP64Vector3 product)
{ {
product.x1 = multiplicand.x1 * multiplier; product.x1 = multiplicand.x1 * multiplier;
product.x2 = multiplicand.x2 * multiplier; product.x2 = multiplicand.x2 * multiplier;
@ -181,9 +181,7 @@ namespace BGC
public static void Divide(in FP64Vector3 dividend, double divisor, out FP64Vector3 quotient) public static void Divide(in FP64Vector3 dividend, double divisor, out FP64Vector3 quotient)
{ {
quotient.x1 = dividend.x1 / divisor; Multiply(dividend, 1.0 / divisor, out quotient);
quotient.x2 = dividend.x2 / divisor;
quotient.x3 = dividend.x3 / divisor;
} }
public static void GetMean2(in FP64Vector3 vector1, in FP64Vector3 vector2, out FP64Vector3 result) public static void GetMean2(in FP64Vector3 vector1, in FP64Vector3 vector2, out FP64Vector3 result)

View file

@ -20,22 +20,14 @@
* Date: 20 Oct 2024 * Date: 20 Oct 2024
*/ */
namespace BGC namespace BasicGeometry
{ {
public struct FP64Versor public struct FP64Versor
{ {
private double s0; private double s0 = 1.0;
private double x1; private double x1 = 0.0;
private double x2; private double x2 = 0.0;
private double x3; private double x3 = 0.0;
public FP64Versor()
{
this.s0 = 1.0;
this.x1 = 0.0;
this.x2 = 0.0;
this.x3 = 0.0;
}
public FP64Versor(double s0, double x1, double x2, double x3) public FP64Versor(double s0, double x1, double x2, double x3)
{ {
@ -182,12 +174,6 @@ namespace BGC
if (1.0 - FP64Utility.TWO_EPSYLON <= squareModule && squareModule <= 1.0 + FP64Utility.TWO_EPSYLON) if (1.0 - FP64Utility.TWO_EPSYLON <= squareModule && squareModule <= 1.0 + FP64Utility.TWO_EPSYLON)
{ {
if (-1.0 + FP64Utility.EPSYLON < s0)
{
return;
}
this.Reset();
return; return;
} }
@ -290,10 +276,12 @@ namespace BGC
result.x2 = x2; result.x2 = x2;
result.x3 = x3; result.x3 = x3;
if (squareModule < 1.0 - FP64Utility.TWO_EPSYLON || 1.0 + FP64Utility.TWO_EPSYLON < squareModule) if (1.0 - FP64Utility.TWO_EPSYLON <= squareModule && squareModule <= 1.0 + FP64Utility.TWO_EPSYLON)
{ {
result.Normalize(squareModule); return;
} }
result.Normalize(squareModule);
} }
public static void LoadIdle(out FP64Versor versor) public static void LoadIdle(out FP64Versor versor)
@ -315,12 +303,6 @@ namespace BGC
if (1.0 - FP64Utility.TWO_EPSYLON <= squareModule && squareModule <= 1.0 + FP64Utility.TWO_EPSYLON) if (1.0 - FP64Utility.TWO_EPSYLON <= squareModule && squareModule <= 1.0 + FP64Utility.TWO_EPSYLON)
{ {
if (-1.0 + FP64Utility.EPSYLON < s0)
{
return;
}
versor.Reset();
return; return;
} }

View file

@ -8,7 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\BGC\BGC.csproj" /> <ProjectReference Include="..\BasicGeometry\BasicGeometry.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -2,7 +2,7 @@
using System; using System;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using BGC; using BasicGeometry;
public static class Program public static class Program
{ {

View file

@ -12,7 +12,7 @@
<PackageReference Include="MSTest.TestAdapter" Version="2.2.7" /> <PackageReference Include="MSTest.TestAdapter" Version="2.2.7" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.7" /> <PackageReference Include="MSTest.TestFramework" Version="2.2.7" />
<PackageReference Include="coverlet.collector" Version="3.1.0" /> <PackageReference Include="coverlet.collector" Version="3.1.0" />
<ProjectReference Include="..\BGC\BGC.csproj" /> <ProjectReference Include="..\BasicGeometry\BasicGeometry.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -3,9 +3,9 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
using System; using System;
using System.IO; using System.IO;
using BGC; using BasicGeometry;
namespace BGCTest namespace BasicGeometryTest
{ {
[TestClass] [TestClass]
public class FP32Vector2Test public class FP32Vector2Test