| 66 | } |
| 67 | |
| 68 | void edgeColoringSimple(Shape &shape, double angleThreshold, unsigned long long seed) { |
| 69 | double crossThreshold = sin(angleThreshold); |
| 70 | EdgeColor color = initColor(seed); |
| 71 | std::vector<int> corners; |
| 72 | for (std::vector<Contour>::iterator contour = shape.contours.begin(); contour != shape.contours.end(); ++contour) { |
| 73 | if (contour->edges.empty()) |
| 74 | continue; |
| 75 | { // Identify corners |
| 76 | corners.clear(); |
| 77 | Vector2 prevDirection = contour->edges.back()->direction(1); |
| 78 | int index = 0; |
| 79 | for (std::vector<EdgeHolder>::const_iterator edge = contour->edges.begin(); edge != contour->edges.end(); ++edge, ++index) { |
| 80 | if (isCorner(prevDirection.normalize(), (*edge)->direction(0).normalize(), crossThreshold)) |
| 81 | corners.push_back(index); |
| 82 | prevDirection = (*edge)->direction(1); |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | // Smooth contour |
| 87 | if (corners.empty()) { |
| 88 | switchColor(color, seed); |
| 89 | for (std::vector<EdgeHolder>::iterator edge = contour->edges.begin(); edge != contour->edges.end(); ++edge) |
| 90 | (*edge)->color = color; |
| 91 | } |
| 92 | // "Teardrop" case |
| 93 | else if (corners.size() == 1) { |
| 94 | EdgeColor colors[3]; |
| 95 | switchColor(color, seed); |
| 96 | colors[0] = color; |
| 97 | colors[1] = WHITE; |
| 98 | switchColor(color, seed); |
| 99 | colors[2] = color; |
| 100 | int corner = corners[0]; |
| 101 | if (contour->edges.size() >= 3) { |
| 102 | int m = (int) contour->edges.size(); |
| 103 | for (int i = 0; i < m; ++i) |
| 104 | contour->edges[(corner+i)%m]->color = colors[1+symmetricalTrichotomy(i, m)]; |
| 105 | } else if (contour->edges.size() >= 1) { |
| 106 | // Less than three edge segments for three colors => edges must be split |
| 107 | EdgeSegment *parts[7] = { }; |
| 108 | contour->edges[0]->splitInThirds(parts[0+3*corner], parts[1+3*corner], parts[2+3*corner]); |
| 109 | if (contour->edges.size() >= 2) { |
| 110 | contour->edges[1]->splitInThirds(parts[3-3*corner], parts[4-3*corner], parts[5-3*corner]); |
| 111 | parts[0]->color = parts[1]->color = colors[0]; |
| 112 | parts[2]->color = parts[3]->color = colors[1]; |
| 113 | parts[4]->color = parts[5]->color = colors[2]; |
| 114 | } else { |
| 115 | parts[0]->color = colors[0]; |
| 116 | parts[1]->color = colors[1]; |
| 117 | parts[2]->color = colors[2]; |
| 118 | } |
| 119 | contour->edges.clear(); |
| 120 | for (int i = 0; parts[i]; ++i) |
| 121 | contour->edges.push_back(EdgeHolder(parts[i])); |
| 122 | } |
| 123 | } |
| 124 | // Multiple corners |
| 125 | else { |
no test coverage detected