XPath.cpp
上传用户:yokoluohf
上传日期:2013-02-25
资源大小:769k
文件大小:8k
- #include "StdAfx.h"
- #include "XPath.h"
- #include "XLine.h"
- #include <math.h>
- XPath::XPath()
- {
- lines = 0;
- distance = 0;
- count = 0;
- }
- XPath::XPath (XLine& vLine, CString vStation1, CString vStation2)
- {
- lines = 0;
- distance = 0;
- count = 0;
- int pos1 = 0;
- int pos2 = 0;
- for (int i = 0; i < (int)vLine.spots.size(); i++)
- {
- CString name = vLine.spots[i].GetName();
-
- if (name == vStation1) pos1 = i;
- if (name == vStation2) pos2 = i;
- }
- if (pos1 < pos2)
- {
- for (int i = pos1; i <= pos2; i ++)
- Append(vLine.spots[i].GetName(), vLine.spots[i].GetPosition (), vLine.name);
- lines = 1;
- }
- else if (vLine.isOneWay == false)
- {
- for (int i = pos1; i >= pos2; i --)
- Append(vLine.spots[i].GetName(), vLine.spots[i].GetPosition (), vLine.name);
- lines = 1;
- }
- }
- XPath::XPath (XLine& vLine1, XLine& vLine2, CString vStation1, CString vStation2, bool reverse)
- {
- lines = 0;
- distance = 0;
- count = 0;
- struct {
- int index1;
- int index2;
- } junctions [32];
- int junctionCount = 0; //交叉点个数
- int index1 = -1; //vStation1在line1中的位置
- int index2 = -1; //vStation2在line2中的位置
- //<<根据line1顺序找出交叉点
- for (size_t i = 0; i < vLine1.spots.size (); i ++)
- {
- if (vLine1.spots [i].GetName () == "") continue;
- if (index1 == -1 && vLine1.spots [i].GetName () == vStation1)
- index1 = i;
- for (size_t j = 0; j < vLine2.spots.size (); j ++)
- {
- if (vLine2.spots [j].GetName () == "") continue;
- if (index2 == -1 && vLine2.spots [j].GetName () == vStation2)
- index2 = j;
- if (vLine1.spots [i].GetName () == vLine2.spots [j].GetName ())
- {
- junctions [junctionCount].index1 = i;
- junctions [junctionCount].index2 = j;
- junctionCount ++;
- break;
- }
- }
- }
- //>>
- if (junctionCount == 0 || index1 == -1 || index2 == -1)//错误
- return;
- if (junctionCount == 1)
- {
- if (reverse) return;
- if (junctions [0].index1 > index1)
- {
- for (int i = index1; i < junctions [0].index1; i++)
- Append (vLine1.spots[i].GetName (), vLine1.spots[i].GetPosition (), vLine1.name);
- }
- else
- {
- for (int i = index1; i > junctions [0].index1; i--)
- Append (vLine1.spots[i].GetName (), vLine1.spots[i].GetPosition (), vLine1.name);
- }
- Append (vLine1.spots[junctions [0].index1].GetName (), vLine1.spots[junctions [0].index1].GetPosition (), vLine1.name, vLine2.name);
-
- if (junctions [0].index2 < index2)
- {
- for (int i = junctions [0].index2+1; i <= index2 ; i++)
- Append (vLine2.spots[i].GetName (), vLine2.spots[i].GetPosition (), vLine2.name);
- }
- else
- {
- for (int i = junctions [0].index2-1; i >= index2 ; i--)
- Append (vLine2.spots[i].GetName (), vLine2.spots[i].GetPosition (), vLine2.name);
- }
- lines = 2;
- }
- else
- {
- bool sameDirection = junctions [1].index2 > junctions [0].index2; //判断line2是否与line1同向
- //从A点开始, 从小到大
- if (!reverse)
- {
- int minJunction = -1; //line1中的位置
- int maxJunction = -1; //line1中的位置
- for (int i = 0; i < junctionCount; i ++)
- {
- if (junctions [i].index1 < index1) continue;
- if (minJunction == -1)
- minJunction = junctions [i].index1;
- //防止超过B点
- if (sameDirection) //同向
- {
- if (junctions [i].index2 > index2)
- break;
- }
- else
- {
- if (junctions [i].index2 < index2)
- break;
- }
- maxJunction = junctions [i].index1;
- }
- if (minJunction != -1 && maxJunction != -1)
- {
- int lastJunc = -1; //最后一个交叉点
- //先沿line1走
- for (int i = index1; i <= maxJunction; i ++)
- {
- //判断是否是交叉点
- bool bJunc = false;
- for (int j = 0; j < junctionCount; j ++)
- {
- if (i == junctions [j].index1)
- {
- lastJunc = junctions [j].index2;
- bJunc = true;
- break;
- }
- }
- if (bJunc)
- Append (vLine1.spots[i].GetName (), vLine1.spots[i].GetPosition (), vLine1.name, vLine2.name);
- else
- Append (vLine1.spots[i].GetName (), vLine1.spots[i].GetPosition (), vLine1.name);
- }
- //再沿line2走
- if (sameDirection) //同向
- {
- for (int i = lastJunc+1; i <= index2; i ++)
- Append (vLine2.spots[i].GetName (), vLine2.spots[i].GetPosition (), vLine2.name);
- }
- else
- {
- for (int i = lastJunc-1; i >= index2; i --)
- Append (vLine2.spots[i].GetName (), vLine2.spots[i].GetPosition (), vLine2.name);
- }
- lines = 2;
- }
- }
- else //从A点开始, 从大到小
- {
- int minJunction = -1;
- int maxJunction = -1;
- for (int i = junctionCount-1; i > 0; i --)
- {
- if (junctions [i].index1 > index1) continue;
- if (maxJunction == -1)
- maxJunction = junctions [i].index1;
- if (sameDirection) //同向
- {
- if (junctions [i].index2 < index2)
- break;
- }
- else
- {
- if (junctions [i].index2 > index2)
- break;
- }
- minJunction = junctions [i].index1;
- }
- if (minJunction != -1 && maxJunction != -1)
- {
- int lastJunc = -1;
- //先沿line1走
- for (int i = index1; i >= minJunction; i --)
- {
- //判断是否是交叉点
- bool bJunc = false;
- for (int j = 0; j < junctionCount; j ++)
- {
- if (i == junctions [j].index1)
- {
- lastJunc = junctions [j].index2;
- bJunc = true;
- break;
- }
- }
- if (bJunc)
- Append (vLine1.spots[i].GetName (), vLine1.spots[i].GetPosition (), vLine1.name, vLine2.name);
- else
- Append (vLine1.spots[i].GetName (), vLine1.spots[i].GetPosition (), vLine1.name);
- }
- //再沿line2走
- if (sameDirection) //同向
- {
- for (int i = lastJunc-1; i >= index2; i --)
- Append (vLine2.spots[i].GetName (), vLine2.spots[i].GetPosition (), vLine2.name);
- }
- else
- {
- for (int i = lastJunc+1; i <= index2; i ++)
- Append (vLine2.spots[i].GetName (), vLine2.spots[i].GetPosition (), vLine2.name);
- }
- lines = 2;
- }
- }
- }
- }
- XPath::~XPath()
- {
- }
- int XPath::Append (CString vStation, PointF vPosition, CString vLine1, CString vLine2)
- {
- //计算距离
- if (passages.size() > 0)
- {
- PointF precPoint = passages[passages.size()-1].position;
- distance += sqrtf ((precPoint.X - vPosition.X) *(precPoint.X - vPosition.X)
- + (precPoint.Y - vPosition.Y) * (precPoint.Y - vPosition.Y) );
- ///***
- distance *=0.95;
- }
-
- XPassage obj (vStation, vPosition, vLine1, vLine2);
- passages.push_back(obj);
- if (vStation != "")
- count ++;
- return (int) passages.size();
- }
- int XPath::Remove (const XPassage& obj)
- {
- return (int) passages.size();
- }
- CString XPath::ToString()
- {
- CString str;
- CString strDistance;
- strDistance.Format (_T("%.2f"), distance/100);
- if (lines == 1) //直达
- {
- //str = "从 " + passages[0].station + " 到 " + passages[passages.size ()-1].station + "rn";
- str = "直达线路: (" + passages[0].line1 + ") 里程(" + strDistance + ")rn";
- for (size_t i = 0; i < passages.size(); i++)
- {
- if (passages[i].station == "")
- continue;
- str += passages[i].station;
- if (i != passages.size () - 1)
- str += ", ";
- }
- }
- else if (lines == 2) //直达
- {
- //str = "从 " + passages[0].station + " 到 " + passages[passages.size ()-1].station + "rn";
- str = "转一趟线路: (" + passages[0].line1 + ", " + passages[passages.size ()-1].line1 + ") 里程(" + strDistance + ")rn";
- for (size_t i = 0; i < passages.size(); i++)
- {
- if (passages[i].station == "")
- continue;
- if (passages[i].line2 == "")
- {
- str += passages[i].station;
- if (i != passages.size () - 1)
- str += ", ";
- }
- else
- {
- str += passages[i].station + "(换乘:" + passages[i].line2 + ")";
- if (i != passages.size () - 1)
- str += ", ";
- }
- }
- }
- return str;
- }
- bool XPath::operator < (const XPath& obj)
- {
- int a1, a2;
- int b1, b2;
- int c1, c2;
-
- if (lines == 2)
- a1 = 150;
- else
- a1 = 100;
- b1 = count*10;
- if (obj.lines == 2)
- a2 = 150;
- else
- a2 = 100;
- b2 = obj.count * 10;
- c1 = distance / 10; //1公里差不多相当于1站
- c2 = obj.distance / 10;
- return a1+b1+c1 < a2+b2+c2;
- }