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]);
}
}