📄 tabarc.cpp
字号:
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 + -