69,369
社区成员
发帖
与我相关
我的任务
分享
#define MAX_VERTEX 20
// 顶点
struct Vertex
{
std::string sName;
float fX, fY;
};
// 边基类
class Edge
{
public:
std::string sName; // 边名字
Vertex* pStart; // 起点
Vertex* pEnd; // 终点编号
// 本边的长度
virtual float lenth() const = 0;
// 根据离起点的距离取得点坐标
virtual void getPoint(float &fX, float &fY, float fLen) const = 0;
};
// 直线边
class LineEdge : public Edge
{
public:
void length() const
{
float fDX = pEnd->fX - pStart->fX;
float fDY = pEnd->fY - pStart->fY;
return sqrtf(fDX * fDX + fDY * fDY);
}
void getPoint(float &fX, float &fY, float fLen) const
{
float fDX = vEnd.fX - vStart.fX;
float fDY = vEnd.fY - vStart.fY;
float fT = fLen / sqrtf(fDX * fDX + fDY * fDY);
if (fT < 0.0f)
{
fX = vStart.x;
fY = vStart.y;
}
else if (fT > 1.0f)
{
fX = vEnd.x;
fY = vEnd.y;
}
else
{
fX = vStart.x * (1 - fT) + vEnd.x * fT;
fY = vStart.y * (1 - fT) + vEnd.x * fT;
}
}
};
// 弧度边
class ArcEdge : public Edge
{
public:
// 圆心坐标
float fX, fY;
void length() const
{
// TODO:...
}
void getPoint(float &fX, float &fY, float fLen) const
{
// TODO:...
}
}
// 有向图
class Graph
{
public:
Vertex Vertexes[MAX_VERTEX];
int nVertexNum;
std::vector<Edge*> Edges;
Edge* getEdgeByIndex(int nIndex);
int getEdgeIndexByName(const std::string &sName);
};
// 画行走路径
class PathDrawer
{
private:
DWORD nStartTime; // 开始时间
std::vector<int> Path; // 边索引路径
int nPathIndex; // 当前路径边
float fPreEdgeLen; // 已经走过的边的长度和
float fSpeed; // 移动速度
Graph *pGraph; // 图
public:
// sPath是以空格分开的边序列
bool setPath(const std::string& sPath)
{
// TODO:生成Path,并检查路径是否合法
}
// 每帧调用它渲染
void render()
{
if (Path.empty() || nPathIndex >= Path.size())
return;
// 走到的点
float fX, fY;
// 这一帧要走的距离
DWORD nDTime = timeGetTime() - nStartTime;
float fLen = fSpeed * nDTime / 1000;
Edge* pEdge = pGraph->getEdgeByIndex(Path[nPathIndex]);
float fEdgeLen = pEdge->length();
// 如果走过改变了,则到下一条边去
while (fPreEdgeLen + fEdgeLen < fLen)
{
// 路径加1
++nPathIndex;
fPreEdgeLen += fEdgeLen;
// 到达终点了
if (nPathIndex >= Path.size())
break;
// 取下一条路径
pEdge = pGraph->getEdgeByIndex(Path[nPathIndex]);
fEdgeLen = pEdge->lenth();
}
// 计算走到的点
if (nPathIndex >= Path.size())
{
fX = pEdge->pEnd->fX;
fY = pEdge->pEnd->fY;
}
else
{
pEdge->getPoint(fX, fY, fLen - fPreEdgeLen);
}
// TODO:画点(fX, fY)
}
};
#define MAX_VERTEX 20
// 顶点
struct Vertex
{
std::string sName;
float fX, fY;
};
// 边基类
class Edge
{
public:
std::string sName; // 边名字
Vertex* pStart; // 起点
Vertex* pEnd; // 终点编号
// 本边的长度
virtual float lenth() const = 0;
// 根据离起点的距离取得点坐标
virtual void getPoint(float &fX, float &fY, float fLen) const = 0;
};
// 直线边
class LineEdge : public Edge
{
public:
void length() const
{
float fDX = pEnd->fX - pStart->fX;
float fDY = pEnd->fY - pStart->fY;
return sqrtf(fDX * fDX + fDY * fDY);
}
void getPoint(float &fX, float &fY, float fLen) const
{
float fDX = vEnd.fX - vStart.fX;
float fDY = vEnd.fY - vStart.fY;
float fT = fLen / sqrtf(fDX * fDX + fDY * fDY);
if (fT < 0.0f)
{
fX = vStart.x;
fY = vStart.y;
}
else if (fT > 1.0f)
{
fX = vEnd.x;
fY = vEnd.y;
}
else
{
fX = vStart.x * (1 - fT) + vEnd.x * fT;
fY = vStart.y * (1 - fT) + vEnd.x * fT;
}
}
};
// 弧度边
class ArcEdge : public Edge
{
public:
// 圆心坐标
float fX, fY;
void length() const
{
// TODO:...
}
void getPoint(float &fX, float &fY, float fLen) const
{
// TODO:...
}
}
// 有向图
class Graph
{
public:
Vertex Vertexes[MAX_VERTEX];
int nVertexNum;
std::vector<Edge*> Edges;
Edge* getEdgeByIndex(int nIndex);
int getEdgeIndexByName(const std::string &sName);
};
// 画行走路径
class PathDrawer
{
private:
DWORD nStartTime; // 开始时间
std::vector<int> Path; // 边索引路径
int nPathIndex; // 当前路径边
float fPreEdgeLen; // 已经走过的边的长度和
float fSpeed; // 移动速度
Graph *pGraph; // 图
public:
// sPath是以空格分开的边序列
bool setPath(const std::string& sPath)
{
// TODO:生成Path,并检查路径是否合法
}
// 每帧调用它渲染
void render()
{
if (Path.empty() || nPathIndex >= Path.size())
return;
// 走到的点
float fX, fY;
// 这一帧要走的距离
DWORD nDTime = timeGetTime() - nStartTime;
float fLen = fSpeed * nDTime / 1000;
Edge* pEdge = pGraph->getEdgeByIndex(Path[nPathIndex]);
float fEdgeLen = pEdge->length();
// 如果走过改变了,则到下一条边去
while (fPreEdgeLen + fEdgeLen < fLen)
{
// 路径加1
++nPathIndex;
fPreEdgeLen += fEdgeLen;
// 到达终点了
if (nPathIndex >= Path.size())
break;
// 取下一条路径
pEdge = pGraph->getEdgeByIndex(Path[nPathIndex]);
fEdgeLen = pEdge->lenth();
}
// 计算走到的点
if (nPathIndex >= Path.size())
{
fX = pEdge->pEnd->fX;
fY = pEdge->pEnd->fY;
}
else
{
float fT = (fLen - fPreEdgeLen) / fEdgeLen;
fX = pEdge->pStart->fX * (1.0f - fT) + pEdge->pEnd->fX;
fY = pEdge->pStart->fY * (1.0f - fT) + pEdge->pEnd->fY;
}
// TODO:画点(fX, fY)
}
};