151 lines
6.2 KiB
C#
151 lines
6.2 KiB
C#
using RobotNet10.GlobalPathPlanner.Model;
|
|
|
|
namespace RobotNet10.GlobalPathPlanner.Forklift;
|
|
|
|
public enum TStructureDirection
|
|
{
|
|
NODE1_NODE2_NODE3,
|
|
NODE1_NODE3_NODE2,
|
|
NODE2_NODE1_NODE3,
|
|
NODE2_NODE3_NODE1,
|
|
NODE3_NODE2_NODE1,
|
|
NODE3_NODE1_NODE2,
|
|
}
|
|
|
|
public class TStructure
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public GlobalNode Node1 { get; set; } = new();
|
|
public GlobalNode Node2 { get; set; } = new();
|
|
public GlobalNode Node3 { get; set; } = new();
|
|
public GlobalEdge? Edge12 { get; set; }
|
|
public GlobalEdge? Edge13 { get; set; }
|
|
public GlobalEdge? Edge23 { get; set; }
|
|
public GlobalEdge? Edge21 { get; set; }
|
|
public GlobalEdge? Edge31 { get; set; }
|
|
public GlobalEdge? Edge32 { get; set; }
|
|
private const double Ratio = 0.1;
|
|
|
|
public bool IsDriectionReverse(TStructureDirection direction, double changeOrientationAngle)
|
|
{
|
|
GlobalNode OriginNode = new();
|
|
GlobalNode ToWardNode1 = new();
|
|
GlobalNode ToWardNode2 = new();
|
|
GlobalEdge ToWardEdge1 = new();
|
|
GlobalEdge ToWardEdge2 = new();
|
|
|
|
switch (direction)
|
|
{
|
|
case TStructureDirection.NODE3_NODE2_NODE1:
|
|
if (Edge21 is null || Edge32 is null) return false;
|
|
OriginNode = Node2;
|
|
ToWardNode1 = Node1;
|
|
ToWardNode2 = Node3;
|
|
ToWardEdge1 = Edge21;
|
|
ToWardEdge2 = Edge32;
|
|
break;
|
|
case TStructureDirection.NODE1_NODE2_NODE3:
|
|
if (Edge12 is null || Edge23 is null) return false;
|
|
OriginNode = Node2;
|
|
ToWardNode1 = Node1;
|
|
ToWardNode2 = Node3;
|
|
ToWardEdge1 = Edge12;
|
|
ToWardEdge2 = Edge23;
|
|
break;
|
|
case TStructureDirection.NODE2_NODE3_NODE1:
|
|
if (Edge31 is null || Edge23 is null) return false;
|
|
OriginNode = Node3;
|
|
ToWardNode1 = Node1;
|
|
ToWardNode2 = Node2;
|
|
ToWardEdge1 = Edge23;
|
|
ToWardEdge2 = Edge31;
|
|
break;
|
|
case TStructureDirection.NODE1_NODE3_NODE2:
|
|
if (Edge13 is null || Edge32 is null) return false;
|
|
OriginNode = Node3;
|
|
ToWardNode1 = Node1;
|
|
ToWardNode2 = Node2;
|
|
ToWardEdge1 = Edge13;
|
|
ToWardEdge2 = Edge32;
|
|
break;
|
|
case TStructureDirection.NODE3_NODE1_NODE2:
|
|
if (Edge31 is null || Edge12 is null) return false;
|
|
OriginNode = Node1;
|
|
ToWardNode1 = Node2;
|
|
ToWardNode2 = Node3;
|
|
ToWardEdge1 = Edge31;
|
|
ToWardEdge2 = Edge12;
|
|
break;
|
|
case TStructureDirection.NODE2_NODE1_NODE3:
|
|
if (Edge21 is null || Edge13 is null) return false;
|
|
OriginNode = Node1;
|
|
ToWardNode1 = Node2;
|
|
ToWardNode2 = Node3;
|
|
ToWardEdge1 = Edge21;
|
|
ToWardEdge2 = Edge13;
|
|
break;
|
|
}
|
|
|
|
var NearToWardNode1 = MathExtensions.BezierPoint(Ratio, OriginNode, ToWardNode1, ToWardEdge1);
|
|
var NearToWardNode3 = MathExtensions.BezierPoint(Ratio, OriginNode, ToWardNode2, ToWardEdge2);
|
|
var angle = MathExtensions.GetAngle(OriginNode, NearToWardNode1, NearToWardNode3);
|
|
if (angle < changeOrientationAngle) return true;
|
|
return false;
|
|
}
|
|
|
|
public bool IsDriectionReverse(GlobalNode node1, GlobalNode node2, double changeOrientationAngle)
|
|
{
|
|
if (node1.Id == Node1.Id)
|
|
{
|
|
if (node2.Id == Node2.Id) return IsDriectionReverse(TStructureDirection.NODE1_NODE3_NODE2, changeOrientationAngle);
|
|
else if (node2.Id == Node3.Id) return IsDriectionReverse(TStructureDirection.NODE1_NODE2_NODE3, changeOrientationAngle);
|
|
}
|
|
else if (node1.Id == Node2.Id)
|
|
{
|
|
if (node2.Id == Node1.Id) return IsDriectionReverse(TStructureDirection.NODE2_NODE3_NODE1, changeOrientationAngle);
|
|
else if (node2.Id == Node3.Id) return IsDriectionReverse(TStructureDirection.NODE2_NODE1_NODE3, changeOrientationAngle);
|
|
}
|
|
else if (node1.Id == Node3.Id)
|
|
{
|
|
if (node2.Id == Node1.Id) return IsDriectionReverse(TStructureDirection.NODE3_NODE2_NODE1, changeOrientationAngle);
|
|
else if (node2.Id == Node2.Id) return IsDriectionReverse(TStructureDirection.NODE3_NODE1_NODE2, changeOrientationAngle);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public GlobalNode? GetIntraNode(GlobalNode node1, GlobalNode node2)
|
|
{
|
|
if (node1.Id == Node1.Id)
|
|
{
|
|
if (node2.Id == Node2.Id) return Node3;
|
|
else if (node2.Id == Node3.Id) return Node2;
|
|
}
|
|
else if (node1.Id == Node2.Id)
|
|
{
|
|
if (node2.Id == Node1.Id) return Node3;
|
|
else if (node2.Id == Node3.Id) return Node1;
|
|
}
|
|
else if (node1.Id == Node3.Id)
|
|
{
|
|
if (node2.Id == Node1.Id) return Node2;
|
|
else if (node2.Id == Node2.Id) return Node1;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public GlobalEdge? GetEdge(GlobalNode node1, GlobalNode node2)
|
|
{
|
|
if (Edge12 is not null && Edge12.StartNodeId == node1.Id && Edge12.EndNodeId == node2.Id) return Edge12;
|
|
if (Edge21 is not null && Edge21.StartNodeId == node1.Id && Edge21.EndNodeId == node2.Id) return Edge21;
|
|
if (Edge13 is not null && Edge13.StartNodeId == node1.Id && Edge13.EndNodeId == node2.Id) return Edge13;
|
|
if (Edge31 is not null && Edge31.StartNodeId == node1.Id && Edge31.EndNodeId == node2.Id) return Edge31;
|
|
if (Edge23 is not null && Edge23.StartNodeId == node1.Id && Edge23.EndNodeId == node2.Id) return Edge23;
|
|
if (Edge32 is not null && Edge32.StartNodeId == node1.Id && Edge32.EndNodeId == node2.Id) return Edge32;
|
|
return null;
|
|
}
|
|
|
|
public bool IsAccessDirection(GlobalNode startNode, GlobalNode endNode)
|
|
{
|
|
return GetEdge(startNode, endNode) is not null;
|
|
}
|
|
} |