⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tabarc.cpp

📁 linux下一款GIS程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        poGeom->getEnvelope(&sEnvelope);    }    else if ( (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbPoint ) )     {        /*-------------------------------------------------------------         * In the case of a POINT GEOMETRY, we will make sure the the          * feature's m_dCenterX/Y are in sync with the point's X,Y coords.         *         * In this case we have to reconstruct the arc inside a temporary         * geometry object in order to find its real MBR.         *------------------------------------------------------------*/        UGKPoint *poPoint = (UGKPoint *)poGeom;        m_dCenterX = poPoint->getX();        m_dCenterY = poPoint->getY();        UGKLineString oTmpLine;        int numPts=0;        if (m_dEndAngle < m_dStartAngle)            numPts = (int) ABS( ((m_dEndAngle+360)-m_dStartAngle)/2 ) + 1;        else            numPts = (int) ABS( (m_dEndAngle-m_dStartAngle)/2 ) + 1;        numPts = MAX(2, numPts);        TABGenerateArc(&oTmpLine, numPts,                       m_dCenterX, m_dCenterY,                       m_dXRadius, m_dYRadius,                       m_dStartAngle*PI/180.0, m_dEndAngle*PI/180.0);        oTmpLine.getEnvelope(&sEnvelope);    }    else    {        UGKError(ET_Failure, UGKErr_AssertionFailed,                 "TABArc: Missing or Invalid Geometry!");        return -1;    }    /*-----------------------------------------------------------------     * Copy object information     *----------------------------------------------------------------*/    TABMAPObjArc *poArcHdr = (TABMAPObjArc *)poObjHdr;    /*-------------------------------------------------------------     * Start/End angles     * Since we ALWAYS produce files in quadrant 1 then we can     * ignore the special angle conversion required by flipped axis.     *     * See the notes about Arc angles in TABArc::ReadGeometryFromMAPFile()     *------------------------------------------------------------*/    assert(poMapFile->GetHeaderBlock()->m_nCoordOriginQuadrant == 1);    poArcHdr->m_nStartAngle = ROUND_INT(m_dStartAngle*10.0);    poArcHdr->m_nEndAngle = ROUND_INT(m_dEndAngle*10.0);        // An arc is defined by its defining ellipse's MBR:    poMapFile->Coordsys2Int(m_dCenterX-m_dXRadius, m_dCenterY-m_dYRadius,                            poArcHdr->m_nArcEllipseMinX,                             poArcHdr->m_nArcEllipseMinY);    poMapFile->Coordsys2Int(m_dCenterX+m_dXRadius, m_dCenterY+m_dYRadius,                            poArcHdr->m_nArcEllipseMaxX,                             poArcHdr->m_nArcEllipseMaxY);    // Write the Arc's actual MBR    poMapFile->Coordsys2Int(sEnvelope.MinX, sEnvelope.MinY,                             poArcHdr->m_nMinX, poArcHdr->m_nMinY);    poMapFile->Coordsys2Int(sEnvelope.MaxX, sEnvelope.MaxY,                             poArcHdr->m_nMaxX, poArcHdr->m_nMaxY);    m_nPenDefIndex = poMapFile->WritePenDef(&m_sPenDef);    poArcHdr->m_nPenId = m_nPenDefIndex;      // Pen index    if (UGKGetLastErrorNo() != 0)        return -1;    return 0;}/********************************************************************** *                   TABArc::SetStart/EndAngle() * * Set the start/end angle values in degrees, making sure the values are * always in the range [0..360] **********************************************************************/void TABArc::SetStartAngle(double dAngle){    while(dAngle < 0.0)   dAngle += 360.0;    while(dAngle > 360.0) dAngle -= 360.0;    m_dStartAngle = dAngle;}void TABArc::SetEndAngle(double dAngle){    while(dAngle < 0.0)   dAngle += 360.0;    while(dAngle > 360.0) dAngle -= 360.0;    m_dEndAngle = dAngle;}/********************************************************************** *                   TABArc::GetStyleString() * * Return style string for this feature. * * Style String is built only once during the first call to GetStyleString(). **********************************************************************/const char *TABArc::GetStyleString(){    if (m_pszStyleString == NULL)    {        m_pszStyleString = UGKStrdup(GetPenStyleString());    }    return m_pszStyleString;}/********************************************************************** *                   TABArc::DumpMIF() * * Dump feature geometry in a format similar to .MIF REGIONs. **********************************************************************/void TABArc::DumpMIF(FILE *fpOut /*=NULL*/){    UGKGeometry   *poGeom;    UGKLineString *poLine = NULL;    int i, numPoints;    if (fpOut == NULL)        fpOut = stdout;    /*-----------------------------------------------------------------     * Output ARC parameters     *----------------------------------------------------------------*/    fprintf(fpOut, "(ARC %g %g %g %g   %d %d)\n",            m_dCenterX - m_dXRadius, m_dCenterY - m_dYRadius,            m_dCenterX + m_dXRadius, m_dCenterY + m_dYRadius,            (int)m_dStartAngle, (int)m_dEndAngle);    /*-----------------------------------------------------------------     * Fetch and validate geometry     *----------------------------------------------------------------*/    poGeom = GetGeometryRef();    if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbLineString)    {        /*-------------------------------------------------------------         * Generate arc output as a simple polyline         * We could also output as an ELLIPSE in a real MIF generator         *------------------------------------------------------------*/        poLine = (UGKLineString*)poGeom;        numPoints = poLine->getNumPoints();        fprintf(fpOut, "PLINE %d\n", numPoints);        for(i=0; i<numPoints; i++)            fprintf(fpOut, "%g %g\n", poLine->getX(i), poLine->getY(i));    }    else    {        UGKError(ET_Failure, UGKErr_AssertionFailed,                 "TABArc: Missing or Invalid Geometry!");        return;    }    // Finish with PEN/BRUSH/etc. clauses    DumpPenDef();    fflush(fpOut);}/********************************************************************** * **********************************************************************/int TABArc::ReadGeometryFromMIFFile(MIDDATAFile *fp){    const char          *pszLine;    UGKLineString       *poLine;    char               **papszToken;    double               dXMin,dXMax, dYMin,dYMax;    int                  numPts;        papszToken = TokenizeString2(fp->GetLastLine(),                                     " \t", 0x0001);    if (CountOfList(papszToken) == 5)    {        dXMin = fp->GetXTrans(atof(papszToken[1]));        dXMax = fp->GetXTrans(atof(papszToken[3]));        dYMin = fp->GetYTrans(atof(papszToken[2]));        dYMax = fp->GetYTrans(atof(papszToken[4]));        FreeStrList(papszToken);        papszToken = TokenizeString2(fp->GetLine(),                                         " \t", 0x0001);        if (CountOfList(papszToken) != 2)        {            FreeStrList(papszToken);            return -1;        }        m_dStartAngle = atof(papszToken[0]);        m_dEndAngle = atof(papszToken[1]);    }    else if (CountOfList(papszToken) == 7)    {        dXMin = fp->GetXTrans(atof(papszToken[1]));        dXMax = fp->GetXTrans(atof(papszToken[3]));        dYMin = fp->GetYTrans(atof(papszToken[2]));        dYMax = fp->GetYTrans(atof(papszToken[4]));        m_dStartAngle = atof(papszToken[5]);        m_dEndAngle = atof(papszToken[6]);    }    else    {        FreeStrList(papszToken);        return -1;    }    FreeStrList(papszToken);    papszToken = NULL;    /*-------------------------------------------------------------     * Start/End angles     * Since the angles are specified for integer coordinates, and     * that these coordinates can have the X axis reversed, we have to     * adjust the angle values for the change in the X axis     * direction.     *     * This should be necessary only when X axis is flipped.     * __TODO__ Why is order of start/end values reversed as well???     *------------------------------------------------------------*/    if (fp->GetXMultiplier() <= 0.0)    {        m_dStartAngle = 360.0 - m_dStartAngle;        m_dEndAngle = 360.0 - m_dEndAngle;    }        m_dCenterX = (dXMin + dXMax) / 2.0;    m_dCenterY = (dYMin + dYMax) / 2.0;    m_dXRadius = ABS( (dXMax - dXMin) / 2.0 );    m_dYRadius = ABS( (dYMax - dYMin) / 2.0 );    /*-----------------------------------------------------------------     * Create and fill geometry object     * For the UGK geometry, we generate an arc with 2 degrees line     * segments.     *----------------------------------------------------------------*/    poLine = new UGKLineString;    if (m_dEndAngle < m_dStartAngle)        numPts = (int) ABS( ((m_dEndAngle+360.0)-m_dStartAngle)/2.0 ) + 1;    else        numPts = (int) ABS( (m_dEndAngle-m_dStartAngle)/2.0 ) + 1;    numPts = MAX(2, numPts);    TABGenerateArc(poLine, numPts,                   m_dCenterX, m_dCenterY,                   m_dXRadius, m_dYRadius,                   m_dStartAngle*PI/180.0, m_dEndAngle*PI/180.0);    SetMBR(dXMin, dYMin, dXMax, dYMax);    SetGeometryDirectly(poLine);    while (((pszLine = fp->GetLine()) != NULL) &&            fp->IsValidFeature(pszLine) == FALSE)    {        papszToken = TokenizeStringComplex(pszLine,"() ,",                                              TRUE,FALSE);                if (CountOfList(papszToken) > 1)        {            if (EQUALN(papszToken[0],"PEN",3))            {                                if (CountOfList(papszToken) == 4)                {                        SetPenWidthMIF(atoi(papszToken[1]));                    SetPenPattern(atoi(papszToken[2]));                    SetPenColor(atoi(papszToken[3]));                }                            }        }        FreeStrList(papszToken);        papszToken = NULL;   }   return 0; }/********************************************************************** * **********************************************************************/int TABArc::WriteGeometryToMIFFile(MIDDATAFile *fp){     /*-------------------------------------------------------------     * Start/End angles     * Since we ALWAYS produce files in quadrant 1 then we can     * ignore the special angle conversion required by flipped axis.     *------------------------------------------------------------*/         // Write the Arc's actual MBR     fp->WriteLine("Arc %.16g %.16g %.16g %.16g\n", m_dCenterX-m_dXRadius,                    m_dCenterY-m_dYRadius, m_dCenterX+m_dXRadius,                    m_dCenterY+m_dYRadius);     fp->WriteLine("  %.16g %.16g\n",m_dStartAngle,m_dEndAngle);           if (GetPenPattern())       fp->WriteLine("    Pen (%d,%d,%d)\n",GetPenWidthMIF(),GetPenPattern(),                     GetPenColor());            return 0; }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -