void CPage_Node_Lane::DrawMovements(CPaintDC *pDC,CRect PlotRect) { CPen NormalPen(PS_SOLID,2,RGB(0,0,0)); CPen TimePen(PS_DOT,1,RGB(0,0,0)); CPen DataPen(PS_SOLID,0,RGB(0,0,0)); CPen SelectedPen(PS_SOLID,4,RGB(255,0,0)); CPen SelectedPhasePen(PS_SOLID,4,RGB(0,0,255)); CPen redPen(PS_SOLID,3,RGB(255,0,0)); CPen bluePen(PS_SOLID,3,RGB(0,0,255)); CBrush WhiteBrush(RGB(255,255,255)); pDC->SetBkMode(TRANSPARENT); CPen *pOldPen = pDC->SelectObject(&DataPen); CBrush *pOldBrush = pDC->SelectObject(&WhiteBrush); pDC->Rectangle (PlotRect); pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); }
void CPage_Node_Phase::DrawMovements(CPaintDC* pDC,CRect PlotRect, bool bPhaseWindow =false) { m_MovementBezierVector.clear(); CPen NormalPen(PS_SOLID,2,RGB(0,0,0)); CPen TimePen(PS_DOT,1,RGB(0,0,0)); CPen DASHPen(PS_SOLID,1,RGB(255,178,102)); CPen DataPen(PS_SOLID,0,RGB(0,0,0)); CPen SelectedPen(PS_SOLID,3,RGB(255,0,0)); CPen SelectedPhasePen(PS_SOLID,4,RGB(0,0,255)); CBrush WhiteBrush(RGB(255,255,255)); pDC->SetBkMode(TRANSPARENT); pDC->SelectObject(&DataPen); pDC->SelectObject(&WhiteBrush); pDC->Rectangle (PlotRect); CString str; if(bPhaseWindow == true ) { str.Format("Phase %d",m_SelectedPhaseNumber); pDC->TextOutA(PlotRect.left+10,PlotRect.top +5,str); } CBrush BrushLinkBand(RGB(152,245,255)); pDC->SelectObject(&BrushLinkBand); DTANode* pNode = m_pDoc->m_NodeNoMap [m_CurrentNodeID]; int node_size = 10; int node_set_back = 50; int link_length = 100; int lane_width = 10; int text_length = link_length+ 20; str.Format("%d",m_CurrentNodeNumber); if(bPhaseWindow == false || m_SelectedPhaseNumber == 1) pDC->TextOutA( PlotRect.CenterPoint().x-5, PlotRect.CenterPoint().y-5,str); for (unsigned int i=0;i< pNode->m_MovementDataMap["ALLDAY"].m_MovementVector .size();i++) { DTANodeMovement movement = pNode->m_MovementDataMap["ALLDAY"].m_MovementVector[i]; if( m_pDoc->m_hide_non_specified_movement_on_freeway_and_ramp && movement.bNonspecifiedTurnDirectionOnFreewayAndRamps && i != m_SelectedMovementIndex) continue; DTALink* pInLink = m_pDoc->m_LinkNoMap [movement.IncomingLinkNo]; DTALink* pOutLink = m_pDoc->m_LinkNoMap [movement.OutgoingLinkNo ]; GDPoint p1, p2, p3; // 1: fetch all data p1 = m_pDoc->m_NodeNoMap[movement.in_link_from_node_id ]->pt; p2 = m_pDoc->m_NodeNoMap[movement.in_link_to_node_id ]->pt; p3 = m_pDoc->m_NodeNoMap[movement.out_link_to_node_id]->pt; double DeltaX = p2.x - p1.x ; double DeltaY = p2.y - p1.y ; double theta = atan2(DeltaY, DeltaX); GDPoint p1_new, p2_new, p3_new; GDPoint p1_text, p3_text; GDPoint pt_movement[3]; // 2. set new origin p2_new.x = (-1)*node_set_back*cos(theta); p2_new.y = (-1)*node_set_back*sin(theta); int link_mid_offset = (pInLink->m_NumberOfLanes/2 +1)*lane_width; // mid pt_movement[0].x = p2_new.x + link_mid_offset* cos(theta-PI/2.0f); pt_movement[0].y = p2_new.y + link_mid_offset* sin(theta-PI/2.0f); // 3 determine the control point for PolyBezier float control_point_ratio = 0; if(movement.movement_turn == DTA_Through ) { control_point_ratio = 0; }else if(movement.movement_turn == DTA_LeftTurn ) { control_point_ratio = 1.2; }else { control_point_ratio = 0.5; } pt_movement[1].x = pt_movement[0].x + node_set_back*control_point_ratio*cos(theta); pt_movement[1].y = pt_movement[0].y + node_set_back*control_point_ratio*sin(theta); if(bPhaseWindow == true) { link_length = 1; text_length = node_set_back+10; } p1_new.x = (-1)*link_length*cos(theta); p1_new.y = (-1)*link_length*sin(theta); p1_text.x= (-1)*(text_length)*cos(theta); p1_text.y= (-1)*(text_length)*sin(theta); // 4: draw from node name str.Format("%d",m_pDoc->m_NodeNoMap [movement.in_link_from_node_id]->m_NodeNumber ); if(p1_text.y < -50) p1_text.y +=10; CPoint pt_text = NPtoSP(p1_text); if(bPhaseWindow == false || m_SelectedPhaseNumber == 1) { pDC->SetTextColor(RGB(0,0,255)); pDC->TextOutA(pt_text.x-10,pt_text.y,str); pDC->SetTextColor(RGB(0,0,0)); } if(bPhaseWindow == false) DrawLink(pDC,p1_new,p2_new,pInLink->m_NumberOfLanes,theta,lane_width); //////////////////////////////////////////// //5: outgoing link DeltaX = p3.x - p2.x ; DeltaY = p3.y - p2.y ; theta = atan2(DeltaY, DeltaX); // set new origin p2_new.x = node_set_back*cos(theta); p2_new.y = node_set_back*sin(theta); link_mid_offset = (pOutLink->m_NumberOfLanes/2+1)*lane_width; pt_movement[2].x = p2_new.x + link_mid_offset* cos(theta-PI/2.0f); pt_movement[2].y = p2_new.y + link_mid_offset* sin(theta-PI/2.0f); p3_new.x = link_length*cos(theta); p3_new.y = link_length*sin(theta); p3_text.x= text_length*cos(theta); p3_text.y= text_length*sin(theta); if(bPhaseWindow == false) DrawLink(pDC,p2_new,p3_new,pOutLink->m_NumberOfLanes,theta,lane_width); DTALink * pRevLink = NULL; //reversed link unsigned long ReversedLinkKey = m_pDoc->GetLinkKey(pOutLink->m_ToNodeID, pOutLink->m_FromNodeID); int reversed_link_id = 0; if ( m_pDoc->m_NodeNotoLinkMap.find ( ReversedLinkKey) == m_pDoc->m_NodeNotoLinkMap.end()) { str.Format("%d",m_pDoc->m_NodeNoMap [movement.out_link_to_node_id ]->m_NodeNumber ); if(p3_text.y < -50) p3_text.y +=10; pt_text = NPtoSP(p3_text); if(bPhaseWindow == false || m_SelectedPhaseNumber == 1) pDC->TextOutA(pt_text.x-10,pt_text.y,str); } // draw movement CPoint Point_Movement[4]; if(i == m_SelectedMovementIndex) { pDC->SelectObject(&SelectedPen); } else { //if(m_ListCtrl.GetItemText (i,4).Find("Prohibited") != -1) // select prohibited movement pen: // pDC->SelectObject(&g_PenProhibitedMovement); //else // pDC->SelectObject(&NormalPen); } if(movement.movement_turn == DTA_LeftTurn ) { float weight = 0.9; pt_movement[1].x = (1-weight)*(pt_movement[0].x + pt_movement[2].x)/2 +0*weight; pt_movement[1].y = (1-weight)*(pt_movement[0].y + pt_movement[2].y)/2 +0*weight; } Point_Movement[0]= NPtoSP(pt_movement[0]); Point_Movement[1]= NPtoSP(pt_movement[1]); Point_Movement[2]= NPtoSP(pt_movement[1]); Point_Movement[3]= NPtoSP(pt_movement[2]); Point_Movement[0]= NPtoSP(pt_movement[0]); Point_Movement[1]= NPtoSP(pt_movement[1]); Point_Movement[2]= NPtoSP(pt_movement[1]); Point_Movement[3]= NPtoSP(pt_movement[2]); MovementBezier element(Point_Movement[0], Point_Movement[1],Point_Movement[3]); m_MovementBezierVector.push_back (element); if(m_bHideRightTurnMovement &&( pNode->m_MovementDataMap["ALLDAY"].m_MovementVector[i].movement_turn == DTA_RightTurn || pNode->m_MovementDataMap["ALLDAY"].m_MovementVector[i].movement_turn == DTA_RightTurn2)) continue; bool bMovementIncluded = false; if(m_SelectedPhaseNumber >=1) { bMovementIncluded = m_pDoc->IfMovementIncludedInPhase(m_CurrentNodeNumber ,m_pDoc->m_TimingPlanVector [ m_SelectedTimingPlanNo].timing_plan_name,m_SelectedPhaseNumber, movement.in_link_from_node_id,movement.out_link_to_node_id ); } if(m_SelectedPhaseNumber <=0 || /* all phases*/ m_SelectedPhaseNumber>=1 && ( bMovementIncluded == true || m_bPhasingDataEditMode) ) // seleted phase { pDC->SelectObject(&NormalPen); if(m_SelectedPhaseNumber>=1 && m_bPhasingDataEditMode) { if( bMovementIncluded == true) pDC->SelectObject(&NormalPen); else pDC->SelectObject(&DASHPen); } if(i == m_SelectedMovementIndex && m_bPhasingDataEditMode) { pDC->SelectObject(&SelectedPen); } //overwrite if(i == m_SelectedMovementIndex) { pDC->SelectObject(&SelectedPen); } pDC->PolyBezier(Point_Movement,4); bool bShowArrow = false; if(m_SelectedPhaseNumber>=1 && bMovementIncluded == true) { bShowArrow = true; } if(bShowArrow) { CPoint FromPoint = Point_Movement[2] ; CPoint ToPoint = Point_Movement[3]; CPoint arrow_pts[3]; double slopy = atan2((double)(FromPoint.y - ToPoint.y), (double)(FromPoint.x - ToPoint.x)); double cosy = cos(slopy); double siny = sin(slopy); double display_length = sqrt((double)(FromPoint.y - ToPoint.y)*(FromPoint.y - ToPoint.y)+(double)(FromPoint.x - ToPoint.x)*(FromPoint.x - ToPoint.x)); double arrow_size = min(10,display_length/3.0); if(arrow_size>0.2) { arrow_pts[0] = ToPoint; arrow_pts[1].x = ToPoint.x + (int)(arrow_size * cosy - (arrow_size / 2.0 * siny) + 0.5); arrow_pts[1].y = ToPoint.y + (int)(arrow_size * siny + (arrow_size / 2.0 * cosy) + 0.5); arrow_pts[2].x = ToPoint.x + (int)(arrow_size * cosy + arrow_size / 2.0 * siny + 0.5); arrow_pts[2].y = ToPoint.y - (int)(arrow_size / 2.0 * cosy - arrow_size * siny + 0.5); pDC->Polygon(arrow_pts, 3); } } } //restore pen pDC->SelectObject(&DataPen); } }
void CPage_Node_LaneTurn::DrawMovements(CPaintDC* pDC,CRect PlotRect) { m_MovementBezierVector.clear(); CPen NormalPen(PS_SOLID,2,RGB(0,0,0)); CPen TimePen(PS_DOT,1,RGB(0,0,0)); CPen DataPen(PS_SOLID,0,RGB(0,0,0)); CPen SelectedPen(PS_SOLID,4,RGB(255,0,0)); CPen SelectedPhasePen(PS_SOLID,4,RGB(0,0,255)); CBrush WhiteBrush(RGB(255,255,255)); pDC->SetBkMode(TRANSPARENT); pDC->SelectObject(&DataPen); pDC->SelectObject(&WhiteBrush); pDC->Rectangle (PlotRect); CBrush BrushLinkBand(RGB(152,245,255)); pDC->SelectObject(&BrushLinkBand); DTANode* pNode = m_pDoc->m_NodeIDMap [m_CurrentNodeID]; int node_size = 10; int node_set_back = 50; int link_length = 150; int lane_width = 10; int text_length = link_length+ 20; CString str; str.Format("%d",m_CurrentNodeName); pDC->TextOutA( PlotRect.CenterPoint().x-5, PlotRect.CenterPoint().y-5,str); for (unsigned int i=0;i< pNode->m_MovementVector .size();i++) { DTANodeMovement movement = pNode->m_MovementVector[i]; DTALink* pInLink = m_pDoc->m_LinkNoMap [movement.IncomingLinkID]; DTALink* pOutLink = m_pDoc->m_LinkNoMap [movement.OutgoingLinkID ]; GDPoint p1, p2, p3; // 1: fetch all data p1 = m_pDoc->m_NodeIDMap[movement.in_link_from_node_id ]->pt; p2 = m_pDoc->m_NodeIDMap[movement.in_link_to_node_id ]->pt; p3 = m_pDoc->m_NodeIDMap[movement.out_link_to_node_id]->pt; double DeltaX = p2.x - p1.x ; double DeltaY = p2.y - p1.y ; double theta = atan2(DeltaY, DeltaX); GDPoint p1_new, p2_new, p3_new; GDPoint p1_text, p3_text; GDPoint pt_movement[3]; // 2. set new origin p2_new.x = (-1)*node_set_back*cos(theta); p2_new.y = (-1)*node_set_back*sin(theta); int link_mid_offset = (pInLink->m_NumberOfLanes/2 +1)*lane_width; // mid pt_movement[0].x = p2_new.x + link_mid_offset* cos(theta-PI/2.0f); pt_movement[0].y = p2_new.y + link_mid_offset* sin(theta-PI/2.0f); // 3 determine the control point for PolyBezier float control_point_ratio = 0; if(movement.movement_turn == DTA_Through ) { control_point_ratio = 0; }else if(movement.movement_turn == DTA_LeftTurn ) { control_point_ratio = 1.2; }else { control_point_ratio = 0.5; } pt_movement[1].x = pt_movement[0].x + node_set_back*control_point_ratio*cos(theta); pt_movement[1].y = pt_movement[0].y + node_set_back*control_point_ratio*sin(theta); p1_new.x = (-1)*link_length*cos(theta); p1_new.y = (-1)*link_length*sin(theta); p1_text.x= (-1)*(text_length)*cos(theta); p1_text.y= (-1)*(text_length)*sin(theta); // 4: draw from node name str.Format("%d",m_pDoc->m_NodeIDtoNameMap [movement.in_link_from_node_id]); if(p1_text.y < -50) p1_text.y +=10; CPoint pt_text = NPtoSP(p1_text); pDC->TextOutA(pt_text.x-10,pt_text.y,str); DrawLink(pDC,p1_new,p2_new,pInLink->m_NumberOfLanes,theta,lane_width); //////////////////////////////////////////// //5: outgoing link DeltaX = p3.x - p2.x ; DeltaY = p3.y - p2.y ; theta = atan2(DeltaY, DeltaX); // set new origin p2_new.x = node_set_back*cos(theta); p2_new.y = node_set_back*sin(theta); link_mid_offset = (pOutLink->m_NumberOfLanes/2+1)*lane_width; pt_movement[2].x = p2_new.x + link_mid_offset* cos(theta-PI/2.0f); pt_movement[2].y = p2_new.y + link_mid_offset* sin(theta-PI/2.0f); p3_new.x = link_length*cos(theta); p3_new.y = link_length*sin(theta); p3_text.x= text_length*cos(theta); p3_text.y= text_length*sin(theta); //draw to node name str.Format("%d",m_pDoc->m_NodeIDtoNameMap [movement.out_link_to_node_id]); if(p3_text.y < -100) p3_text.y +=10; pt_text = NPtoSP(p3_text); pDC->TextOutA(pt_text.x-10 ,pt_text.y,str); DrawLink(pDC,p2_new,p3_new,pOutLink->m_NumberOfLanes,theta,lane_width); // draw movement CPoint Point_Movement[4]; if(i == m_SelectedMovementIndex) pDC->SelectObject(&SelectedPen); else pDC->SelectObject(&NormalPen); Point_Movement[0]= NPtoSP(pt_movement[0]); Point_Movement[1]= NPtoSP(pt_movement[1]); Point_Movement[2]= NPtoSP(pt_movement[1]); Point_Movement[3]= NPtoSP(pt_movement[2]); Point_Movement[0]= NPtoSP(pt_movement[0]); Point_Movement[1]= NPtoSP(pt_movement[1]); Point_Movement[2]= NPtoSP(pt_movement[1]); Point_Movement[3]= NPtoSP(pt_movement[2]); MovementBezier element(Point_Movement[0], Point_Movement[1],Point_Movement[3]); m_MovementBezierVector.push_back (element); pDC->PolyBezier(Point_Movement,4); //restore pen pDC->SelectObject(&DataPen); } }
void CDlgPathMOE::DrawPlot(CPaintDC* pDC,int MOEType, CRect PlotRect) { CPen NormalPen(PS_SOLID,2,RGB(0,0,0)); CPen TimePen(PS_DOT,1,RGB(0,0,0)); CPen DataPen(PS_DOT,0,RGB(0,0,0)); CString str_MOE; pDC->SetBkMode(TRANSPARENT); pDC->SelectObject(&NormalPen); // draw title switch (MOEType) { case 0: str_MOE.Format ("Mean Travel Time (min)"); break; case 1: str_MOE.Format ("Max Travel Time (min)"); break; case 2: str_MOE.Format ("Travel Time Utility: Mean + 1.67*STD (min)"); break; case 3: str_MOE.Format ("Travel Time Band [Mean, Max] (min)"); break; case 4: str_MOE.Format ("Fuel Consumptions (gallon)"); break; case 5: str_MOE.Format ("CO2 Emissions (pound)"); break; case 6: str_MOE.Format ("Generalized Cost ($)"); break; } pDC->TextOut(PlotRect.right/2,PlotRect.top-20,str_MOE); // step 1: calculate m_YUpperBound; m_YUpperBound = 0; int i; // step 2: calculate m_UnitDistance; // data unit m_UnitDistance = 1; if((m_YUpperBound - m_YLowerBound)>0) m_UnitDistance = (float)(PlotRect.bottom - PlotRect.top)/(m_YUpperBound - m_YLowerBound); // step 3: time interval int TimeXPosition; int TimeInterval = g_FindClosestTimeResolution(m_TimeRight - m_TimeLeft); // time unit m_UnitTime = 1; if((m_TimeRight - m_TimeLeft)>0) m_UnitTime = (float)(PlotRect.right - PlotRect.left)/(m_TimeRight - m_TimeLeft); // step 4: draw time axis pDC->SelectObject(&TimePen); char buff[20]; for(i=m_TimeLeft;i<=m_TimeRight;i+=TimeInterval) { if(i == m_TimeLeft || i==m_TimeRight) { pDC->SelectObject(&NormalPen); // i = int((m_TimeLeft/TimeInterval)+0.5)*TimeInterval; // reset time starting point } else pDC->SelectObject(&DataPen); TimeXPosition=(long)(PlotRect.left+(i-m_TimeLeft)*m_UnitTime); if(i>= m_TimeLeft) { pDC->MoveTo(TimeXPosition,PlotRect.bottom+2); pDC->LineTo(TimeXPosition,PlotRect.top); if(i/2 <10) TimeXPosition-=5; else TimeXPosition-=3; if(TimeInterval < 60) { int hour, min; hour = i/60; min = i- hour*60; wsprintf(buff,"%2d:%02d",hour, min); } else { int min_in_a_day = i-int(i/1440*1440); wsprintf(buff,"%dh",min_in_a_day/60 ); } pDC->TextOut(TimeXPosition,PlotRect.bottom+3,buff); } } pDC->SelectObject(&s_PenSimulationClock); if(g_Simulation_Time_Stamp >=m_TimeLeft && g_Simulation_Time_Stamp <= m_TimeRight ) { TimeXPosition=(long)(PlotRect.left+(g_Simulation_Time_Stamp -m_TimeLeft)*m_UnitTime); pDC->MoveTo(TimeXPosition,PlotRect.bottom+2); pDC->LineTo(TimeXPosition,PlotRect.top); } m_YUpperBound = 0; m_YLowerBound = 0; TimeInterval = 15; int value_type = MOEType; if(MOEType==3) // band: use max value_type = 1; for(unsigned int p = 0; p < m_pDoc->m_PathDisplayList.size(); p++) { for(int t=m_TimeLeft;t<m_TimeRight;t+=TimeInterval) { if( m_YUpperBound < m_pDoc->m_PathDisplayList[p].GetTimeDependentMOE(t, value_type) ) m_YUpperBound = m_pDoc->m_PathDisplayList[p].GetTimeDependentMOE(t, value_type); } } if(m_YUpperBound>=10.0f) m_YUpperBound = (m_YUpperBound/10.0f+1.0f)*10.f; else m_YUpperBound = int(m_YUpperBound)+1.0f; float YInterval = 0.2f; if(m_YUpperBound>=2.0f) YInterval = 0.5f; if(m_YUpperBound>=5.0f) YInterval = 1.f; if(m_YUpperBound>=10.0f) YInterval = 2.0f; if(m_YUpperBound>=20.0f) YInterval = 5.0f; if(m_YUpperBound>=50.f) YInterval = 10.f; if(m_YUpperBound>=80.f) YInterval = 20.f; if(m_YUpperBound>=150.f) YInterval = 30.f; // data unit m_UnitData = 1.f; if((m_YUpperBound - m_YLowerBound)>0.0f) m_UnitData = (float)(PlotRect.bottom - PlotRect.top)/(m_YUpperBound - m_YLowerBound); // draw Y axis for(float ii=m_YLowerBound; ii <= m_YUpperBound; ii+= YInterval) { if( ii > m_YUpperBound) ii = m_YUpperBound; if(ii == m_YLowerBound) pDC->SelectObject(&NormalPen); else pDC->SelectObject(&DataPen); int TimeYPosition= PlotRect.bottom - (int)((ii*m_UnitData)+0.50f); pDC->MoveTo(PlotRect.left-2, TimeYPosition); pDC->LineTo(PlotRect.right,TimeYPosition); if(ii <= m_YUpperBound) { if(YInterval>=1) sprintf_s(buff,"%3.0f",ii); else sprintf_s(buff,"%3.1f",ii); pDC->TextOut(PlotRect.left-55,TimeYPosition-5,buff); } } if(MOEType!=3) { for(unsigned int p = 0; p < m_pDoc->m_PathDisplayList.size(); p++) { if(p== m_pDoc->m_SelectPathNo) g_SelectSuperThickPenColor(pDC,p); else g_SelectThickPenColor(pDC,p); for(int t=m_TimeLeft;t<m_TimeRight;t+=TimeInterval) { int TimeYPosition= PlotRect.bottom - (int)((m_pDoc->m_PathDisplayList[p].GetTimeDependentMOE(t, MOEType)*m_UnitData)+0.50); TimeXPosition=(long)(PlotRect.left+(t-m_TimeLeft)*m_UnitTime); if(t==m_TimeLeft) pDC->MoveTo(TimeXPosition,TimeYPosition); else pDC->LineTo(TimeXPosition,TimeYPosition); } } } // max travel time // draw band (mean, max) for selected paths if(MOEType==3) { POSITION pos = m_PathListControl.GetFirstSelectedItemPosition(); while (pos != NULL) { int p = m_PathListControl.GetNextSelectedItem(pos); TimeInterval = 15; if(p== m_pDoc->m_SelectPathNo) g_SelectSuperThickPenColor(pDC,p); CPoint pt[192]; int pt_count = 0; int t; for(t=0;t<1440;t+=15) { int TimeYPosition= PlotRect.bottom - (int)((m_pDoc->m_PathDisplayList[p].GetTimeDependentMOE(t, 1)*m_UnitData)+0.50); TimeXPosition=(long)(PlotRect.left+(t-m_TimeLeft)*m_UnitTime); pt[pt_count].x =TimeXPosition; pt[pt_count].y =TimeYPosition; pt_count++; } for(t=1440-15;t>=0;t-=15) { int TimeYPosition= PlotRect.bottom - (int)((m_pDoc->m_PathDisplayList[p].GetTimeDependentMOE(t, 0)*m_UnitData)+0.50); TimeXPosition=(long)(PlotRect.left+(t-m_TimeLeft)*m_UnitTime); pt[pt_count].x =TimeXPosition; pt[pt_count].y =TimeYPosition; pt_count++; } g_SelectThickPenColor(pDC,p); g_SelectBrushColor(pDC, p); pDC->Polygon (pt,192); } } /* // step 5: draw segments along the select path m_SegmentDistanceVector.resize(m_pDoc->m_PathDisplayList[m_pDoc->m_SelectPathNo]->m_LinkSize); for (i=0 ; i<m_pDoc->m_PathDisplayList[m_pDoc->m_SelectPathNo]->m_LinkSize; i++) { DTALink* pLink = m_pDoc->m_LinkNoMap[m_pDoc->m_PathDisplayList[m_pDoc->m_SelectPathNo]->m_LinkVector[i]]; if(pLink!=NULL) { m_YUpperBound+=pLink->m_Length ; m_SegmentDistanceVector[i] = m_YUpperBound; } } int TimeYPosition; int TimeYPositionPrev; for (i=0 ; i<m_pDoc->m_PathDisplayList[m_pDoc->m_SelectPathNo]->m_LinkSize; i++) { DTALink* pLink; // extra bottom line if(i == 0) { pLink = m_pDoc->m_LinkNoMap[m_pDoc->m_PathDisplayList[m_pDoc->m_SelectPathNo]->m_LinkVector[i]]; pDC->SelectObject(&NormalPen); TimeYPosition= PlotRect.bottom; TimeYPositionPrev = TimeYPosition; if(pLink!=NULL) { wsprintf(buff,"A: %d",pLink->m_FromNodeNumber ); pDC->TextOut(PlotRect.left-50,TimeYPosition-5,buff); } pDC->MoveTo(PlotRect.left-2, TimeYPosition); pDC->LineTo(PlotRect.right,TimeYPosition); } pDC->SelectObject(&DataPen); TimeYPosition= PlotRect.bottom - (int)((m_SegmentDistanceVector[i]*m_UnitDistance)+0.50); pDC->MoveTo(PlotRect.left-2, TimeYPosition); pDC->LineTo(PlotRect.right,TimeYPosition); pLink = m_pDoc->m_LinkNoMap[m_pDoc->m_PathDisplayList[m_pDoc->m_SelectPathNo]->m_LinkVector[i]]; if(pLink!=NULL) { if(i== m_pDoc->m_PathDisplayList[m_pDoc->m_SelectPathNo]->m_LinkSize-1) { wsprintf(buff,"B: %d",pLink->m_ToNodeNumber ); pDC->TextOut(PlotRect.left-50,TimeYPosition-5,buff); } else { if(TimeYPosition < TimeYPositionPrev-10 && TimeYPosition >= PlotRect.bottom-10) { wsprintf(buff,"%d",pLink->m_ToNodeNumber ); pDC->TextOut(PlotRect.left-40,TimeYPosition-5,buff); } } TimeYPositionPrev = TimeYPosition; } } // draw every day time series // step 5: draw segments along the select path pDC->SelectObject(&DataPen); int DepartureTime = 0; for(day = 0; day <Number_of_days; day++) { for (i=0 ; i<m_pDoc->m_PathDisplayList[m_pDoc->m_SelectPathNo]->m_LinkSize; i++) { DTALink* pLink; int TimeYPosition; pDC->MoveTo(PlotRect.left-2, TimeYPosition); pDC->LineTo(PlotRect.right,TimeYPosition); pLink = m_pDoc->m_LinkNoMap[m_PathDisplayList[m_pDoc->m_SelectPathNo]->m_LinkVector[i]]; } } */ }