DBCoordinate *DBVPolyIF::Vertexes(const DBObjRecord *polyRec) const { DBInt vertex, i, line; DBObjRecord *lineRec, *nodeRec, *firstNodeRec; DBCoordinate *lcoords; vertex = 0; lineRec = FirstLine(polyRec); firstNodeRec = nodeRec = LineRightPoly(lineRec) == polyRec ? FromNode(lineRec) : ToNode(lineRec); for (line = 0; line < LineNum(polyRec); ++line) { if (LineRightPoly(lineRec) == polyRec) { if (nodeRec != FromNode(lineRec)) { CoordsPTR[vertex++] = NodeCoord(nodeRec); if (nodeRec != firstNodeRec) CoordsPTR[vertex++] = NodeCoord(firstNodeRec); nodeRec = FromNode(lineRec); } CoordsPTR[vertex++] = NodeCoord(nodeRec); if (DBVLineIF::VertexNum(lineRec) > 0) { lcoords = DBVLineIF::Vertexes(lineRec); for (i = 0; i < DBVLineIF::VertexNum(lineRec); ++i) CoordsPTR[vertex++] = lcoords[i]; } nodeRec = ToNode(lineRec); lineRec = LineNextLine(lineRec); } else { if (nodeRec != ToNode(lineRec)) { CoordsPTR[vertex++] = NodeCoord(nodeRec); if (nodeRec != firstNodeRec) CoordsPTR[vertex++] = NodeCoord(firstNodeRec); nodeRec = ToNode(lineRec); } CoordsPTR[vertex++] = NodeCoord(nodeRec); if (DBVLineIF::VertexNum(lineRec) > 0) { lcoords = (DBCoordinate *) (DBVLineIF::Vertexes(lineRec)); for (i = DBVLineIF::VertexNum(lineRec); i > 0; --i) CoordsPTR[vertex++] = lcoords[i - 1]; } nodeRec = FromNode(lineRec); lineRec = LinePrevLine(lineRec); } } CoordsPTR[vertex++] = NodeCoord(nodeRec); if (nodeRec != firstNodeRec) CoordsPTR[vertex++] = NodeCoord(firstNodeRec); if (VertexNum(polyRec) != vertex) CMmsgPrint(CMmsgAppError, "Warning in Polygon %d VertexNum [%d %d] in: %s %d", polyRec->RowID(), VertexNum(polyRec), vertex, __FILE__, __LINE__); return (CoordsPTR); }
DBVPolyIF::DBVPolyIF(DBObjData *data) : DBVLineIF(data, data->Table(DBrNContours)) { DBObjTable *items = data->Table(DBrNItems); LineTable = data->Table(DBrNContours); DBObjRecord *polyRec; FirstLineFLD = items->Field(DBrNFirstLine); LineNumFLD = items->Field(DBrNLineNum); ExtentFLD = items->Field(DBrNRegion); LeftPolyFLD = LineTable->Field(DBrNLeftPoly); RightPolyFLD = LineTable->Field(DBrNRightPoly); NextLineFLD = LineTable->Field(DBrNNextLine); PrevLineFLD = LineTable->Field(DBrNPrevLine); VertexNumFLD = items->Field(DBrNVertexNum); AreaFLD = items->Field(DBrNArea); MaxVertexNumVAR = 0; for (polyRec = FirstItem(); polyRec != (DBObjRecord *) NULL; polyRec = NextItem()) MaxVertexNumVAR = MaxVertexNumVAR > VertexNum(polyRec) ? MaxVertexNumVAR : VertexNum(polyRec); if ((CoordsPTR = (DBCoordinate *) malloc(MaxVertexNumVAR * sizeof(DBCoordinate))) == (DBCoordinate *) NULL) { CMmsgPrint(CMmsgSysError, "Memory Allocation Error in: %s %d", __FILE__, __LINE__); } }
void DBVLineIF::Flip (DBObjRecord *lineRec) { DBInt vertexNum = VertexNum (lineRec); DBObjRecord *node; node = ToNodeFLD->Record (lineRec); ToNodeFLD->Record (lineRec,FromNodeFLD->Record (lineRec)); FromNodeFLD->Record (lineRec,node); if (vertexNum > 0) { DBInt vertex; DBCoordinate *vertexes = Vertexes (lineRec), coord; for (vertex = 0;vertex < vertexNum >> 0x01; ++vertex) { coord = vertexes [vertexNum - 1 -vertex]; vertexes [vertexNum - 1 -vertex] = vertexes [vertex]; vertexes [vertex] = coord; } } }