using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IStation.CalcModel
{
internal class PumpCurveInfo
{
public int PumpIndex { get; set; }
public long ID { get; set; }
public string Name { get; set; }
public int Status { get; set; }
///
///
///
public IStation.Model.Pump RatedParas { get; set; }
///
/// 曲线信息
///
public IStation.Model.FeatCurveExpressGroup CurveInfo { get; set; }
///
///
///
public List GroupPoints { get { return _grpPoints; } set {
_grpPoints = value;
maxHead = (from yyy in _grpPoints select yyy.H).Max();
minHead = (from yyy in _grpPoints select yyy.H).Min();
groupPointCount = _grpPoints.Count;
} }
double maxHead, minHead;
int groupPointCount = 0;
List _grpPoints = null;
public IStation.Model.GroupPoint GetPointByH(double h)
{
//在范围内
if (h <= maxHead && h >= minHead)
{
return GetInterPointExX(h);
}
//判断是否在前面的延长部分
double x_start = IStation.Untity.LineHelper.GetXbyY(_grpPoints[0].Q, _grpPoints[0].H, _grpPoints[1].Q, _grpPoints[1].H, h);
if (x_start <= _grpPoints[0].Q)
{
if (x_start > 0 && x_start > _grpPoints[0].Q * 0.5)//放一点余量
{
IStation.Model.GroupPoint grpPt = new IStation.Model.GroupPoint();
grpPt.Q = x_start;
grpPt.H = h;
grpPt.P = _grpPoints[0].P;
return grpPt;
}
}
//判断是否在后面的延长部分:U型曲线 是前后都有
double x_end = IStation.Untity.LineHelper.GetXbyY(_grpPoints[_grpPoints.Count - 2].Q, _grpPoints[_grpPoints.Count - 2].H, _grpPoints[_grpPoints.Count - 1].Q, _grpPoints[_grpPoints.Count - 1].H, h);
if (x_end >= _grpPoints[_grpPoints.Count - 1].Q && x_end < _grpPoints[_grpPoints.Count - 1].Q * 2)//放一点余量
{
IStation.Model.GroupPoint grpPt = new IStation.Model.GroupPoint();
grpPt.Q = x_end;
grpPt.H = h;
grpPt.P = _grpPoints[_grpPoints.Count - 1].P;
return grpPt;
}
return null;
}
//获得Y值的坐标位置,可能有多个点(是线形插值,不是曲线上的点):会计算延长部分:而且要求_grpPoints点按照从小到大排序
public IStation.Model.GroupPoint GetInterPointExX( double H)
{
if (GroupPoints == null)
return null;
List sect_pts = new List();
foreach (var pt in GroupPoints)
{
if (Math.Abs(pt.H - H) < 0.02)
return pt ;
}
for (int i = 0; i < groupPointCount - 1; i++)//少一个点
{
if ((H >= _grpPoints[i].H && H <= _grpPoints[i + 1].H) || (H <= _grpPoints[i].H && H >= _grpPoints[i + 1].H))
{//直线插值
double Q;
if (Math.Abs(_grpPoints[i].H - _grpPoints[i + 1].H) < 0.01)
Q = (_grpPoints[i].Q + _grpPoints[i + 1].Q) * 0.5;
else
Q = _grpPoints[i].Q + (_grpPoints[i + 1].Q - _grpPoints[i].Q) * (H - _grpPoints[i].H) / (_grpPoints[i + 1].H - _grpPoints[i].H);
double P = _grpPoints[i].P + (_grpPoints[i + 1].P - _grpPoints[i].P) * (Q - _grpPoints[i].Q) / (_grpPoints[i + 1].Q - _grpPoints[i].Q);
return new Model.GroupPoint() { Q = Q, P = P , H= H };
}
}
return null ;
}
}
}