Exemple #1
0
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);
}
Exemple #2
0
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__); }
}
Exemple #3
0
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;
			}
		}
	}