Добавьте файлы проекта.

This commit is contained in:
palex
2026-01-06 02:07:18 +03:00
parent 153b9675e3
commit 8e4b375e80
109 changed files with 10817 additions and 0 deletions

242
Geometry/Plane.cs Normal file
View File

@@ -0,0 +1,242 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Math;
namespace Geo
{
[Serializable]
public class Plane
{
double a;
double b;
double c;
double d;
double gammaRad;
double gammaDeg;
public double A { get => a; set { a = value; CalcPlane(); } }
public double B { get => b; set { b = value; CalcPlane(); } }
public double C { get => c; set { c = value; CalcPlane(); } }
public double D { get => d; set { d = value; CalcPlane(); } }
public double AlfaRad { get; private set; }
public double BetaRad { get; private set; }
public double GammaRad { get => gammaRad; set { gammaRad = value; RadToDeg(); } }
public double AlfaDeg { get; private set; }
public double BetaDeg { get; private set; }
public double GammaDeg { get => gammaDeg; set { gammaDeg = value; DegToRad(); } }
public Matrix MrAlfa { get; private set; }
public Matrix MrBeta { get; private set; }
public Matrix MrGamma { get; private set; }
public Vector3d X1 { get; private set; }
public Vector3d Y1 { get; private set; }
public Vector3d Z1 { get; private set; }
public Vector3d Normal { get; private set; }
public Matrix Mr { get; private set; }
public Point3d Basis { get; set; }
public Plane()
{
Basis = new Point3d() { X = 0, Y = 0, Z = 0 };
a = 0;
b = 0;
c = 1;
d = 0;
CalcPlane();
}
public Plane(Point3d pt1, Point3d pt2, Point3d pt3)
{
Basis = pt1;
Vector3d v1 = new Vector3d()
{
Vx = pt2.X - pt1.X,
Vy = pt2.Y - pt1.Y,
Vz = pt2.Z - pt1.Z
};
Vector3d v2 = new Vector3d()
{
Vx = pt3.X - pt1.X,
Vy = pt3.Y - pt1.Y,
Vz = pt3.Z - pt1.Z
};
a = v1.Vy * v2.Vz - v1.Vz * v2.Vy;
b = v1.Vz * v2.Vx - v1.Vx * v2.Vz;
c = v1.Vx * v2.Vy - v1.Vy * v2.Vx;
d = -a * pt1.X - b * pt1.Y - c * pt1.Z;
CalcPlane();
RadToDeg();
}
public Plane(Point3d pt1, Point3d pt2, Point3d pt3, Point3d bpt)
{
Basis = bpt;
Vector3d v1 = new Vector3d()
{
Vx = pt2.X - pt1.X,
Vy = pt2.Y - pt1.Y,
Vz = pt2.Z - pt1.Z
};
Vector3d v2 = new Vector3d()
{
Vx = pt3.X - pt1.X,
Vy = pt3.Y - pt1.Y,
Vz = pt3.Z - pt1.Z
};
a = v1.Vy * v2.Vz - v1.Vz * v2.Vy;
b = v1.Vz * v2.Vx - v1.Vx * v2.Vz;
c = v1.Vx * v2.Vy - v1.Vy * v2.Vx;
d = -a * pt1.X - b * pt1.Y - c * pt1.Z;
CalcPlane();
RadToDeg();
}
public double Interpolation(double x, double y)
{
if (C == 0) return double.PositiveInfinity;
else return (-A * x - B * y - D) / C;
}
protected void CreatePlane(Point3d pt1, Point3d pt2, Point3d pt3)
{
Basis = pt1;
Vector3d v1 = new Vector3d()
{
Vx = pt2.X - pt1.X,
Vy = pt2.Y - pt1.Y,
Vz = pt2.Z - pt1.Z
};
Vector3d v2 = new Vector3d()
{
Vx = pt3.X - pt1.X,
Vy = pt3.Y - pt1.Y,
Vz = pt3.Z - pt1.Z
};
a = v1.Vy * v2.Vz - v1.Vz * v2.Vy;
b = v1.Vz * v2.Vx - v1.Vx * v2.Vz;
c = v1.Vx * v2.Vy - v1.Vy * v2.Vx;
d = -a * pt1.X - b * pt1.Y - c * pt1.Z;
CalcPlane();
RadToDeg();
}
protected void CalcPlane()
{
Normal = new Vector3d
{
Vx = a,
Vy = b,
Vz = c
};
Intersect();
CreateMatrix();
}
protected void Intersect()
{
if ((a == 0 & b == 0) == false)
{
Vector3d v3 = new Vector3d { Vx = 0, Vy = 0, Vz = 1 };
Z1 = new Vector3d(Normal.Unit);
X1 = new Vector3d((v3 ^ Z1).Unit);
Y1 = new Vector3d((Z1 ^ X1).Unit);
AlfaRad = -Acos(X1.Vx);
BetaRad = -Acos(Z1.Vz);
//alfaRad = Math.Acos(unitP.Vx);
//betaRad = Math.Acos(unitNormal.Vz);
}
}
protected void CreateMatrix()
{
Vector3d o = new Vector3d();
o[0] = -X1.Vx * Basis.X - X1.Vy * Basis.Y - X1.Vz * Basis.Z;
o[1] = -Y1.Vx * Basis.X - Y1.Vy * Basis.Y - Y1.Vz * Basis.Z;
o[2] = -Z1.Vx * Basis.X - Z1.Vy * Basis.Y - Z1.Vz * Basis.Z;
Mr = new Matrix(4, 4);
Mr[0, 0] = X1.Vx; Mr[0, 1] = X1.Vy; Mr[0, 2] = X1.Vz; Mr[0, 3] = o.Vx;
Mr[1, 0] = Y1.Vx; Mr[1, 1] = Y1.Vy; Mr[1, 2] = Y1.Vz; Mr[1, 3] = o.Vy;
Mr[2, 0] = Z1.Vx; Mr[2, 1] = Z1.Vy; Mr[2, 2] = Z1.Vz; Mr[2, 3] = o.Vz;
Mr[3, 0] = 0; Mr[3, 1] = 0; Mr[3, 2] = 0; Mr[3, 3] = 1;
MrAlfa = new Matrix(3, 3);
MrAlfa[0, 0] = Cos(AlfaRad); MrAlfa[0, 1] = -Sin(AlfaRad); MrAlfa[0, 2] = 0;
MrAlfa[1, 0] = Sin(AlfaRad); MrAlfa[1, 1] = Cos(AlfaRad); MrAlfa[1, 2] = 0;
MrAlfa[2, 0] = 0; MrAlfa[2, 1] = 0; MrAlfa[2, 2] = 0;
MrBeta = new Matrix(3, 3);
MrBeta[0, 0] = 1; MrBeta[0, 1] = 0; MrBeta[0, 2] = 0;
MrBeta[1, 0] = 0; MrBeta[1, 1] = Cos(BetaRad); MrBeta[1, 2] = -Sin(BetaRad);
MrBeta[2, 0] = 0; MrBeta[2, 1] = Sin(BetaRad); MrBeta[2, 2] = Cos(BetaRad);
MrGamma = new Matrix(3, 3);
MrGamma[0, 0] = Cos(gammaRad); MrGamma[0, 1] = -Sin(gammaRad); MrGamma[0, 2] = 0;
MrGamma[1, 0] = Sin(gammaRad); MrGamma[1, 1] = Cos(gammaRad); MrGamma[1, 2] = 0;
MrGamma[2, 0] = 0; MrGamma[2, 1] = 0; MrGamma[2, 2] = 1;
}
public Point3d PointInLCS(Point3d pt)
{
double[] d1 = new double[] { 0, 0, 0, 1 }; ;
Vector v1 = new Vector(d1);
v1[0] = pt.X; v1[1] = pt.Y; v1[2] = pt.Z;
return new Point3d().FromArray((Mr * v1).ToArray());
}
protected double[] MultiplyMtxVec(double[,] _Matrix, double[] _Vector)
{
int n = _Vector.Length;
double[] _Result = new double[n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
_Result[i] += _Matrix[i, j] * _Vector[j];
}
}
return _Result;
}
protected void RadToDeg()
{
AlfaDeg = AlfaRad * 180 / PI;
BetaDeg = BetaRad * 180 / PI;
gammaDeg = gammaRad * 180 / PI;
}
protected void DegToRad()
{
gammaRad = gammaDeg * 180 / PI;
}
}
}