private Point GetPowerPointByOriginal(P_V_Point oriPoint) { double X = _CvsRect.X + oriPoint.Voltage * (double)_CvsRect.Width / CurvesCurrent; double Y = _CvsRect.Y + (375 - oriPoint.Pmax) * (double)_CvsRect.Height / 375; Point point = new Point(); point.X = (int)X; point.Y = (int)Y; return(point); }
/// <summary> /// 根据坐标点画曲线 /// </summary> /// <param name="graph"></param> private void DrawCurvas(Graphics graph) { //Pen pointPen = null; Pen curvasPen = null; // if (_OriPointList == null) return; try { if (OldoriPointArray.Length == 3) { //pointPen = curvasPen = new Pen(Color.Red, 1); //画所有数据点 curvasPen = new Pen(Color.Blue, 1); if (_CurvasPointList != null) { graph.DrawLines(curvasPen, _CurvasPointList.ToArray()); } // 画功率曲线 Add by genhong.hu On 2016-06-02 curvasPen = new Pen(Color.Red, 1); if (_PowerPointList != null) { graph.DrawLines(curvasPen, _PowerPointList.ToArray()); } } else // HR原厂商写的 标签 { _PowerPointList = new List <Point>(); _CurvasPointList = new List <Point>(); foreach (I_V_Point oriPoint in OldoriPointArray) { _CurvasPointList.Add(GetPointByOriginal(oriPoint)); // add by genhong.hu On 2016-06-02 增加功率曲线 P_V_Point pmaxpoint = new P_V_Point(); pmaxpoint.Pmax = oriPoint.Current * oriPoint.Voltage; pmaxpoint.Voltage = oriPoint.Voltage; _PowerPointList.Add(GetPowerPointByOriginal(pmaxpoint)); } curvasPen = new Pen(Color.Blue, 1); if (_CurvasPointList != null) { graph.DrawLines(curvasPen, _CurvasPointList.ToArray()); } // 画功率曲线 Add by genhong.hu On 2016-06-02 curvasPen = new Pen(Color.Red, 1); if (_PowerPointList != null) { graph.DrawLines(curvasPen, _PowerPointList.ToArray()); } } } catch (Exception) { } finally { //if (pointPen != null) pointPen.Dispose(); if (curvasPen != null) { curvasPen.Dispose(); } } }
/// <summary> /// 设置真实的数据点,并根据需要计算插值 /// </summary> /// <param name="oriPointArray">真实的数据点</param> /// <param name="evalAll">是否需要计算所有数据点</param> public void SetOriginalPoints(I_V_Point[] oriPointArray, bool evalAll) { OldoriPointArray = oriPointArray; //#region 2013-06-03 曲线异常Bug修改,如果倒数第二个点靠近最后一个点,则移除 I_V_Point[] pointArray = null; //if (oriPointArray != null) //{ // int oriLen = oriPointArray.Length; // if (oriPointArray[oriLen - 2].Current < 0.5) // { // pointArray = new I_V_Point[oriLen - 1]; // Array.Copy(oriPointArray, pointArray, oriLen - 1); // pointArray[oriLen - 2].Current = oriPointArray[oriLen - 1].Current; // pointArray[oriLen - 2].Voltage = oriPointArray[oriLen - 1].Voltage; // } // else // { // pointArray = oriPointArray; // } //} //#endregion _OriPointList = new List <Point>(); _CurvasPointList = new List <Point>(); _PowerPointList = new List <Point>();// add by genhong.hu On 2016-06-02 增加功率曲线 if (oriPointArray == null) { CleanSpine(); return; } if (oriPointArray.Length != 3) { //MessageBox.Show("RFID标签数据异常,无法显示曲线。"); //return; if (oriPointArray != null) { int oriLen = oriPointArray.Length; if (oriPointArray[oriLen - 2].Current < 0.5) { pointArray = new I_V_Point[oriLen - 1]; Array.Copy(oriPointArray, pointArray, oriLen - 1); pointArray[oriLen - 2].Current = oriPointArray[oriLen - 1].Current; pointArray[oriLen - 2].Voltage = oriPointArray[oriLen - 1].Voltage; } else { pointArray = oriPointArray; } } } else { #region ====================================================== int PointCount = 100; double Voc = oriPointArray[2].Voltage; double Isc = oriPointArray[0].Current; double Vpm = oriPointArray[1].Voltage; double Ipm = oriPointArray[1].Current; pointArray = new I_V_Point[PointCount + 3]; I_V_Point s1 = new I_V_Point(); s1.Voltage = 0; s1.Current = Isc; pointArray[0] = s1; for (int i = 1; i < PointCount + 1; i++) { I_V_Point s2 = new I_V_Point(); s2.Voltage = 0 + (Vpm - 0) / (PointCount + 1) * i; s2.Current = Isc - (Isc - Ipm) / (PointCount + 1) * i; pointArray[i] = s2; } I_V_Point s4 = new I_V_Point(); s4.Voltage = Vpm; s4.Current = Ipm; I_V_Point s5 = new I_V_Point(); s5.Voltage = Voc; s5.Current = 0; pointArray[PointCount + 1] = s4; pointArray[PointCount + 2] = s5; #endregion } foreach (I_V_Point oriPoint in pointArray) { _OriPointList.Add(GetPointByOriginal(oriPoint)); } if (evalAll) { I_V_Point[] points = MySpline.Spline(pointArray); if (points == null) { MessageBox.Show("RFID标签数据异常,无法显示曲线。"); return; } foreach (I_V_Point oriPoint in points) { _CurvasPointList.Add(GetPointByOriginal(oriPoint)); // add by genhong.hu On 2016-06-02 增加功率曲线 P_V_Point pmaxpoint = new P_V_Point(); pmaxpoint.Pmax = oriPoint.Current * oriPoint.Voltage; pmaxpoint.Voltage = oriPoint.Voltage; _PowerPointList.Add(GetPowerPointByOriginal(pmaxpoint)); } #region 计算 // _CurvasPointList = _OriPointList; #endregion //2014-03-30 曲线画到电流为0 Point lastPointToZero = new Point(); lastPointToZero.X = _CurvasPointList[_CurvasPointList.Count - 1].X; lastPointToZero.Y = _CvsRect.Top + _CvsRect.Height; _CurvasPointList.Add(lastPointToZero); _PowerPointList.Add(lastPointToZero);// add by genhong.hu On 2016-06-02 增加功率曲线 } this.Invalidate(); }