static FloatPointGraph::Polygon walkGraphAndExtractPolygon(FloatPointGraph::Node* startNode) { FloatPointGraph::Polygon outPoly; FloatPointGraph::Node* currentNode = startNode; FloatPointGraph::Node* previousNode = startNode; do { currentNode->visit(); FloatPoint currentVec(*previousNode - *currentNode); currentVec.normalize(); // Walk the graph, at each node choosing the next non-visited // point with the greatest internal angle. FloatPointGraph::Node* nextNode = nullptr; float nextNodeAngle = 0; for (auto potentialNextNode : currentNode->nextPoints()) { if (potentialNextNode == currentNode) continue; // If we can get back to the start, we should, ignoring the fact that we already visited it. // Otherwise we'll head inside the shape. if (potentialNextNode == startNode) { nextNode = startNode; break; } if (potentialNextNode->isVisited()) continue; FloatPoint nextVec(*potentialNextNode - *currentNode); nextVec.normalize(); float angle = acos(nextVec.dot(currentVec)); float crossZ = nextVec.x() * currentVec.y() - nextVec.y() * currentVec.x(); if (crossZ < 0) angle = (2 * piFloat) - angle; if (!nextNode || angle > nextNodeAngle) { nextNode = potentialNextNode; nextNodeAngle = angle; } } // If we don't end up at a node adjacent to the starting node, // something went wrong (there's probably a hole in the shape), // so bail out. We'll use a bounding box instead. if (!nextNode) return FloatPointGraph::Polygon(); outPoly.append(std::make_pair(currentNode, nextNode)); previousNode = currentNode; currentNode = nextNode; } while (currentNode != startNode); return outPoly; }
int ofxGifEncoder::getClosestToGreenScreenPaletteColorIndex(){ ofLog() << "computing closest palete color"; float minDistance = 100000; int closestIndex = 0; ofVec3f greenScreenVec(greenScreenColor.r, greenScreenColor.g, greenScreenColor.b); for (int i = 0; i < palette.size(); i++) { ofVec3f currentVec(palette.at(i).r, palette.at(i).g, palette.at(i).b); float currentDistance = currentVec.distance(greenScreenVec); if (currentDistance < minDistance){ minDistance = currentDistance; closestIndex = i; } } return closestIndex; }