87,914
社区成员
发帖
与我相关
我的任务
分享
public class Wave
{
private WavePoint startPoint;
public WavePoint StartPoint
{
get { return startPoint; }
set { startPoint = value; }
}
private WavePoint endPoint;
public WavePoint EndPoint
{
get { return endPoint; }
set { endPoint = value; }
}
private List<WavePoint> wavePoint;
public List<WavePoint> WavePoint
{
get { return wavePoint; }
set { wavePoint = value; }
}
/// <summary>
/// 声导纳值达到峰值的一半处波峰的宽度
/// </summary>
/// <param name="ya">声导纳值峰值</param>
/// <returns></returns>
public float GetWaveWidth(float ya)
{
float result = 0;
float middleya = ya / 2; //峰值的一半
List<WavePoint> lstWave = this.wavePoint; //当前波的点的集合
List<WavePoint> jiaodian = new List<WavePoint>(); //以一半为水平线与波交点的集合
WavePoint lastPoint = new WavePoint();
lastPoint = this.startPoint;
//找出波峰与1/2声纳值的交点交点
foreach (WavePoint item in lstWave)
{
//相等
if (item.Y == middleya)
{
jiaodian.Add(item);
}
else if ((item.Y > middleya && middleya > lastPoint.Y) || (item.Y < middleya && middleya < lastPoint.Y)) //位于两点之间
{
float x = Math.Abs(middleya - lastPoint.Y) / Math.Abs(item.Y - lastPoint.Y) * 20 + lastPoint.X;
WavePoint newWavePoint = new WavePoint();
newWavePoint.X = x;
newWavePoint.Y = middleya;
jiaodian.Add(newWavePoint);
}
lastPoint = item;
}
if (jiaodian == null) return 0;
//判断交点
//如果有两个以上的交点则直接用交点的最大值-最小值
//如果只有一个交点则此交点与声纳值最大值的左边或者右边没有交点,则取左边或者右边的最大值
//反之宽取x轴的宽
if (jiaodian.Count >= 2)
{
float max = jiaodian.Max(point => point.X);
float min = jiaodian.Min(point => point.X);
result = max - min;
}
else if (jiaodian.Count > 0 && jiaodian.Count < 2)
{
float middleYaX = GetTPP(ya);
WavePoint onePoint = jiaodian.First();
if (onePoint.X < middleYaX)
result = 200 - onePoint.X;
if (onePoint.X > middleYaX)
result = onePoint.X + 400;
}
else
{
result = 600;
}
return result;
}
/// <summary>
/// 获取声导纳值达到最高峰时的外耳道压力
/// </summary>
/// <param name="pa"></param>
/// <returns></returns>
public float GetTPP(float ya)
{
List<WavePoint> lsWavePoint = this.wavePoint.FindAll(
delegate(WavePoint p)
{
return p.Y == ya;
}
);
return lsWavePoint.Average(s => s.X); //返回平均值
}
/// <summary>
/// 判断当前波的点种是否包含声导纳值达到最高峰时的点(即YA)
/// </summary>
/// <param name="pa"></param>
/// <returns></returns>
public bool HasPa(float ya)
{
List<WavePoint> lsWavePoint = this.wavePoint.FindAll(
delegate(WavePoint p)
{
return p.Y == ya;
}
);
if (lsWavePoint.Count > 0)
{
return true;
}
return false;
}
}
public class WavePoint
{
private float x;
public float X
{
get { return x; }
set { x = value; }
}
private float y;
public float Y
{
get { return y; }
set { y = value; }
}
}
function WavePoint(x, y) {
this.X = x;
this.Y = y;
}
var lsWavePoint = [];
for (var i = 0; i < 5; i++) {
//lsWavePoint.push(new WavePoint(i, i));//这样也行,下面那样也行,如果用下面的,可以直接 function WavePoint(){}来声明WavePoint类
var o = new WavePoint();
o.X = i; o.Y = i;
lsWavePoint.push(o);
}