3DѰ·Ëã·¨£¬³öÏÖÆµ·±À»ØÎÊÌâ
½ÇÉ«ÐÐ×߯µ·±µã»÷µØÃæ½øÐÐÐÐ×ߣ¬»áƵ·±³öÏÖ¿Í»§¶Ë±»À»Ø¡£
À»ØµÄÔÒòÊǿͻ§¶ËµÄλÖúͷþÎñÆ÷µÄλÖóöÏÖÆ«²î¡£·þÎñÆ÷Ç¿ÖÆÀ»Ø¿Í»§¶Ë¡£¾¹ý³ÖÐø°ë¸öÔ¼ä¶ÏÐԵIJéÕÒ£¬ÖÕÓÚÕÒµ½ÔÒòÊÇ£¬ÒòΪ
int CCoordinatePath::GetCompletePath( DWORD dwNowTime )
{
// ÎÞ±äËÙµÄÒÆ¶¯¾àÀë¼ÆËã
DWORD dwMoveTime = dwNowTime-m_dwStartMoveTime;
return (m_nCompletePath + m_wCurSpeed*dwMoveTime/1000);
}
֮ǰÐÐ×ß¾àÀë½øÐÐÁËÈ¡Õû£¬²»Í£µÄ·¢ËͽÇÉ«ÐÐ×ߣ¬²»Í£µÄ¼ÆËã·¾¶³¤¶ÈµÄ¹ý³Ì£¬°Ñ½ÇÉ«ÐÐ×ß¾àÀë¸øÈ¡Õûʱ¹ýÂ˵ôÁË£¬×îÖÕµ¼Ö¿ͻ§¶Ë±È·þÎñÆ÷λÖÃÌáǰ£¬½øÐÐÀ»Ø¡£·þÎñÆ÷Ò²Ó¦¸ÃʹÓø¡µãÊý½øÐд¦ÀíÐÐ×ߣ¬ÕâÑù²ÅÄܱ£³Ö¿Í»§¶ËÓë·þÎñÆ÷ͬ²½¡£½â¾ö¿Í»§¶ËƵ·±À»ØµÄÎÊÌâ¡£ÏÂÃæÊÇÐ޸ĺóµÄ´úÂë¡£
»ñÈ¡½ÇÉ«µ±Ç°Î»ÖõÄÔ´´úÂ루ÐÞÕýºó£©CoordinatePath.zip£º
#pragma once
class CCoordinatePath
{
public:
CCoordinatePath(void);
~CCoordinatePath(void);
public:
// ¸üÐÂÐÐ×ß·¾¶
void UpdatePath(COORDINATE_3D stopCoordinate3D);
void UpdatePath(vector<COORDINATE_3DPATH> vtPath, COORDINATE_3D stopCoordinate3D, float nCompletePath = 0);
// ¿ªÊ¼ÐÐ×ß(ÒÆ¶¯¼ÆËã)
void StartMove(DWORD dwStartTime);
// »ñÈ¡µ±Ç°¿Õ¼äλÖÃ
COORDINATE_3D GetCoordinate(DWORD dwNowTime);
// »ñÈ¡ÐÐ×ß·¾¶
const vector<COORDINATE_3DPATH>* GetPath();
// »ñȡֹͣλÖÃ
COORDINATE_3D GetStopCoordinate();
// »ñÈ¡ÒÆ¶¯×ܾàÀë(´Ó¿ªÊ¼ÐÐ×ßµ½ÏÖÔÚµÄÐÐ×ß×ܾàÀë)
float GetCompletePath(DWORD dwNowTime);
// ¸üÐÂÍæ¼ÒËÙ¶È
void UpdateSpeed(unsigned short wSpeed, DWORD dwNowTime);
// »ñÈ¡µ±Ç°ËÙ¶È
unsigned short GetSpeed();
// Íæ¼ÒÊÇ·ñÕýÔÚÒÆ¶¯
bool IsMoving(DWORD dwNowTime);
private:
// ÐÐ×ß·¾¶
vector<COORDINATE_3DPATH> m_vtPath;
// Í£Ö¹µã
COORDINATE_3D m_stopCoordinate3D;
// ÒÑÍê³É·¾¶
float m_nCompletePath;
// Íæ¼Òµ±Ç°ËÙ¶È
unsigned short m_wCurSpeed;
// ÐÐ×ß·¾¶¿ªÊ¼Ê±¼ä
DWORD m_dwStartMoveTime;
};
#include "StdAfx.h"
#include "CoordinatePath.h"
CCoordinatePath::CCoordinatePath(void)
{
m_wCurSpeed = 4;
}
CCoordinatePath::~CCoordinatePath(void)
{
}
void CCoordinatePath::UpdatePath( COORDINATE_3D stopCoordinate3D )
{
m_vtPath.clear();
m_stopCoordinate3D = stopCoordinate3D;
m_nCompletePath = 0;
}
void CCoordinatePath::UpdatePath( vector<COORDINATE_3DPATH> vtPath, COORDINATE_3D stopCoordinate3D, float nCompletePath /*= 0*/ )
{
m_vtPath = vtPath;
m_stopCoordinate3D = stopCoordinate3D;
m_nCompletePath = nCompletePath;
}
void CCoordinatePath::StartMove( DWORD dwStartTime )
{
m_dwStartMoveTime = dwStartTime;
}
COORDINATE_3D CCoordinatePath::GetCoordinate(DWORD dwNowTime)
{
if (m_vtPath.size() == 0)
{
return m_stopCoordinate3D;
}
float nTotalDistance = GetCompletePath(dwNowTime);
if (nTotalDistance < 0)
{
cout << "¼ÆËãÍæ¼ÒÒÆ¶¯¾àÀë´íÎó" << endl;
return m_stopCoordinate3D;
}
// ceshi
//cout << "¾àÀ룺" << nTotalDistance << "ʱ¼ä" << (dwNowTime-m_dwStartMoveTime) << endl;
COORDINATE_3D coordinate3D;
// ÉÏÃæÒѾ¼ÆËã³öÍæ¼ÒÐÐ×ß×ܾàÀ룬¼ÆËãÍæ¼ÒλÖÃ
vector<COORDINATE_3DPATH>::iterator itPath = m_vtPath.begin();
for (; itPath!=m_vtPath.end(); ++itPath)
{
if (itPath->allDistance > nTotalDistance)
{
// ½ÇÉ«µ±Ç°Î»ÖÃÔÚµ±Ç°pathÖУ¬¼ÆË㵱ǰλÖÃ
float nCurDistance = nTotalDistance - (itPath->allDistance - itPath->curDistance);
if (nCurDistance < 0)
{
cout << "[ÑÏÖØ´íÎó]»ñÈ¡×ø±ê" << endl;
return m_stopCoordinate3D;
}
coordinate3D.x = itPath->x + itPath->dFormula*itPath->xDistance*nCurDistance;
coordinate3D.y = itPath->y + itPath->dFormula*itPath->yDistance*nCurDistance;
coordinate3D.z = itPath->z + itPath->dFormula*itPath->zDistance*nCurDistance;
coordinate3D.dir = itPath->dir;
if (coordinate3D.x ==1 && coordinate3D.y==1 && coordinate3D.z == 1)
{
int i = 0;
}
///yang
//cout << "µ±Ç°Òƶ¯×ø±ê£ºx:" << coordinate3D.x << ",y:" << coordinate3D.y << ",z:" << coordinate3D.z << endl;
///yang
return coordinate3D;
}
}
// µ½´ïÄ¿±êµã×öÏÈǰµã·¾¶µÄÇåÀí¹¤×÷
m_vtPath.clear();
return m_stopCoordinate3D;
}
const vector<COORDINATE_3DPATH>* CCoordinatePath::GetPath()
{
return &m_vtPath;
}
COORDINATE_3D CCoordinatePath::GetStopCoordinate()
{
return m_stopCoordinate3D;
}
float CCoordinatePath::GetCompletePath( DWORD dwNowTime )
{
// ÎÞ±äËÙµÄÒÆ¶¯¾àÀë¼ÆËã
DWORD dwMoveTime = dwNowTime-m_dwStartMoveTime;
return (m_nCompletePath + m_wCurSpeed*dwMoveTime/1000.0f);
}
void CCoordinatePath::UpdateSpeed( unsigned short wSpeed, DWORD dwNowTime )
{
// ¼ÆËãÒѾÍê³É·¾¶
m_nCompletePath += GetCompletePath(dwNowTime);
m_dwStartMoveTime = dwNowTime;
m_wCurSpeed = wSpeed;//µ±Ç°ËÙ¶È
}
unsigned short CCoordinatePath::GetSpeed()
{
return m_wCurSpeed;
}
bool CCoordinatePath::IsMoving( DWORD dwNowTime )
{
GetCoordinate(dwNowTime);
if (m_vtPath.size() > 0)
{
return true;
}
else
{
return false;
}
}