/// <summary> TODO low priority: move to class Connector when PSystem is available as singleton /// Checks whether two connector are mutually compatible (dimension, size, glues). /// Order of connectors matters due to possibly asymmetric glue relation! /// </summary> /// <param name="connector1"></param> /// <param name="connector2"></param> public bool AreCompatible(ConnectorOnTile connector1, ConnectorOnTile connector2) { return(GlueRelation.ContainsKey(Tuple.Create(connector1.Glue, connector2.Glue)) && (connector1.Positions.Count == 1 && connector2.Positions.Count == 1 && (connector1.OnTile.Vertices is Segment3D || connector2.OnTile.Vertices is Segment3D) || connector1.Positions.Count == 2 && connector2.Positions.Count == 2 && Math.Abs(connector1.Positions[0].DistanceTo(connector1.Positions[1]) - connector2.Positions[0].DistanceTo(connector2.Positions[1])) <= Tolerance)); }
/// <summary> /// Returns a pair of connectors at distinct positions on tile which match glue1 and glue2 in GlueRelation. /// If no such pair exist, then both returned connectors are null. /// Method is used for insertion of the "tile" between existing connectors with "glue1" and "glue2" /// </summary> public Tuple <ConnectorOnTile, ConnectorOnTile> MatchingConectors(Tile tile, Glue glue1, Glue glue2) { ConnectorOnTile conn2 = null; var conn1 = tile.Connectors.FirstOrDefault( connector1 => tile.Vertices.ContainsPoint(connector1.Positions[0]) && GlueRelation.MatchAsymmetric(glue1, connector1.Glue) && (conn2 = tile.Connectors.FirstOrDefault( connector2 => !connector1.Positions[0].MyEquals(connector2.Positions[0]) && tile.Vertices.ContainsPoint(connector2.Positions[0]) && GlueRelation.MatchAsymmetric(glue2, connector2.Glue))) != null); return(Tuple.Create(conn1, conn2)); }