public Vec2Info(EdgeSegment owner, Vec2PointKind kind, Vector2 point) { this.owner = owner; this.x = point.x; this.y = point.y; Kind = kind; }
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; }
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); }
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); } }
public abstract void splitInThirds( out EdgeSegment part1, out EdgeSegment part2, out EdgeSegment part3);
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); }
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); }
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; } } } }