/// <summary> /// 设计器支持所需的方法 - 不要修改 /// 使用代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { this.SuspendLayout(); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1000, 5000); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); string filePath = "profile-1.txt"; // 从数据文件>读取数据 List <double>[] values = GetDataFromFile(filePath); int w = this.Width; int h = this.Height; Chart chart1 = new Chart(); ChartArea chartArea1 = new ChartArea(); //定义一个绘图区域 Series series1 = new Series(); Series series2 = new Series(); // for 斜率曲线 Series series3 = new Series(); // for 斜率曲线 Series series4 = new Series(); // for 斜率曲线 Series series5 = new Series(); //定义一个数据列 chartArea1.Name = "ChartArea1"; //其实没有必要,可以使用chart1。ChartAreas[0]就可以了 chart1.ChartAreas.Add(chartArea1); //完成Chart和chartArea的关联 //Legend legend1 = new Legend(); //legend1.Name = "图标"; //chart1.Legends.Add(legend1); chart1.Name = "chart1"; series1.ChartType = SeriesChartType.Spline; series2.ChartType = SeriesChartType.Spline; series3.ChartType = SeriesChartType.Spline; series5.ChartType = SeriesChartType.Spline; series4.ChartType = SeriesChartType.Spline; //设置线性 Random rd2 = new Random(); double[] num = new double[20]; /*for (int i = 0; i < 20; i++) * { * int valuey = rd2.Next(20, 100); * DataPoint point = new DataPoint((i + 1), valuey); * series1.Points.Add(point); * }*/ series1.Points.DataBindXY(values[0], values[1]); int fitFactor = 10; // left to right, padding the most right points List <double> k = QCDSDataFitWithDirection(values[0], values[1], fitFactor, 0); series2.Points.DataBindXY(values[0], k); List <double> k2 = QCDSDataFit2(values[0], values[1], fitFactor); //series3.Points.DataBindXY(values[0], k2); // right to left, padding the most last points List <double> k3 = QCDSDataFitWithDirection(values[0], values[1], fitFactor, 1); series4.Points.DataBindXY(values[0], k3); // find the boundary of the gap,(point1,point2) GapIndex gap = findGap(values[0], values[1], k, k3); MaxPoints result = findMax(values[0], values[1], k, k3); List <double> left_x = new List <double>(); List <double> left_y = new List <double>(); for (double ch = 0; (result.y[0] + ch <= 3); ch += 0.02) { left_x.Add(result.x[0]); left_y.Add(result.y[0] + ch); } series3.Points.DataBindXY(left_x, left_y); double heightDiff = gapHeightDifference(values[0], values[1], gap.left, gap.left, gap.right, gap.right); chart1.Titles.Add("height difference:" + heightDiff.ToString()); List <double> right_x = new List <double>(); List <double> right_y = new List <double>(); for (double ch = 0; (result.y[0] + ch <= 3); ch += 0.02) { right_x.Add(result.x[1]); right_y.Add(result.y[1] + ch); } series5.Points.DataBindXY(right_x, right_y); //series1.Points.DataBindY(values); //产生点的坐标 //chart1.Titles[0].Text = ""; //chartArea1.AxisX.IntervalType = double; //chartArea1.AxisY.IntervalType = double; series1.ChartArea = "ChartArea1"; chartArea1.AxisX.Title = "X"; chartArea1.AxisY.Title = "Y"; chartArea1.AxisX.Interval = 0.02; //chartArea1.AxisY.Interval = 0.0001; //chartArea1.AxisY.Minimum = 16; series1.Legend = "图标"; series1.Name = "Series1"; chart1.Text = "测试"; chart1.Size = new System.Drawing.Size(w, h); //chart1.Location = new System.Drawing.Point(50,120); series1.Color = Color.Red; series2.Color = Color.Blue; series3.Color = Color.Green; series5.Color = Color.Pink; series4.Color = Color.Honeydew; chart1.Text = "ceshi"; //chart1.Titles[0].Text = "fff"; chart1.Series.Add(series1); chart1.Series.Add(series2); chart1.Series.Add(series3); chart1.Series.Add(series5); chart1.Series.Add(series4); //这一句很重要,缺少的话绘图区域将显示空白 //chart1.SizeChanged += new System.EventHandler(DoSizeChanged); //chart1.AllowDrop = true; chart1.BackColor = Color.FromArgb(243, 223, 193); //设置chart背景颜色 chartArea1.BackColor = Color.FromArgb(243, 223, 193); //设置c绘图区域背景颜色 series1.BorderWidth = 2; series2.BorderWidth = 2; series3.BorderWidth = 2; series5.BorderWidth = 2; series4.BorderWidth = 2; //series1.IsValueShownAsLabel = true; //series2.IsValuseShownAsLabel = true; //是否显示Y的值 //this.groupBox9.Controls.Add(chart1);. this.Controls.Add(chart1); //this.panel21.Controls.Add(chart1); chart1.Visible = true; //this.label10.Visible = true; //this.label10.Text = "【" + tn.Name + "】图"; chart1.Titles.Add("profile"); //为Chart1添加标题 chartArea1.AxisX.IsMarginVisible = true; //是否显示X轴两端的空白 //2、在上述chart的基础上添加一条线 /* * System.Windows.Forms.Control[] controls = this.Controls.Find("chart1", true); * * //找到已经有的Chart1 * Chart ch = (Chart)controls[0]; * Series series2 = new Series(); * Series series3 = new Series(); * Series series4 = new Series(); * * //新定义一个数据项 * Random rd = new Random(); * for (int i = 0; i < ch.Series[0].Points.Count; i++) * { * int valuey = rd.Next(20, 100); * DataPoint point = new DataPoint((i + 1), valuey); * series2.Points.Add(point); * series3.Points.Add(point); * series4.Points.Add(point); * } * series2.Color = Color.FromArgb(rd.Next(100, 255), rd.Next(100, 150), rd.Next(0, 255)); * series2.BorderWidth = 2; * series2.ChartType = ((Chart)this.Controls[0]).Series[0].ChartType; * * series3.Color = Color.FromArgb(rd.Next(100, 255), rd.Next(0, 150), rd.Next(0, 100)); * series3.BorderWidth = 2; * series3.ChartType = ((Chart)this.Controls[0]).Series[0].ChartType; * * series4.Color = Color.FromArgb(rd.Next(100, 255), rd.Next(0, 150), rd.Next(0, 255)); * series4.BorderWidth = 2; * series4.ChartType = ((Chart)this.Controls[0]).Series[0].ChartType; * * //定义线性和原有的线条形状一致 * series2.IsValueShownAsLabel = true; * ch.Series.Add(series2); * * series3.IsValueShownAsLabel = true; * ch.Series.Add(series3); * * series4.IsValueShownAsLabel = true; * ch.Series.Add(series4); * * //添加数据列 * * * * /*Graphics g = this.CreateGraphics(); * this.Show(); * Pen pen1 = new Pen(Color.Red, 3); * Point[] p1 = new Point[] * { * new Point(10,10), * new Point(60,40), * new Point(100,80), * new Point(60,100) * }; * * * g.DrawCurve(pen1, values); * g.Save();*/ }
private GapIndex findGap(List <double> listX, List <double> listY, List <double> listK1, List <double> listK2) { GapIndex gap = new GapIndex(); MaxPoints max = new MaxPoints(); max.x = new List <double>(); max.y = new List <double>(); MaxPoints min = new MaxPoints(); min.x = new List <double>(); min.y = new List <double>(); // var v1, v2; max value //var v3, v4; min value int cnt = 0; List <double> tmp; bool isSummit = true; var v1 = listK1.Select((m, index) => new { index, m }).OrderByDescending(n => n.m).Last(); var v3 = listK1.Select((m, index) => new { index, m }).OrderByDescending(n => n.m).First(); var v2 = listK1.Select((m, index) => new { index, m }).OrderByDescending(n => n.m).Last(); var v4 = listK1.Select((m, index) => new { index, m }).OrderByDescending(n => n.m).First(); if (v1.index < v3.index) // summit,else valley { isSummit = true; } else { isSummit = false; } int a, b; while (isSummit) { cnt++; v1 = listK1.Select((m, index) => new { index, m }).OrderByDescending(n => n.m).Last(); v2 = listK2.Select((m, index) => new { index, m }).OrderByDescending(n => n.m).Last(); if (isSummit) { a = v1.index; b = v2.index; tmp = listK2; } else { b = v1.index; a = v2.index; tmp = listK1; } if (a > b && cnt < 2) //cnt < 2 to avoid infinate loop, it may happen { // set listK1[0-index] = 0 for (int i = 0; i <= a; i++) { tmp[i] = 0; continue; } } break; } cnt = 0; while (!isSummit) { cnt++; v3 = listK1.Select((m, index) => new { index, m }).OrderByDescending(n => n.m).First(); v4 = listK2.Select((m, index) => new { index, m }).OrderByDescending(n => n.m).First(); if (v3.index > v4.index && cnt < 2) //cnt < 2 to avoid infinate loop, it may happen { // set listK1[0-index] = 0 for (int i = 0; i <= v3.index; i++) { listK2[i] = 0; continue; } } break; } if (isSummit) { gap.left = v1.index; gap.right = v2.index; return(gap); } else { gap.left = v3.index; gap.right = v4.index; return(gap); } }