public Vec2Info(EdgeSegment owner, Vec2PointKind kind, Vector2 point)
 {
     this.owner = owner;
     this.x     = point.x;
     this.y     = point.y;
     Kind       = kind;
 }
Beispiel #2
0
        internal EdgeBmpLut(List <ContourCorner> corners, List <EdgeSegment> flattenEdges, List <int> segOfNextContours, List <int> cornerOfNextContours)
        {
            //move first to last
            int startAt = 0;

            for (int i = 0; i < segOfNextContours.Count; ++i)
            {
                int nextStartAt = segOfNextContours[i];
                //
                EdgeSegment firstSegment = flattenEdges[startAt];

                flattenEdges.RemoveAt(startAt);
                if (i == segOfNextContours.Count - 1)
                {
                    flattenEdges.Add(firstSegment);
                }
                else
                {
                    flattenEdges.Insert(nextStartAt - 1, firstSegment);
                }
                startAt = nextStartAt;
            }

            _corners             = corners;
            _flattenEdges        = flattenEdges;
            EdgeOfNextContours   = segOfNextContours;
            CornerOfNextContours = cornerOfNextContours;

            ConnectExtendedPoints(corners, cornerOfNextContours); //after arrange
        }
 public EdgeStructure(EdgeSegment[] edgeSegments, AreaKind areaKind)
 {
     _isEmpty      = false;
     _edgeSegment  = null;
     _edgeSegments = edgeSegments;
     _areaKind     = areaKind;
 }
 public EdgeStructure(EdgeSegment edgeSegment, AreaKind areaKind)
 {
     _isEmpty     = false;
     _edgeSegment = edgeSegment;
     _areaKind    = areaKind;
     //
     _edgeSegments = null;
 }
Beispiel #5
0
 public override void splitInThirds(out EdgeSegment part1, out EdgeSegment part2, out EdgeSegment part3)
 {
     part1 = new CubicSegment(_p0, Vector2.IsEq(_p0, _p1) ? _p0 : mix(_p0, _p1, 1 / 3.0), mix(mix(_p0, _p1, 1 / 3.0), mix(_p1, _p2, 1 / 3.0), 1 / 3.0), point(1 / 3.0), color);
     part2 = new CubicSegment(point(1 / 3.0),
                              mix(mix(mix(_p0, _p1, 1 / 3.0), mix(_p1, _p2, 1 / 3.0), 1 / 3.0), mix(mix(_p1, _p2, 1 / 3.0), mix(_p2, _p3, 1 / 3.0), 1 / 3.0), 2 / 3.0),
                              mix(mix(mix(_p0, _p1, 2 / 3.0), mix(_p1, _p2, 2 / 3.0), 2 / 3.0), mix(mix(_p1, _p2, 2 / 3.0), mix(_p2, _p3, 2 / 3.0), 2 / 3.0), 1 / 3.0),
                              point(2 / 3.0), color);
     part3 = new CubicSegment(point(2 / 3.0), mix(mix(_p1, _p2, 2 / 3.0), mix(_p2, _p3, 2 / 3.0), 2 / 3.0), Vector2.IsEq(_p2, _p3) ? _p3 : mix(_p2, _p3, 2 / 3.0), _p3, color);
 }
Beispiel #6
0
        internal void SetOverlappedList(List <CornerList> overlappedList)
        {
            int m = overlappedList.Count;

            _overlappedEdgeList = new List <EdgeSegment[]>(m);
            for (int i = 0; i < m; ++i)
            {
                if (i == 124 || i == 389)
                {
                }
                CornerList    arr1    = overlappedList[i];
                int           count   = arr1.Count;
                EdgeSegment[] corners = new EdgeSegment[count];//overlapping corner region
                for (int a = 0; a < count; ++a)
                {
                    corners[a] = _corners[arr1[a]].CenterSegment;
                }
                _overlappedEdgeList.Add(corners);
            }
        }
Beispiel #7
0
 public abstract void splitInThirds(
     out EdgeSegment part1,
     out EdgeSegment part2,
     out EdgeSegment part3);
Beispiel #8
0
 public override void splitInThirds(out EdgeSegment part1, out EdgeSegment part2, out EdgeSegment part3)
 {
     part1 = new QuadraticSegment(_p0, mix(_p0, _p1, 1 / 3.0), point(1 / 3.0), this.color);
     part2 = new QuadraticSegment(point(1 / 3.0), mix(mix(_p0, _p1, 5 / 9.0), mix(_p1, _p2, 4 / 9.0), .5), point(2 / 3.0), this.color);
     part3 = new QuadraticSegment(point(2 / 3.0), mix(_p1, _p2, 2 / 3.0), _p2, this.color);
 }
Beispiel #9
0
 public override void splitInThirds(out EdgeSegment part1, out EdgeSegment part2, out EdgeSegment part3)
 {
     part1 = new LinearSegment(_p0, point(1 / 3.0), this.color);
     part2 = new LinearSegment(point(1 / 3.0), point(2 / 3.0), this.color);
     part3 = new LinearSegment(point(2 / 3.0), _p1, this.color);
 }
Beispiel #10
0
        public static void edgeColoringSimple(Shape shape, double angleThreshold, ulong seed = 0)
        {
            double     crossThreshold = Math.Sin(angleThreshold);
            List <int> corners        = new List <int>(); //TODO: review reusable list

            // for (std::vector<Contour>::iterator contour = shape.contours.begin(); contour != shape.contours.end(); ++contour)
            foreach (Contour contour in shape.contours)
            {
                // Identify corners
                corners.Clear();
                List <EdgeSegment> edges = contour.edges;
                int edgeCount            = edges.Count;
                if (edgeCount != 0)
                {
                    Vector2 prevDirection = edges[edgeCount - 1].direction(1);// (*(contour->edges.end() - 1))->direction(1);
                    for (int i = 0; i < edgeCount; ++i)
                    {
                        EdgeSegment edge = edges[i];
                        if (isCorner(prevDirection.normalize(),
                                     edge.direction(0).normalize(), crossThreshold))
                        {
                            corners.Add(i);
                        }
                        prevDirection = edge.direction(1);
                    }
                }

                // Smooth contour
                if (corners.Count == 0) //is empty
                {
                    for (int i = edgeCount - 1; i >= 0; --i)
                    {
                        edges[i].color = EdgeColor.WHITE;
                    }
                }
                else if (corners.Count == 1)
                {
                    // "Teardrop" case
                    EdgeColor[] colors = { EdgeColor.WHITE, EdgeColor.WHITE, EdgeColor.BLACK };
                    switchColor(ref colors[0], ref seed);
                    colors[2] = colors[0];
                    switchColor(ref colors[2], ref seed);

                    int corner = corners[0];
                    if (edgeCount >= 3)
                    {
                        int m = edgeCount;
                        for (int i = 0; i < m; ++i)
                        {
                            //TODO: review here
                            contour.edges[(corner + i) % m].color = colors[((int)(3 + 2.875 * i / (m - 1) - 1.4375 + .5) - 3) + 1];
                            //(colors + 1)[int(3 + 2.875 * i / (m - 1) - 1.4375 + .5) - 3];
                        }
                    }
                    else if (edgeCount >= 1)
                    {
                        // Less than three edge segments for three colors => edges must be split
                        EdgeSegment[] parts = new EdgeSegment[7]; //empty array, TODO: review array alloc here
                        edges[0].splitInThirds(
                            out parts[0 + 3 * corner],
                            out parts[1 + 3 * corner],
                            out parts[2 + 3 * corner]);

                        if (edgeCount >= 2)
                        {
                            edges[1].splitInThirds(
                                out parts[3 - 3 * corner],
                                out parts[4 - 3 * corner],
                                out parts[5 - 3 * corner]
                                );
                            parts[0].color = parts[1].color = colors[0];
                            parts[2].color = parts[3].color = colors[1];
                            parts[4].color = parts[5].color = colors[2];
                        }
                        else
                        {
                            parts[0].color = colors[0];
                            parts[1].color = colors[1];
                            parts[2].color = colors[2];
                        }
                        contour.edges.Clear();
                        for (int i = 0; i < 7; ++i)
                        {
                            edges.Add(parts[i]);
                        }
                    }
                }
                // Multiple corners
                else
                {
                    int       cornerCount = corners.Count;
                    int       spline      = 0;
                    int       start       = corners[0];
                    int       m           = contour.edges.Count;
                    EdgeColor color       = EdgeColor.WHITE;
                    switchColor(ref color, ref seed);
                    EdgeColor initialColor = color;
                    for (int i = 0; i < m; ++i)
                    {
                        int index = (start + i) % m;
                        if (spline + 1 < cornerCount && corners[spline + 1] == index)
                        {
                            ++spline;
                            switchColor(ref color, ref seed, (EdgeColor)(((spline == cornerCount - 1) ? 1 : 0) * (int)initialColor));
                        }
                        edges[index].color = color;
                    }
                }
            }
        }