public ProjectionCurrentState GetCurrentState()
        {
            var state = new ProjectionCurrentState();

            state.edgesMap = GetEdgeFunction();
            state.nodesMap = GetNodeFunction();
            return(state);
        }
Beispiel #2
0
        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);
                    }
                }
            }
        }
Beispiel #3
0
        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);
        }