// Cycle enumerator callback // Check if cycle is boundary and mark vertices and edges as boundary/internal bool MoleculeLayoutGraph::_border_cb (Graph &graph, const Array<int> &vertices, const Array<int> &edges, void *context) { MoleculeLayoutGraph &self = *(MoleculeLayoutGraph *)context; Cycle cycle(vertices, edges); //cycle.canonize(); int i; QS_DEF(Array<int>, types); types.clear_resize(self.vertexEnd()); for (i = self.vertexBegin(); i < self.vertexEnd(); i = self.vertexNext(i)) types[i] = ELEMENT_INTERNAL; for (i = 0; i < cycle.vertexCount(); i++) types[cycle.getVertex(i)] = ELEMENT_BOUNDARY; // Check vertices not in cycle are inside it for (i = self.vertexBegin(); i < self.vertexEnd(); i = self.vertexNext(i)) if (types[i] == ELEMENT_INTERNAL) if (self._isPointOutsideCycle(cycle, self.getPos(i))) return true; //continue // Check edge centers are inside cycle types.clear_resize(self.edgeEnd()); for (i = self.edgeBegin(); i < self.edgeEnd(); i = self.edgeNext(i)) types[i] = ELEMENT_INTERNAL; for (i = 0; i < cycle.vertexCount(); i++) types[cycle.getEdge(i)] = ELEMENT_BOUNDARY; for (i = self.edgeBegin(); i < self.edgeEnd(); i = self.edgeNext(i)) if (types[i] == ELEMENT_INTERNAL) { Vec2f p; const Edge &edge = self.getEdge(i); p.lineCombin2(self.getPos(edge.beg), 0.5f, self.getPos(edge.end), 0.5f); if (self._isPointOutsideCycle(cycle, p)) return true; //continue } // Mark edges and bonds for (i = self.vertexBegin(); i < self.vertexEnd(); i = self.vertexNext(i)) self._layout_vertices[i].type = ELEMENT_INTERNAL; for (i = self.edgeBegin(); i < self.edgeEnd(); i = self.edgeNext(i)) self._layout_edges[i].type = ELEMENT_INTERNAL; for (i = 0; i < cycle.vertexCount(); i++) { self._layout_vertices[cycle.getVertex(i)].type = ELEMENT_BOUNDARY; self._layout_edges[cycle.getEdge(i)].type = ELEMENT_BOUNDARY; } return false; }