Files
GroundOrganizer/Geometry/Quadrangle.cs
2026-01-06 02:07:18 +03:00

148 lines
5.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geo
{
[Serializable]
public class Quadrangle : Polygon
{
private Point3d vertex1 = new Point3d();
private Point3d vertex2 = new Point3d();
private Point3d vertex3 = new Point3d();
private Point3d vertex4 = new Point3d();
public Point3d Vertex1 { get => vertex1; set { vertex1 = value; Vertices[0] = vertex1; CalcQuadrangle(); } }
public Point3d Vertex2 { get => vertex2; set { vertex2 = value; Vertices[1] = vertex2; CalcQuadrangle(); } }
public Point3d Vertex3 { get => vertex3; set { vertex3 = value; Vertices[2] = vertex3; CalcQuadrangle(); } }
public Point3d Vertex4 { get => vertex4; set { vertex4 = value; Vertices[3] = vertex4; CalcQuadrangle(); } }
public double MaxAngleDeg { get; private set; }
public bool IsValid { get; private set; }
public UnitsLin Units { get; set; }
public Quadrangle(Triangle trg1, Triangle trg2)
{
List<Point3d> vrt = new List<Point3d>();
List<Point3d> dgn = new List<Point3d>();
vrt.Add(trg1.Vertex1);
vrt.Add(trg1.Vertex2);
vrt.Add(trg1.Vertex3);
vrt.Add(trg2.Vertex1);
vrt.Add(trg2.Vertex2);
vrt.Add(trg2.Vertex3);
for (int i = 0; i < vrt.Count; i++)
{
for (int j = 0; j < vrt.Count; j++)
{
if (i == j) continue;
if (Math.Round(vrt[i].X, 2) == Math.Round(vrt[j].X,2) && Math.Round(vrt[i].Y,2) == Math.Round(vrt[j].Y,2))
{
dgn.Add(vrt[i]);
vrt.RemoveAt(j);
break;
}
}
}
if (vrt.Count == 4)
{
if (vrt[0].Equals(dgn[0]) && vrt[1].Equals(dgn[1]))
{
vertex1 = vrt[0];
AddVertice(Vertex1);
vertex2 = vrt[2];
AddVertice(Vertex2);
vertex3 = vrt[1];
AddVertice(Vertex3);
vertex4 = vrt[3];
AddVertice(Vertex4);
}
if (vrt[1].Equals(dgn[0]) && vrt[2].Equals(dgn[1]))
{
vertex1 = vrt[0];
AddVertice(Vertex1);
vertex2 = vrt[2];
AddVertice(Vertex2);
vertex3 = vrt[3];
AddVertice(Vertex3);
vertex4 = vrt[1];
AddVertice(Vertex4);
}
if (vrt[0].Equals(dgn[0]) && vrt[2].Equals(dgn[1]))
{
vertex1 = vrt[0];
AddVertice(Vertex1);
vertex2 = vrt[1];
AddVertice(Vertex2);
vertex3 = vrt[2];
AddVertice(Vertex3);
vertex4 = vrt[3];
AddVertice(Vertex4);
}
if (vrt[1].Equals(dgn[0]) && vrt[3].Equals(dgn[1]))
{
vertex1 = vrt[0];
AddVertice(Vertex1);
vertex2 = vrt[1];
AddVertice(Vertex2);
vertex3 = vrt[2];
AddVertice(Vertex3);
vertex4 = vrt[3];
AddVertice(Vertex4);
}
IsValid = true;
CalcQuadrangle();
}
else
{
IsValid = false;
Vertices.Add(new Point3d());
Vertices.Add(new Point3d());
Vertices.Add(new Point3d());
Vertices.Add(new Point3d());
}
}
public Quadrangle(Point3d node1, Point3d node2, Point3d node3, Point3d node4)
{
vertex1 = node1;
AddVertice(node1);
vertex2 = node2;
AddVertice(node2);
vertex3 = node3;
AddVertice(node3);
vertex4 = node4;
AddVertice(node4);
CalcQuadrangle();
IsValid = true;
}
public Quadrangle(Point2d node1, Point2d node2, Point2d node3, Point2d node4)
{
vertex1 = node1.ToPoint3d();
AddVertice(node1);
vertex2 = node2.ToPoint3d();
AddVertice(node2);
vertex3 = node3.ToPoint3d();
AddVertice(node3);
vertex4 = node4.ToPoint3d();
AddVertice(node4);
CalcQuadrangle();
IsValid = true;
}
public void CalcQuadrangle()
{
double ang1, ang2, ang3, ang4;
ang1 = vertex1.AngleTo(vertex4, vertex2);
ang2 = vertex2.AngleTo(vertex1, vertex3);
ang3 = vertex3.AngleTo(vertex2, vertex4);
ang4 = vertex4.AngleTo(vertex3, vertex1);
MaxAngleDeg = Math.Max(Math.Max(Math.Max(ang1, ang2), ang3), ang4);
CalcPolygon();
}
}
}