Добавьте файлы проекта.
This commit is contained in:
242
Geometry/Plane.cs
Normal file
242
Geometry/Plane.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user