📄 breakside.cpp
字号:
// Curve.h: interface for the CCurve class.
// Copyright 济南路通科技开发有限责任公司
// mailto: lutong_jn@sina.com
//=====================================================================================
// 说明:曲线测设类
// 包括:
// 1. 曲线放样点结构类
// 2. 曲线基类
// 3. 圆曲线类
// 4. 缓和曲线类
// 5. 副交点类
// 6. 曲线工程管理类
//
// 将原定义的全局函数_CStringToFile(CFile *fp) 和 _CStringFromFile(CFile *fp)
// 删除。将曲线基类中的DmsToRad(...)和RadToDms(...)成员函数去掉。
// 修改了各类中的成员变量名。
//=====================================================================================
// 编写人:张玉生、秦涛
// 日期: 2002-10-15
// 版本: 1.0
//=====================================================================================
#include "stdafx.h"
#include "BreakSide.h"
//将字符串保存到文件
static int _CStringToFile(CString &s,CFile *fp)
{
short l;
TCHAR b[1024];
l = s.GetLength();
wcscpy(b,s);
fp->Write(&l,sizeof(l));
fp->Write(b,l*2);
return l;
}
//从文件读取字符串
static int _CStringFromFile(CString &s,CFile *fp)
{
short l;
TCHAR b[1024];
fp->Read(&l,sizeof(l));
fp->Read(b,l*2);
b[l]=0;
s = b;
return l;
}
//构造函数
CBreakSide::CBreakSide()
{
int i;
//里程 CString
Mileage = _T("");
//轨顶属性 CString
RailTopProperty = _T("");
//轨顶读数 float
RailTopForesight=0;
//已知点号 CString
KnownDotName = _T("");
//已知高程 float
KnownHeight = 0;
//后视读数 float
KnownBacksight=0;
//测量点数 short
PointCount = 0;
for (i=0;i<MAXPOINTCOUNT;i++) {
Points[i] = NULL;
}
//测站数目 short
StationCount = 0;
for (i=0;i<MAXSTATIONCOUNT;i++) {
Stations[i] = NULL;
}
}
//析构函数
CBreakSide::~CBreakSide()
{
Clear();
}
//清空数据
void CBreakSide::Clear()
{
int i;
//轨顶属性 CString
RailTopProperty = _T("");
//轨顶读数 float
RailTopForesight=0;
//已知点号 CString
KnownDotName = _T("");
//已知高程 float
KnownHeight = 0;
//后视读数 float
KnownBacksight=0;
for (i=0;i<PointCount;i++) {
delete Points[i];
Points[i] = NULL;
}
PointCount = 0;
for (i=0;i<StationCount;i++) {
delete Stations[i];
Stations[i] = NULL;
}
StationCount = 0;
}
void CBreakSide::MileageToValue()
{
CString s;
double d;
int i,k1,k2,k,l;
unsigned short B1[40],B2[40],*p;
s = Mileage;
s.MakeUpper();
l = s.GetLength();
k1 = s.Find('K');
k2 = s.Find('+',k1);
k1++;
k = k2 - k1 ;
for (i=0;i<k;i++)
B1[i] = s[k1+i];
B1[i] = 0;
k2++;
k = l - k2;
for (i=0;i<k;i++)
B2[i] = s[k2+i];
B2[i] = 0;
d = wcstod(B1,&p);
d += wcstod(B2,&p)/1000.0;
this->MileValue = d;
}
//设置断面基本信息,同时设置断面0点的数据
int CBreakSide::SetBaseData(CString &M,CString &Property,float &Foresight,CString &DotName,float &Height,float &Backsight)
{
//Clear();
Mileage = M ; //里程
RailTopProperty = Property ; //轨顶属性
RailTopForesight = Foresight ; //轨顶读数
KnownDotName = DotName ; //已知点号
KnownHeight = Height ; //已知高程
KnownBacksight = Backsight ; //后视读数
//第一个测量点
CBreakSidePoint *p1;
p1 = new CBreakSidePoint;
ASSERT(p1);
p1->Type = 2; //轨顶
p1->Distance = 0;
p1->Height = 0;
p1->Foresight = RailTopForesight;
p1->StationNumber = 0;
AddPoint(p1);
//第一个测站
CStationPoint *p2;
p2 = new CStationPoint;
ASSERT(p2);
p2->Height = KnownHeight + KnownBacksight;//获得测站仪器高
p2->Backsight = KnownBacksight;
p2->PointNumber = -1;//说明是基准点
AddStation(p2);
return 0;
}
//获得断面基本信息,同时得到断面0点的信息
int CBreakSide::GetBaseData(CString &M,CString &Property,float &Foresight,CString &DotName,float &Height,float &Backsight)
{
M = Mileage ; //里程
Property = RailTopProperty ; //轨顶属性
Foresight = RailTopForesight; //轨顶读数
DotName = KnownDotName ; //已知点号
Height = KnownHeight ; //已知高程
Backsight = KnownBacksight ; //后视读数
return 0;
}
//给断面增加测点,同时应将该测点对应的测站号保存到StationNumber,
int CBreakSide::AddPoint(CBreakSidePoint *p)
{
ASSERT(p);
if (PointCount>=MAXPOINTCOUNT) return -1;
Points[PointCount] = p;
return ++PointCount;
}
//删除断面测点,参数为点号的索引值
int CBreakSide::DelPoint(int n)
{
if ((n<=0)||(n>=PointCount)) return -1;
if (Points[n]->Type==5) return -2;
if (Points[n]->Type==-1) return -3;
Points[n]->Type = -1;
return 0;
}
//增加测站,增加转点即为增加测站
int CBreakSide::AddStation(CStationPoint *p)
{
ASSERT(p);
if (StationCount>=MAXSTATIONCOUNT) return -1;
Stations[StationCount] = p;
return ++StationCount;
}
//计算各测点的高程值,将各测点循环遍历
int CBreakSide::Calculate()
{
int i,j,k,t;
if (StationCount<=0) return 1;
if (PointCount<=0) return 2;
j=0;//代表测站点号,并设置为第一测站,当前断面最大点号为PointCount-1
Points[0]->Foresight = RailTopForesight;
Stations[0]->Backsight = KnownBacksight;
Stations[0]->Height = KnownHeight + KnownBacksight;
/*
获取第i点的测站点号,开始时k=0,j=0故不会进入循环,当k>0时(如k=1时),
进入循环,同时j+1=1,计算出j=1时测站的仪器高,当k=2时,这时j=1,
所以进入循环,执行j+1=2, 接着算出j=2时的仪器高,从而可算出i点的高程
*/
for (i=0;i<PointCount;i++) {
//if (Points[i]->Type<1) continue;
k = Points[i]->StationNumber;
// 测量点的测站号应该小于测站总数
ASSERT(k<StationCount);
while (k>j) {//实际为j=k时结束循环
j++;
t = Stations[j]->PointNumber;//获取j测站的后视点号
// 测站的后视点号应该小于当前的测点号
ASSERT(t<i);
Stations[j]->Height = Points[t]->Height + Stations[j]->Backsight;//计算出j测站的仪器高,
}
Points[i]->Height = Stations[k]->Height - Points[i]->Foresight ;//计算出i点的高程,仪器高减去测点的前视读数便得到测点的高程
}
return 0;
}
//计算绘图数据
int CBreakSide::GenDrawPoint(CPoint *p)
{
int i,j;
int kx,ky;
int Count;
//计算
Calculate();
//生成数据
Count=0;
for (i=0;i<PointCount;i++) {
if (Points[i]->Type<1) continue;
if (Points[i]->Type==5) continue;
//不是转点
p[Count].x = int(Points[i]->Distance*1.0);
p[Count].y = int(Points[i]->Height *1.0);
Count++;
}
//排序
for (i=Count-1;i>0;i--) {
for (j=0;j<i;j++) {
if (p[j].x>p[j+1].x) {
kx = p[j].x;
ky = p[j].y;
p[j].x = p[j+1].x;
p[j].y = p[j+1].y;
p[j+1].x = kx;
p[j+1].y = ky;
}
}
}
return Count;
}
//从文件调入断面数据
void CBreakSide::LoadFromFile(CFile *fp)
{
int i;
Clear();
//里程 CString Mileage;
_CStringFromFile(Mileage,fp);//调入断面里程
//轨顶属性 CString RailTopProperty;
_CStringFromFile(RailTopProperty,fp);//调入断面0点属性,即轨顶属性数据
//轨顶读数 float RailTopForesight;
fp->Read(&RailTopForesight,sizeof(RailTopForesight));//调入轨顶数据
//已知点号 CString KnownDotName;
_CStringFromFile(KnownDotName,fp);//调入已知点点名
//已知高程 float KnownHeight;
fp->Read(&KnownHeight,sizeof(KnownHeight));//调入已知点高程
//后视读数 float KnownBacksight;
fp->Read(&KnownBacksight,sizeof(KnownBacksight));//调入第一测站点后视数据
//测量点数 short PointCount;
fp->Read(&PointCount,sizeof(PointCount));//调入该断面总的测点数
//测量点 CBreakSidePoint *Points[MAXPOINTCOUNT];
for (i=0;i<PointCount;i++) {//循环调入各测点的数据
Points[i] = new CBreakSidePoint;//新建断面点对象
ASSERT(Points[i]);
Points[i]->LoadFromFile(fp);
}
//测站数目 short StationCount;
fp->Read(&StationCount,sizeof(StationCount));///调入测站数目
//测站 CStationPoint *Stations[MAXSTATIONCOUNT];
for (i=0;i<StationCount;i++) {//循环调入各测站数据
Stations[i] = new CStationPoint;//新建测站对象
ASSERT(Stations[i]);
Stations[i]->LoadFromFile(fp);
}
}
//将断面数据保存到文件
void CBreakSide::SaveToFile(CFile *fp)
{
int i;
//里程 CString Mileage;
_CStringToFile(Mileage,fp);//保存断面里程
//轨顶属性 CString RailTopProperty;
_CStringToFile(RailTopProperty,fp);//保存轨顶属性
//轨顶读数 float RailTopForesight;
fp->Write(&RailTopForesight,sizeof(RailTopForesight));//保存轨顶读数
//已知点号 CString KnownDotName;
_CStringToFile(KnownDotName,fp);//保存已知点号
//已知高程 float KnownHeight;
fp->Write(&KnownHeight,sizeof(KnownHeight));//保存已知高程
//后视读数 float KnownBacksight;
fp->Write(&KnownBacksight,sizeof(KnownBacksight));//保存后视读数
//测量点数 short PointCount;
fp->Write(&PointCount,sizeof(PointCount));//保存当前断面的测量点总数
//测量点 CBreakSidePoint *Points[MAXPOINTCOUNT];
for (i=0;i<PointCount;i++) {//循环保存各测点数据
Points[i]->SaveToFile(fp);
}
//测站数目 short StationCount;
fp->Write(&StationCount,sizeof(StationCount));//保存测站数目
//测站 CStationPoint *Stations[MAXSTATIONCOUNT];
for (i=0;i<StationCount;i++) {//循环保存各测站数据
Stations[i]->SaveToFile(fp);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -