¶ÁÊéÈË

3DѰ·Ëã·¨³öÏÖÆµ·±À­»ØÓйØÎÊÌâ

·¢²¼Ê±¼ä£º 2013-03-19 17:22:05 ×÷Õߣº rapoo

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;

}

}

¶ÁÊéÈËÍø >Èí¼þ¼Ü¹¹Éè¼Æ

ÈȵãÍÆ¼ö