欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap 谈天说地
   您现在位于: 首页技术专栏SuperMap应用与开发超图桌面 → 正文
点状符号数据导出与绘制
08-01-11 00:00:00 作者:武汉侯涛 出处:http://www.cnblogs.com/wuhanhoutao/
SuperMap5.0 中的资源有三种:符号库,线型库和填充库。即对应平常所说的点状符号,线状符号和面状符号。

     其中点状符号对应着*.sym 文件。符号编辑器提供了输出符号库的功能,即可将原始的点状符号文件导出成为ASCII 码类型的*.smi 文件。分析并读取此文件后,完成绘制功能,即可实现资源共享的目标。

     所需要注意的问题:

1)      颜色。Pen Brush 中颜色的记录方法不是通常直接的RGB 颜色,需要进行转换。如Brush 中的参数16711680 对应蓝色,是在得到此数字后,将此十进制数据转换成十六进制字串FF0000 ,因为FF 对应着十进制数字255 00 依旧是十进制数字00 ,所以此字串对应着颜色BGR 255,0,0 ),与平时使用的RGB 颜色的顺序刚好相反。

2)      Y 轴的起点和方向,导出的文件数据中记录的Y 轴起点在左上角,方向朝下,与某些系统中采用的Y 轴起点在左下角,方向朝上是不同,所以处理时候采用变换:ynew = L – yold.

3)      ARC 的数据结构。导出的文件Arc 部分,往往记录着四组XY 顶点对,第一和第二顶点对表示要提取的椭圆弧的起点和终点,以逆时针方向为准。第三和第四顶点对表示椭圆的长短轴端点,以此可确定椭圆的参数。

附参考代码:
 

void ExportSuperSymbol::AddSuperMapPolygon(Vertex2dVector &PtList,COLORREF crPen,COLORREF crBrush)
{
 m_iPolygonNumbers = m_iPolygonNumbers + 1;
 m_geoAtomPolygon =(geoatom::CGeoAtomPolygon**)realloc(m_geoAtomPolygon,m_iPolygonNumbers*sizeof(geoatom::CGeoAtomPolygon*));
 m_geoAtomPolygon[m_iPolygonNumbers-1] = new geoatom::CGeoAtomPolygon();  //原子分配内存,由于数组从0开始记数,标记总是比个数少1

 for (int m=0;m<PtList.size();m++)
 {
  m_geoAtomPolygon[m_iPolygonNumbers-1]->GetPtList()->add(m_fXaddition+m_iSize*PtList.get(m).x,m_fYaddition+m_fLength-m_iSize*PtList.get(m).y);
 }
 m_geoAtomPolygon[m_iPolygonNumbers-1]->SetColor(crPen);
 m_geoAtomPolygon[m_iPolygonNumbers-1]->SetFilledColor(crBrush);
 m_geoSymPoint[m_iPointSymbolNum-1]->AddAtom(m_geoAtomPolygon[m_iPolygonNumbers-1]); //将封闭区要素添加到这个符号中

}

void ExportSuperSymbol::AddSuperMapRectangle(double dLeftTopX,double dLeftTopY,double dRightBottomX,double dRightBottomY,COLORREF crPen,COLORREF crBrush)
{
 ///为填充的Rectangle
 m_iPolygonNumbers = m_iPolygonNumbers + 1;       //矩形属于Polygon一种
 m_geoAtomPolygon =(geoatom::CGeoAtomPolygon**)realloc(m_geoAtomPolygon,m_iPolygonNumbers*sizeof(geoatom::CGeoAtomPolygon*));
 m_geoAtomPolygon[m_iPolygonNumbers-1] = new geoatom::CGeoAtomPolygon();  //原子分配内存,由于数组从0开始记数,标记总是比个数少1

 //矩形的四个顶点
 m_geoAtomPolygon[m_iPolygonNumbers-1]->GetPtList()->add(m_fXaddition+m_iSize*dLeftTopX,m_fYaddition+m_fLength-m_iSize*dLeftTopY);
 m_geoAtomPolygon[m_iPolygonNumbers-1]->GetPtList()->add(m_fXaddition+m_iSize*dRightBottomX,m_fYaddition+m_fLength-m_iSize*dLeftTopY);
 m_geoAtomPolygon[m_iPolygonNumbers-1]->GetPtList()->add(m_fXaddition+m_iSize*dRightBottomX,m_fYaddition+m_fLength-m_iSize*dRightBottomY);
 m_geoAtomPolygon[m_iPolygonNumbers-1]->GetPtList()->add(m_fXaddition+m_iSize*dLeftTopX,m_fYaddition+m_fLength-m_iSize*dRightBottomY);

 m_geoAtomPolygon[m_iPolygonNumbers-1]->SetColor(crPen);
 m_geoAtomPolygon[m_iPolygonNumbers-1]->SetFilledColor(crBrush);
 m_geoSymPoint[m_iPointSymbolNum-1]->AddAtom(m_geoAtomPolygon[m_iPolygonNumbers-1]); //将封闭区要素添加到这个符号中
}

void ExportSuperSymbol::AddSuperMapEllipse(double dFirstX,double dFirstY,double dSecondX,double dSecondY,double dMajorRadio,double dMinorRadio,COLORREF crPen,COLORREF crBrush)
{
 m_iEllipseNumbers = m_iEllipseNumbers + 1;
 m_geoAtomEllipse = (geoatom::CGeoAtomEllipse**)realloc(m_geoAtomEllipse,m_iEllipseNumbers*sizeof(geoatom::CGeoAtomEllipse));
 m_geoAtomEllipse[m_iEllipseNumbers-1] = new geoatom::CGeoAtomEllipse();

 double dCenterX=0;    //圆心的位置
 double dCenterY=0;

 if(dFirstX<dSecondX&&dFirstY<dSecondY)
 {
  dCenterX = dFirstX+abs(dSecondX - dFirstX)/2;    //圆心的位置
  dCenterY = dFirstY+abs(dSecondY - dFirstY)/2;
 }
 else if(dFirstX<dSecondX&&dFirstY>dSecondY)
 {
  dCenterX = dFirstX+abs(dSecondX - dFirstX)/2;    //圆心的位置
  dCenterY = dSecondY+abs(dSecondY - dFirstY)/2;
 }
 else if(dFirstX>dSecondX&&dFirstY<dSecondY)
 {
  dCenterX = dSecondX+abs(dSecondX - dFirstX)/2;    //圆心的位置
  dCenterY = dFirstY+abs(dSecondY - dFirstY)/2;
 }
 else
 {
  dCenterX = dSecondX+abs(dSecondX - dFirstX)/2;    //圆心的位置
  dCenterY = dSecondY+abs(dSecondY - dFirstY)/2;
 }

 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetCenterPoint(m_fXaddition+m_iSize*dCenterX,m_fYaddition+m_fLength-m_iSize*dCenterY);
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMajorAxis(dMajorRadio*m_iSize);
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMinorAxis(dMinorRadio*m_iSize);
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(0.0);
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(6.2832);   //360角度与弧度的换算
 
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetColor(crPen);
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetFilled(true);     //要求填充
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetFilledColor(crBrush);
 m_geoSymPoint[m_iPointSymbolNum-1]->AddAtom(m_geoAtomEllipse[m_iEllipseNumbers-1]);
}

void ExportSuperSymbol::AddSuperMapArc(double dFirstX,double dFirstY,double dSecondX,double dSecondY,double dThirdX,double dThirdY,double dFourthX,double dFourthY,COLORREF crPen)
{
 double dCenterX = 0;    
 double dCenterY = 0;
 if(abs(dFirstX-dThirdX)<0.00001&&abs(dFirstY-dThirdY)<0.00001 && abs(dSecondX-dFourthX)<0.00001&&abs(dSecondY-dFourthY)<0.00001)
 {    //此椭圆特殊化为四分只一
  m_iEllipseNumbers = m_iEllipseNumbers + 1;
  m_geoAtomEllipse = (geoatom::CGeoAtomEllipse**)realloc(m_geoAtomEllipse,m_iEllipseNumbers*sizeof(geoatom::CGeoAtomEllipse));
  m_geoAtomEllipse[m_iEllipseNumbers-1] = new geoatom::CGeoAtomEllipse();

  if(dFirstX>dSecondX)          //分情况讨论,好比四个象限
  {
   if(dFirstY>dSecondY)
   {
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(0);  //0角度与弧度的换算,注意圆的旋转方向是逆或顺时针
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(1.5708);   //90角度与弧度的换算
    dCenterX = dSecondX;         //取第二个点的X数值
    dCenterY = dFirstY;          //取较大Y数值
   }
   else
   {
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(1.5708);  //90角度与弧度的换算,注意圆的旋转方向是逆或顺时针
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(3.1416);   //180角度与弧度的换算
    dCenterX = dFirstX;         //取第一个点的X数值
    dCenterY = dSecondY;         //取较大Y数值
   }
  }
  else
  {
   if(dFirstY<dSecondY)
   {
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(3.1416);  //180角度与弧度的换算,注意圆的旋转方向是逆或顺时针
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(4.7124);   //270角度与弧度的换算
    dCenterX = dSecondX;
    dCenterY = dFirstY;             //取较小Y数值
   }
   else
   {
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(4.7124);  //270角度与弧度的换算,注意圆的旋转方向是逆或顺时针
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(6.2832);   //360角度与弧度的换算
    dCenterX = dFirstX;
    dCenterY = dSecondY;            //取较小Y数值
   }
  }
  double dMajorRadio = 0;
  double dMinorRadio = 0;
  dMajorRadio = abs(dSecondX - dFirstX);    //得到半径
  dMinorRadio = abs(dSecondY - dFirstY);

  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetCenterPoint(m_fXaddition+m_iSize*dCenterX,m_fYaddition+m_fLength-m_iSize*dCenterY);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMajorAxis(dMajorRadio*m_iSize);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMinorAxis(dMinorRadio*m_iSize);

  m_geoSymPoint[m_iPointSymbolNum-1]->AddAtom(m_geoAtomEllipse[m_iEllipseNumbers-1]);     
 }
 else
 {        //给出长短轴端点和起终点的情况
  m_iEllipseNumbers = m_iEllipseNumbers + 1;
  m_geoAtomEllipse = (geoatom::CGeoAtomEllipse**)realloc(m_geoAtomEllipse,m_iEllipseNumbers*sizeof(geoatom::CGeoAtomEllipse));
  m_geoAtomEllipse[m_iEllipseNumbers-1] = new geoatom::CGeoAtomEllipse();

  
  double dAngleStart = 0;
  double dAngleEnd = 3.1416;    //单位为弧度,在函数库中角度均以弧度来表示

  if(dFirstX>dSecondX)     //比较起始点
  {
   if(dThirdX<dFourthX)
   {
    dCenterX = dFourthX;   //得到椭圆的中心
    dCenterY = dThirdY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

   }
   else if(dThirdX>dFourthX&&dThirdY<dFourthY)
   {
    dCenterX = dThirdX;
    dCenterY = dFourthY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

    if(dFirstX>dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart;

    if(dFirstX == dCenterX) dAngleStart = 1.5708;
    if(dFirstX<dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart + 3.1416;

    if(dSecondX<dCenterX&&dSecondY>dCenterY)  dAngleEnd = -dAngleEnd + 3.1416;
    if(dSecondX<dCenterX&&dSecondY<=dCenterY) dAngleEnd = -dAngleEnd+3.1416;
    if(dSecondX==dCenterX) dAngleStart = 3.1416;
   }
   else if(dThirdX>dFourthX&&dThirdY>dFourthY)
   {
    dCenterX = dFourthX;
    dCenterY = dThirdY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

    if(dFirstX>=dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart;
    if(dSecondX<dCenterX&&dSecondY<dCenterY) dAngleEnd = -dAngleEnd+3.1416;

   }
   else
   {
    dCenterX = dThirdX;
    dCenterY = dFourthY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

   }

  }
  else          //dFirstX<dSecondX
  {

   if(dThirdX<dFourthX&&dThirdY>dFourthY)
   {
    dCenterX = dThirdX;
    dCenterY = dFourthY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));   //返回的结果在-1.5708与1.5708之间
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

    if(dFirstX<dCenterX&&dFirstY>dCenterY) dAngleStart = -dAngleStart+3.1416;
    if(dSecondX>dCenterX&&dSecondY>dCenterY) dAngleEnd = - dAngleEnd + 6.2832;
   }
   else if(dThirdX<dFourthX&&dThirdY<dFourthY)
   {
    dCenterX = dFourthX;
    dCenterY = dThirdY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));   //返回的结果在-1.5708与1.5708之间
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

    if(dFirstX<dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart+3.1416;
    if(dSecondX>=dCenterX&&dSecondY>dCenterY) dAngleEnd = - dAngleEnd + 6.2832;

   }
   else if(dThirdX>dFourthX&&dThirdY<dFourthY)
   {
    dCenterX = dThirdX;
    dCenterY = dFourthY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));
    
    if(dFirstX<dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart+3.1416;
    if(dFirstX>dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart;
    if(dSecondX>dCenterX&&dSecondY>dCenterY) dAngleEnd = - dAngleEnd + 6.2832;
   }
   else
   {
    dCenterX = dFourthX;
    dCenterY = dThirdY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));
   }

  }

  double dMajorRadio = abs(dThirdX - dFourthX);  //通过第三和第四个点求得
  double dMinorRadio = abs(dThirdY - dFourthY);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(dAngleStart);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(dAngleEnd);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetCenterPoint(m_fXaddition+m_iSize*dCenterX,m_fYaddition+m_fLength-m_iSize*dCenterY);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMajorAxis(dMajorRadio*m_iSize);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMinorAxis(dMinorRadio*m_iSize);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetColor(crPen);
  m_geoSymPoint[m_iPointSymbolNum-1]->AddAtom(m_geoAtomEllipse[m_iEllipseNumbers-1]);
 }
}

附参考代码:
 

void ExportSuperSymbol::AddSuperMapPolygon(Vertex2dVector &PtList,COLORREF crPen,COLORREF crBrush)
{
 m_iPolygonNumbers = m_iPolygonNumbers + 1;
 m_geoAtomPolygon =(geoatom::CGeoAtomPolygon**)realloc(m_geoAtomPolygon,m_iPolygonNumbers*sizeof(geoatom::CGeoAtomPolygon*));
 m_geoAtomPolygon[m_iPolygonNumbers-1] = new geoatom::CGeoAtomPolygon();  //原子分配内存,由于数组从0开始记数,标记总是比个数少1

 for (int m=0;m<PtList.size();m++)
 {
  m_geoAtomPolygon[m_iPolygonNumbers-1]->GetPtList()->add(m_fXaddition+m_iSize*PtList.get(m).x,m_fYaddition+m_fLength-m_iSize*PtList.get(m).y);
 }
 m_geoAtomPolygon[m_iPolygonNumbers-1]->SetColor(crPen);
 m_geoAtomPolygon[m_iPolygonNumbers-1]->SetFilledColor(crBrush);
 m_geoSymPoint[m_iPointSymbolNum-1]->AddAtom(m_geoAtomPolygon[m_iPolygonNumbers-1]); //将封闭区要素添加到这个符号中

}

void ExportSuperSymbol::AddSuperMapRectangle(double dLeftTopX,double dLeftTopY,double dRightBottomX,double dRightBottomY,COLORREF crPen,COLORREF crBrush)
{
 ///为填充的Rectangle
 m_iPolygonNumbers = m_iPolygonNumbers + 1;       //矩形属于Polygon一种
 m_geoAtomPolygon =(geoatom::CGeoAtomPolygon**)realloc(m_geoAtomPolygon,m_iPolygonNumbers*sizeof(geoatom::CGeoAtomPolygon*));
 m_geoAtomPolygon[m_iPolygonNumbers-1] = new geoatom::CGeoAtomPolygon();  //原子分配内存,由于数组从0开始记数,标记总是比个数少1

 //矩形的四个顶点
 m_geoAtomPolygon[m_iPolygonNumbers-1]->GetPtList()->add(m_fXaddition+m_iSize*dLeftTopX,m_fYaddition+m_fLength-m_iSize*dLeftTopY);
 m_geoAtomPolygon[m_iPolygonNumbers-1]->GetPtList()->add(m_fXaddition+m_iSize*dRightBottomX,m_fYaddition+m_fLength-m_iSize*dLeftTopY);
 m_geoAtomPolygon[m_iPolygonNumbers-1]->GetPtList()->add(m_fXaddition+m_iSize*dRightBottomX,m_fYaddition+m_fLength-m_iSize*dRightBottomY);
 m_geoAtomPolygon[m_iPolygonNumbers-1]->GetPtList()->add(m_fXaddition+m_iSize*dLeftTopX,m_fYaddition+m_fLength-m_iSize*dRightBottomY);

 m_geoAtomPolygon[m_iPolygonNumbers-1]->SetColor(crPen);
 m_geoAtomPolygon[m_iPolygonNumbers-1]->SetFilledColor(crBrush);
 m_geoSymPoint[m_iPointSymbolNum-1]->AddAtom(m_geoAtomPolygon[m_iPolygonNumbers-1]); //将封闭区要素添加到这个符号中
}

void ExportSuperSymbol::AddSuperMapEllipse(double dFirstX,double dFirstY,double dSecondX,double dSecondY,double dMajorRadio,double dMinorRadio,COLORREF crPen,COLORREF crBrush)
{
 m_iEllipseNumbers = m_iEllipseNumbers + 1;
 m_geoAtomEllipse = (geoatom::CGeoAtomEllipse**)realloc(m_geoAtomEllipse,m_iEllipseNumbers*sizeof(geoatom::CGeoAtomEllipse));
 m_geoAtomEllipse[m_iEllipseNumbers-1] = new geoatom::CGeoAtomEllipse();

 double dCenterX=0;    //圆心的位置
 double dCenterY=0;

 if(dFirstX<dSecondX&&dFirstY<dSecondY)
 {
  dCenterX = dFirstX+abs(dSecondX - dFirstX)/2;    //圆心的位置
  dCenterY = dFirstY+abs(dSecondY - dFirstY)/2;
 }
 else if(dFirstX<dSecondX&&dFirstY>dSecondY)
 {
  dCenterX = dFirstX+abs(dSecondX - dFirstX)/2;    //圆心的位置
  dCenterY = dSecondY+abs(dSecondY - dFirstY)/2;
 }
 else if(dFirstX>dSecondX&&dFirstY<dSecondY)
 {
  dCenterX = dSecondX+abs(dSecondX - dFirstX)/2;    //圆心的位置
  dCenterY = dFirstY+abs(dSecondY - dFirstY)/2;
 }
 else
 {
  dCenterX = dSecondX+abs(dSecondX - dFirstX)/2;    //圆心的位置
  dCenterY = dSecondY+abs(dSecondY - dFirstY)/2;
 }

 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetCenterPoint(m_fXaddition+m_iSize*dCenterX,m_fYaddition+m_fLength-m_iSize*dCenterY);
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMajorAxis(dMajorRadio*m_iSize);
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMinorAxis(dMinorRadio*m_iSize);
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(0.0);
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(6.2832);   //360角度与弧度的换算
 
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetColor(crPen);
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetFilled(true);     //要求填充
 m_geoAtomEllipse[m_iEllipseNumbers-1]->SetFilledColor(crBrush);
 m_geoSymPoint[m_iPointSymbolNum-1]->AddAtom(m_geoAtomEllipse[m_iEllipseNumbers-1]);
}

void ExportSuperSymbol::AddSuperMapArc(double dFirstX,double dFirstY,double dSecondX,double dSecondY,double dThirdX,double dThirdY,double dFourthX,double dFourthY,COLORREF crPen)
{
 double dCenterX = 0;    
 double dCenterY = 0;
 if(abs(dFirstX-dThirdX)<0.00001&&abs(dFirstY-dThirdY)<0.00001 && abs(dSecondX-dFourthX)<0.00001&&abs(dSecondY-dFourthY)<0.00001)
 {    //此椭圆特殊化为四分只一
  m_iEllipseNumbers = m_iEllipseNumbers + 1;
  m_geoAtomEllipse = (geoatom::CGeoAtomEllipse**)realloc(m_geoAtomEllipse,m_iEllipseNumbers*sizeof(geoatom::CGeoAtomEllipse));
  m_geoAtomEllipse[m_iEllipseNumbers-1] = new geoatom::CGeoAtomEllipse();

  if(dFirstX>dSecondX)          //分情况讨论,好比四个象限
  {
   if(dFirstY>dSecondY)
   {
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(0);  //0角度与弧度的换算,注意圆的旋转方向是逆或顺时针
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(1.5708);   //90角度与弧度的换算
    dCenterX = dSecondX;         //取第二个点的X数值
    dCenterY = dFirstY;          //取较大Y数值
   }
   else
   {
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(1.5708);  //90角度与弧度的换算,注意圆的旋转方向是逆或顺时针
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(3.1416);   //180角度与弧度的换算
    dCenterX = dFirstX;         //取第一个点的X数值
    dCenterY = dSecondY;         //取较大Y数值
   }
  }
  else
  {
   if(dFirstY<dSecondY)
   {
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(3.1416);  //180角度与弧度的换算,注意圆的旋转方向是逆或顺时针
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(4.7124);   //270角度与弧度的换算
    dCenterX = dSecondX;
    dCenterY = dFirstY;             //取较小Y数值
   }
   else
   {
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(4.7124);  //270角度与弧度的换算,注意圆的旋转方向是逆或顺时针
    m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(6.2832);   //360角度与弧度的换算
    dCenterX = dFirstX;
    dCenterY = dSecondY;            //取较小Y数值
   }
  }
  double dMajorRadio = 0;
  double dMinorRadio = 0;
  dMajorRadio = abs(dSecondX - dFirstX);    //得到半径
  dMinorRadio = abs(dSecondY - dFirstY);

  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetCenterPoint(m_fXaddition+m_iSize*dCenterX,m_fYaddition+m_fLength-m_iSize*dCenterY);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMajorAxis(dMajorRadio*m_iSize);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMinorAxis(dMinorRadio*m_iSize);

  m_geoSymPoint[m_iPointSymbolNum-1]->AddAtom(m_geoAtomEllipse[m_iEllipseNumbers-1]);     
 }
 else
 {        //给出长短轴端点和起终点的情况
  m_iEllipseNumbers = m_iEllipseNumbers + 1;
  m_geoAtomEllipse = (geoatom::CGeoAtomEllipse**)realloc(m_geoAtomEllipse,m_iEllipseNumbers*sizeof(geoatom::CGeoAtomEllipse));
  m_geoAtomEllipse[m_iEllipseNumbers-1] = new geoatom::CGeoAtomEllipse();

  
  double dAngleStart = 0;
  double dAngleEnd = 3.1416;    //单位为弧度,在函数库中角度均以弧度来表示

  if(dFirstX>dSecondX)     //比较起始点
  {
   if(dThirdX<dFourthX)
   {
    dCenterX = dFourthX;   //得到椭圆的中心
    dCenterY = dThirdY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

   }
   else if(dThirdX>dFourthX&&dThirdY<dFourthY)
   {
    dCenterX = dThirdX;
    dCenterY = dFourthY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

    if(dFirstX>dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart;

    if(dFirstX == dCenterX) dAngleStart = 1.5708;
    if(dFirstX<dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart + 3.1416;

    if(dSecondX<dCenterX&&dSecondY>dCenterY)  dAngleEnd = -dAngleEnd + 3.1416;
    if(dSecondX<dCenterX&&dSecondY<=dCenterY) dAngleEnd = -dAngleEnd+3.1416;
    if(dSecondX==dCenterX) dAngleStart = 3.1416;
   }
   else if(dThirdX>dFourthX&&dThirdY>dFourthY)
   {
    dCenterX = dFourthX;
    dCenterY = dThirdY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

    if(dFirstX>=dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart;
    if(dSecondX<dCenterX&&dSecondY<dCenterY) dAngleEnd = -dAngleEnd+3.1416;

   }
   else
   {
    dCenterX = dThirdX;
    dCenterY = dFourthY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

   }

  }
  else          //dFirstX<dSecondX
  {

   if(dThirdX<dFourthX&&dThirdY>dFourthY)
   {
    dCenterX = dThirdX;
    dCenterY = dFourthY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));   //返回的结果在-1.5708与1.5708之间
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

    if(dFirstX<dCenterX&&dFirstY>dCenterY) dAngleStart = -dAngleStart+3.1416;
    if(dSecondX>dCenterX&&dSecondY>dCenterY) dAngleEnd = - dAngleEnd + 6.2832;
   }
   else if(dThirdX<dFourthX&&dThirdY<dFourthY)
   {
    dCenterX = dFourthX;
    dCenterY = dThirdY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));   //返回的结果在-1.5708与1.5708之间
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));

    if(dFirstX<dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart+3.1416;
    if(dSecondX>=dCenterX&&dSecondY>dCenterY) dAngleEnd = - dAngleEnd + 6.2832;

   }
   else if(dThirdX>dFourthX&&dThirdY<dFourthY)
   {
    dCenterX = dThirdX;
    dCenterY = dFourthY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));
    
    if(dFirstX<dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart+3.1416;
    if(dFirstX>dCenterX&&dFirstY<dCenterY) dAngleStart = -dAngleStart;
    if(dSecondX>dCenterX&&dSecondY>dCenterY) dAngleEnd = - dAngleEnd + 6.2832;
   }
   else
   {
    dCenterX = dFourthX;
    dCenterY = dThirdY;

    dAngleStart = atan((dFirstY - dCenterY)/(dFirstX - dCenterX));
    dAngleEnd = atan((dSecondY - dCenterY)/(dSecondX - dCenterX));
   }

  }

  double dMajorRadio = abs(dThirdX - dFourthX);  //通过第三和第四个点求得
  double dMinorRadio = abs(dThirdY - dFourthY);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetStartAngleRad(dAngleStart);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetEndAngleRad(dAngleEnd);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetCenterPoint(m_fXaddition+m_iSize*dCenterX,m_fYaddition+m_fLength-m_iSize*dCenterY);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMajorAxis(dMajorRadio*m_iSize);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetMinorAxis(dMinorRadio*m_iSize);
  m_geoAtomEllipse[m_iEllipseNumbers-1]->SetColor(crPen);
  m_geoSymPoint[m_iPointSymbolNum-1]->AddAtom(m_geoAtomEllipse[m_iEllipseNumbers-1]);
 }
}

 

9 7 3 1 2 3 4 8 :

(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  

    关于我们 友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.

                   滇ICP备05006901号