public ProjectionCurrentState GetCurrentState() { var state = new ProjectionCurrentState(); state.edgesMap = GetEdgeFunction(); state.nodesMap = GetNodeFunction(); return(state); }
public static IEnumerable <ProjectionStage> TrySquashPoint(ProjectionCurrentState state, List <AdjoinedSegmentFamilySubset> edges, Projection pr) { var sizes = edges.Select(z => state.nodesMap[z.ProjectedNode].Count).ToArray(); foreach (var p in GetCounting(sizes)) { var proj = new NodeProjection[sizes.Length]; for (int i = 0; i < sizes.Length; i++) { proj[i] = state.nodesMap[edges[i].ProjectedNode][p[i]]; } var vars = Arithmetic.RationalTriangulate(edges[0].family.Segment, edges[1].family.Segment, proj[0].Projection, proj[1].Projection); if (vars == null) { continue; } foreach (var v in vars) { if (v.X < 0 || v.X > pr.SideX || v.Y < 0 || v.Y > pr.SideY) { continue; } var stage = new ProjectionStage(); var sq = new NodeProjection { Original = edges[0].NonProjectedNode, Projection = v }; stage.Nodes.Add(sq); bool ok = true; for (int k = 0; k < sizes.Length; k++) { var len = new Segment(v, proj[k].Projection); if (len.QuadratOfLength != edges[k].family.Segment.QuadratOfLength) { ok = false; break; } stage.Edges.Add(new EdgeProjection { begin = sq, end = proj[k], Segments = edges[k].family.Insides.ToList() }); } if (ok) { yield return(stage); } } } }
public static List <EdgeProjection> TryInsertFamily(SegmentFamilySubset subset, ProjectionCurrentState state) { if (state.SegmentIsCovered(subset)) { return(null); } var start = state.GetNode(subset.Begin); if (start == null) { return(null); } var end = state.GetNode(subset.End); if (end == null) { return(null); } var result = new List <EdgeProjection>(); foreach (var s in state.nodesMap[start]) { foreach (var f in state.nodesMap[end]) { var length = new Segment(s.Projection, f.Projection).QuadratOfLength; if (length != new Segment(subset.Begin, subset.End).QuadratOfLength) { continue; } result.Add(new EdgeProjection { begin = s, end = f, Segments = subset.Insides.ToList() }); } } return(result); }