#include "StdAfx.h"
|
#include "PathScheduler_Dual.h"
|
|
CPathScheduler_Dual::CPathScheduler_Dual(void)
|
{
|
}
|
|
|
CPathScheduler_Dual::~CPathScheduler_Dual(void)
|
{
|
}
|
|
int CPathScheduler_Dual::PathScheduling(const VectorPathData& vecPathData, const VectorPathData& vecStartPath)
|
{
|
if (vecStartPath.size()<1) return 0;
|
|
m_vecPathSchedulerResult.clear();
|
m_vecRangeRect.clear();
|
|
// init
|
CRect rtLeftRange(0, 0, m_PathSchedulerParam.GetGlassSizeX(), m_PathSchedulerParam.GetGlassSizeY());
|
CRect rtCenterRange(0, 0, m_PathSchedulerParam.GetGlassSizeX(), m_PathSchedulerParam.GetGlassSizeY());
|
CRect rtRightRange(0, 0, m_PathSchedulerParam.GetGlassSizeX(), m_PathSchedulerParam.GetGlassSizeY());
|
|
// set range
|
switch(m_PathSchedulerParam.GetOriginDir())
|
{
|
case SchedulerDir_LeftTop: // left top
|
case SchedulerDir_LeftBottom: // left bottom
|
rtLeftRange.left = 0;
|
rtLeftRange.right = (m_PathSchedulerParam.GetGlassSizeX() / 2) - (m_PathSchedulerParam.GetCollisionDistX()/2);
|
rtCenterRange.left = rtLeftRange.right;
|
rtCenterRange.right = (m_PathSchedulerParam.GetGlassSizeX() / 2) + (m_PathSchedulerParam.GetCollisionDistX()/2);
|
rtRightRange.left = rtCenterRange.right;
|
rtRightRange.right = m_PathSchedulerParam.GetGlassSizeX();
|
break;
|
|
case SchedulerDir_RightTop: // right top
|
case SchedulerDir_RightBottom: // right bottom
|
rtLeftRange.left = m_PathSchedulerParam.GetGlassSizeX();
|
rtLeftRange.right = (m_PathSchedulerParam.GetGlassSizeX() / 2) + (m_PathSchedulerParam.GetCollisionDistX()/2);
|
rtCenterRange.left = rtLeftRange.right;
|
rtCenterRange.right = (m_PathSchedulerParam.GetGlassSizeX() / 2) - (m_PathSchedulerParam.GetCollisionDistX()/2);
|
rtRightRange.left = rtCenterRange.right;
|
rtRightRange.right = 0;
|
break;
|
}
|
|
// normalize
|
rtLeftRange.NormalizeRect();
|
rtCenterRange.NormalizeRect();
|
rtRightRange.NormalizeRect();
|
|
// add range rect
|
m_vecRangeRect.push_back(rtLeftRange);
|
m_vecRangeRect.push_back(rtCenterRange);
|
m_vecRangeRect.push_back(rtRightRange);
|
|
// center
|
if (m_PathSchedulerParam.GetCenterCoord())
|
{
|
rtLeftRange.MoveToXY(-m_PathSchedulerParam.GetGlassSizeX()/2, -m_PathSchedulerParam.GetGlassSizeY()/2);
|
rtCenterRange.MoveToXY(-m_PathSchedulerParam.GetGlassSizeX()/2, -m_PathSchedulerParam.GetGlassSizeY()/2);
|
rtRightRange.MoveToXY(-m_PathSchedulerParam.GetGlassSizeX()/2, -m_PathSchedulerParam.GetGlassSizeY()/2);
|
}
|
|
// left gantry
|
CPathSchedulerResult scheduleResultLeft(vecStartPath[0].nIndex);
|
CalculatePath(vecStartPath[0], vecPathData, rtLeftRange, scheduleResultLeft);
|
|
// right gantry
|
CPathSchedulerResult scheduleResultRight(vecStartPath[1].nIndex);
|
CalculatePath(vecStartPath[1], vecPathData, rtRightRange, scheduleResultRight);
|
|
// ÃÑ À̵¿½Ã°£ ºñ±³
|
CPathSchedulerResult* pCenterScheduleResult = NULL;
|
if (scheduleResultLeft.GetTotalSchedulerTime() > scheduleResultRight.GetTotalSchedulerTime()) // left°¡ ¿À·¡°É¸®¸é
|
{
|
pCenterScheduleResult = &scheduleResultLeft;
|
}
|
else // right°¡ ¿À·¡°É¸®¸é
|
{
|
pCenterScheduleResult = &scheduleResultRight;
|
}
|
|
// center
|
const SSchedulerResult* pLastPoint = pCenterScheduleResult->GetPathSchedulerResult(pCenterScheduleResult->GetPathSchedulerResultCount()-1);
|
if (pLastPoint)
|
{
|
SPathData ptStartPath((int)(pLastPoint->dPositionX*1000.0), (int)(pLastPoint->dPositionY*1000.0));
|
CPathSchedulerResult scheduleResultCenter;
|
CalculatePath(ptStartPath, vecPathData, rtCenterRange, scheduleResultCenter);
|
|
if (scheduleResultLeft.GetTotalSchedulerTime() > scheduleResultRight.GetTotalSchedulerTime()) // left°¡ ¿À·¡°É¸®¸é
|
{
|
scheduleResultLeft.AddTailScheduleResult(scheduleResultCenter);
|
}
|
else // right°¡ ¿À·¡°É¸®¸é
|
{
|
scheduleResultRight.AddTailScheduleResult(scheduleResultCenter);
|
}
|
|
//m_vecPathSchedulerResult.push_back(scheduleResultCenter);
|
}
|
|
m_vecPathSchedulerResult.push_back(scheduleResultLeft);
|
m_vecPathSchedulerResult.push_back(scheduleResultRight);
|
|
return (int) m_vecPathSchedulerResult.size();
|
}
|