using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Collections.ObjectModel; namespace FLY.Simulation { public class CurveCollection : Misc.ISaveToXml { public static string EXT_NAME = ".curve"; public static string DEFAULT_FILE = "default" + EXT_NAME; #region 数据文件需要保存的数据项 public class Curve : Misc.ISaveToXml, INotifyPropertyChanged { private int _value; /// /// 面密度 /// public int Value { get { return _value; } set { _value = value; NotifyPropertyChanged("Value"); } } private int _ad; public int AD { get { return _ad; } set { _ad = value; NotifyPropertyChanged("AD"); } } private int _revisedAD; /// /// 校正后的AD值 /// public int RevisedAD { get { return _revisedAD; } set { _revisedAD = value; NotifyPropertyChanged("RevisedAD"); } } #region ISaveToXml 成员 public string[] GetSavePropertyNames() { return new string[]{ "Value", "AD"}; } #endregion #region INotifyPropertyChanged 成员 protected void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public event PropertyChangedEventHandler PropertyChanged; #endregion } public class ExChange : Misc.ISaveToXml { public int OrgAD { get; set; } public int CurrAD { get; set; } public string[] GetSavePropertyNames() { return new string[]{ "OrgAD", "CurrAD"}; } } /// /// 输入的曲线 /// private ObservableCollection mCurves = new ObservableCollection(); public ObservableCollection Curves { get { return mCurves; } } #endregion /// /// 真实样品校正点 /// private ObservableCollection mRevisingCurves = new ObservableCollection(); public ObservableCollection RevisingCurves { get { return mRevisingCurves; } } public CurveCollection() { Misc.SaveToXmlHepler.Regist(typeof(Curve)); Misc.SaveToXmlHepler.Regist(typeof(ExChange)); //Curves.Add(new Curve() { AD = 57564, Value = 0 }); //Curves.Add(new Curve() { AD = 30850, Value = 8800 }); //Curves.Add(new Curve() { AD = 19000, Value = 17600 }); //Curves.Add(new Curve() { AD = 12528, Value = 26400 }); //Curves.Add(new Curve() { AD = 8409, Value = 35200 }); //Curves.Add(new Curve() { AD = 5650, Value = 44000 }); //Curves.Add(new Curve() { AD = 3779, Value = 52800 }); //Curves.Add(new Curve() { AD = 2513, Value = 61600 }); //Curves.Add(new Curve() { AD = 1660, Value = 70400 }); Curves.Add(new Curve() { Value = 0, AD = 50300 }); Curves.Add(new Curve() { Value = 1900, AD= 46505}); Curves.Add(new Curve() { Value = 3800, AD=42999}); Curves.Add(new Curve() { Value = 5800, AD=39698}); Curves.Add(new Curve() { Value = 7800, AD=36646}); Curves.Add(new Curve() { Value = 9800, AD=33894}); Curves.Add(new Curve() { Value = 11800, AD=31229}); Curves.Add(new Curve() { Value = 13700, AD=28934}); Curves.Add(new Curve() { Value = 15600, AD=26818}); Curves.Add(new Curve() { Value = 17500, AD=24908}); Curves.Add(new Curve() { Value = 19400, AD=23220}); Curves.Add(new Curve() { Value = 21300, AD=21558}); Curves.Add(new Curve() { Value = 23200, AD=20057}); Curves.Add(new Curve() { Value = 25100, AD=18606}); Curves.Add(new Curve() { Value = 27100, AD=17283}); Curves.Add(new Curve() { Value = 29000, AD = 16035 }); //foreach (Curve c in Curves) //{ // c.AD = (int)(c.AD * 58881.0 / 50300); //} } public void Clear() { Curves.Clear(); ClearExChange(); } #region CURVE //ad值从大到小排列 public void ModifyPoint(int ad, int value) { var cs = from c in Curves where c.AD == ad select c; if (cs.Count() > 0) { cs.First().Value = value; } else { Curves.Add(new Curve() { AD = ad, Value = value }); Curves.OrderByDescending(c => c.AD); } } public bool DeletePoint(int ad) { var cs = from c in Curves where c.AD == ad select c; if (cs.Count() > 0) { Curves.Remove(cs.First()); return true; } return false; } #endregion #region ExChange public void ModifyExChange(int org_ad, int curr_ad) { //index=0 zero, index=1 sample var cs = from c in RevisingCurves where c.OrgAD == org_ad select c; if (cs.Count() > 0) { cs.First().CurrAD = curr_ad; } else { RevisingCurves.Add(new ExChange() { OrgAD = org_ad, CurrAD = curr_ad }); RevisingCurves.OrderByDescending(c => c.OrgAD); } } public void ClearExChange() { RevisingCurves.Clear(); } #endregion public static bool CheckRevisingPointValid(int ad) { if (ad < 3) { return false; } else { return true; } } public bool ReviseCurve() { if (RevisingCurves.Count < 1)//没数据 { foreach (Curve c in Curves) { c.RevisedAD = c.AD; } return false; } if (RevisingCurves.Count == 1)//只有一个校正点 { double ux = ((double)RevisingCurves[0].CurrAD) / RevisingCurves[0].OrgAD; foreach (Curve c in Curves) { c.RevisedAD = (int)(c.AD * ux); } return true; } else { int adh = RevisingCurves[0].OrgAD; int adl = RevisingCurves[1].OrgAD; double uh = ((double)RevisingCurves[0].CurrAD) / adh; double ul = ((double)RevisingCurves[1].CurrAD) / adl; //int k; for (int i = 0; i < Curves.Count; i++) { //k = j; //while ((m_curves[i].Value > m_revisingCurves[j].Value) && (j < m_revisingCurves.Count - 1)) j++; //if (k != j) //{ // adh = m_revisingCurves[j-1].OrgAD; // adl = m_revisingCurves[j].OrgAD; // uh = ((double)m_revisingCurves[j-1].CurrAD) / adh; // ul = ((double)m_revisingCurves[j].CurrAD) / adl; //} double ux = uh - (adh - Curves[i].AD) * (uh - ul) / (adh - adl); Curves[i].RevisedAD = (int)(Curves[i].AD * ux); } return true; } } public int Value2AD(int value, AD2ValueFlag flag) { int n = Curves.Count; int i; int ad; double tmp, tmp1; if (Curves.Count <= 0) return Misc.MyBase.NULL_VALUE; if (value <= Curves[0].Value) i = 1; for (i = 1; i < n; i++) { if (value > Curves[i].Value) continue; else break; } if (i >= n) i = n - 1; tmp = (double)(Curves[i - 1].Value - value) / (Curves[i].Value - Curves[i - 1].Value); if (flag == AD2ValueFlag.NoRevised) { tmp1 = (double)Curves[i - 1].AD / Curves[i].AD; ad = (int)(Curves[i - 1].AD * Math.Exp(tmp * Math.Log(tmp1, Math.E))); } else { tmp1 = (double)Curves[i - 1].RevisedAD / Curves[i].RevisedAD; ad = (int)(Curves[i - 1].RevisedAD * Math.Exp(tmp * Math.Log(tmp1, Math.E))); } return ad; } public enum AD2ValueFlag { /// /// 修正后的曲线 /// Revised, /// /// 原始曲线 /// NoRevised } public int AD2Value(int ad, AD2ValueFlag flag) { int i; int thick; if (Curves.Count < 1) return -1; if (ad < 0) return -1; if (ad == 0) ad = 1; if (flag == AD2ValueFlag.NoRevised) { for (i = 0; i < Curves.Count; i++) { if (ad < Curves[i].AD) continue; else break; } } else { for (i = 0; i < Curves.Count; i++) { if (ad < Curves[i].RevisedAD) continue; else break; } } if (i >= Curves.Count) i = Curves.Count - 1; if (i == 0) i = 1; if (flag == AD2ValueFlag.NoRevised) { double u; u = Math.Log((double)Curves[i - 1].AD / Curves[i].AD, Math.E) * 100 / (Curves[i].Value - Curves[i - 1].Value); thick = (int)(Math.Log((double)Curves[i - 1].AD / ad, Math.E) * 100 / u + Curves[i - 1].Value); } else { double u; u = Math.Log((double)Curves[i - 1].RevisedAD / Curves[i].RevisedAD, Math.E) * 100 / (Curves[i].Value - Curves[i - 1].Value); thick = (int)(Math.Log((double)Curves[i - 1].RevisedAD / ad, Math.E) * 100 / u + Curves[i - 1].Value); } return thick; } public int GetZeroAD() { if (RevisingCurves.Count < 1) return Curves[0].AD; else return Curves[0].RevisedAD; } bool IsCurveFile(string file) { if (file.Length < EXT_NAME.Length) return false; if (file.Substring(file.Length - EXT_NAME.Length).CompareTo(EXT_NAME) == 0) { return true; } else { return false; } } #region ISaveToXml 成员 public string[] GetSavePropertyNames() { return new string[]{ "Curves"}; } #endregion } }