|
|
【答案】应助回帖
★ ★ ★ 遥望下一站: 金币+3, ★★★很有帮助 2012-07-24 09:02:17
不用OpenGL,直接调用MFC画图
//画配送车辆路线图
void CvrpView: rawCordTrend()
{
CWnd* pWnd;
POINT ps[2];
CString strFlag,str;
CRect rect,rectempty;
CDC* pDC;
CPen pen,*pOldPen,pen2,penEmpty;
CBrush brush,*pOldBrush;
POINT ptOrig;
COLORREF crRef;
int i,iXNum,iYNum,iXStep,iYStep;
long iXCenter,iYCenter,X,Y;
double dAltiMax,dAltiMin,dLongMax,dLongMin,dLatiMax,dLatiMin;
pWnd = (CStatic*)GetDlgItem( IDC_STATIC_TREND );
pWnd->Invalidate( );
pWnd->GetWindowRect(& rect );
pWnd->ScreenToClient(&rect);
pWnd->GetWindowRect(&rectempty );
pWnd->ScreenToClient(&rectempty);
rect.left += 18;//18
rect.top += 18; //15
rect.right -= 18;//10
rect.bottom -= 18; //10
ptOrig.x = rect.left;
ptOrig.y = ( rect.bottom + rect.top ) / 2 ;
iXCenter = rect.left;
iYCenter = ( rect.bottom + rect.top ) / 2 ;
pDC = pWnd->GetDC();
//背景透明
pDC->SetBkMode( TRANSPARENT );
//通用笔,灰白色
pen2.CreatePen(PS_SOLID,1,RGB(128,128,128) );
pen.CreatePen(PS_SOLID,1,RGB(0,126,0) );
//画空载返回的笔
penEmpty.CreatePen(PS_DOT,1,RGB(255,0,0) );
pOldPen = pDC->SelectObject(&pen2);
//刷子
brush.CreateSolidBrush( RGB( 255,255,255) );
pOldBrush = pDC->SelectObject( &brush);
pDC->FillRect( &rect,&brush );
pDC->SelectObject(&pen2);
iXNum = 20;//25,15.95,19.14
iYNum = 17.22;//25,14.35
//iXStep = ( rect.right - rect.left ) / ( 2 * iXNum );
iXStep = ( rect.right - rect.left ) / iXNum;
iYStep = ( rect.bottom - rect.top ) / ( 2 * iYNum );
//画所有点
m_clientrelcord[0][0]=iXCenter;
m_clientrelcord[0][1]=iYCenter;
for(i=0;i
{
X=m_clientcord[0]*iXStep;
Y=-m_clientcord[1]*iYStep;
X+=iXCenter;
Y+=iYCenter;
pDC->MoveTo(X,Y);
if(i==0)
{
m_strTest="O";
pDC->TextOut(X-12,Y-8,m_strTest);
}
else
{
m_strTest.Format("%d",i);
pDC->TextOut(X,Y,m_strTest);
}
pDC->MoveTo(X,Y);
m_clientrelcord[0]=X;
m_clientrelcord[1]=Y;
pDC->Ellipse(X-3,Y-3,X+3,Y+3);
}
//画路线图
float fload,fcurrcost =0;
int j=0;
int iSubIndex=0;
BOOL bCenter = TRUE;
fload=0;
chromo chro=m_chromo[0];
chro.fCost = 0;
//染色体(路线图)格式:0 123 0 456 0 789 0 1011 0 1213 0
for(iSubIndex = 0; iSubIndex <= chro.iSubCount; iSubIndex++)
{
while(true)
{
if(chro.nRoute[j] == 0)//从配送中心出来或返回
{
if (bCenter)//从配送中心出来
{
bCenter = FALSE;
}
else //返回配送中心010 010230
{
//当前子路径空车返回
pDC->SelectObject(&penEmpty);
X=m_clientrelcord[chro.nRoute[j-1]][0];
Y=m_clientrelcord[chro.nRoute[j-1]][1];
if(chro.nRoute[j-2]==0)//只有一个节点
{
ps[0].x=X;
ps[0].y=Y;
ps[1].x=iXCenter;
ps[1].y=iYCenter;
pDC->MoveTo(X+3 , Y-1);
pDC->LineTo(iXCenter , iYCenter);
}
else
pDC->LineTo(iXCenter , iYCenter);
j++;
break;
}
}
else //中间客户
{
if(chro.nRoute[j-1] == 0) //从中心出来的第一个节点
{
pDC->SelectObject(&pen2);
pDC->MoveTo( iXCenter , iYCenter );
pDC->LineTo(m_clientrelcord[chro.nRoute[j]][0],m_clientrelcord[chro.nRoute[j]][1]);
}
else //非第一个节点
{
fload -= m_clientreq[chro.nRoute[j-1]];
fcurrcost += fload*m_distance[chro.nRoute[j-1]][chro.nRoute[j]];
pDC->SelectObject(&pen2);
X=m_clientrelcord[chro.nRoute[j-1]][0];
Y=m_clientrelcord[chro.nRoute[j-1]][1];
pDC->MoveTo( X , Y );
pDC->LineTo(m_clientrelcord[chro.nRoute[j]][0],m_clientrelcord[chro.nRoute[j]][1]);
}
}
j++;
}//end of: while(true)
}//end of:for(iSubIndex = 0; iSubIndex <= m_chromo[iIndex].iSubCount; iSubIndex++)
//end of:画路线图
//恢复系统原来的画笔
pDC->SelectObject( pOldPen );
pDC->SelectObject( pOldBrush );
ReleaseDC( pDC );
pDC = NULL;
} |
|