人体节律【智力、情绪、体力】软件编写,虽然在这个论坛上得不到任何代码支持和帮助,花2天时间学习例子,修改参数,温习知识(三角函数、圆周、正弦、余弦...)终于弄明白了该如何写出正确代码,主要算法代码不过几行即可,记录如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace 人体节律 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { 三曲线(生日.Value); } private void 三曲线(DateTime 生日) { //曲线显示.ChartAreas.Clear(); //曲线显示.ChartAreas.Add("Default"); 曲线显示.ChartAreas["Default"].AxisX.LabelStyle.Interval = 1; //曲线显示.ChartAreas["Default"].AxisX.LabelStyle.Format = "##.##"; 曲线显示.ChartAreas["Default"].AxisX.MajorGrid.Interval = 1; 曲线显示.ChartAreas["Default"].AxisY.MajorGrid.Interval = 0.1;//Y轴间隔 曲线显示.ChartAreas["Default"].AxisY.LabelStyle.Interval = 0.1;//Y轴标注 //曲线显示.ChartAreas["Default"].Area3DStyle.Enable3D = true; //曲线显示.ChartAreas["Default"].AxisX.MinorGrid.Interval = 1; //曲线显示.ChartAreas["Default"].AxisX.MinorTickMark.Interval = 1; //曲线显示.ChartAreas["Default"].AxisX.MajorTickMark.Interval = 1; //曲线显示.ChartAreas["Default"].AxisY.MinorGrid.Interval = 0.1; //------------------------------------ DateTime 当前日期 = System.DateTime.Now; DateTime 假定日期 = Convert.ToDateTime("1900-1-1"); if (生日 != 当前日期) { 假定日期 = 生日; } System.TimeSpan 日差值 = 当前日期 - 假定日期; int 间隔 = 日差值.Days, 智力 = 间隔 % 33, 情绪 = 间隔 % 28, 体力 = 间隔 % 23; double 均值 = (智力 + 情绪 + 体力) / 3; 曲线显示.Series["智力"].Points.Clear(); 曲线显示.Series["情绪"].Points.Clear(); 曲线显示.Series["体力"].Points.Clear(); 曲线显示.Series["均值"].Points.Clear(); for (double t = 0; t <= 2 * 16.5; t++)//画多长的曲线 t <= 数值可调整如等于33则显示完整的33一个正弦波形 { double ch1 = Math.Sin((t + 智力) * 2 * Math.PI / 33);//2*Math.PI*r一个圆周按R的步进增长乘以正弦函数得到点坐标形成以时间为X轴展开的正弦波形/一个周期画多少个点(周期) 曲线显示.Series["智力"].Points.AddXY(t, ch1); double ch2 = Math.Sin((t + 情绪) * 2 * Math.PI / 28); 曲线显示.Series["情绪"].Points.AddXY(t, ch2); double ch3 = Math.Sin((t + 体力) * 2 * Math.PI / 23); 曲线显示.Series["体力"].Points.AddXY(t, ch3); double ch4 = 0.1 * Math.Sin((t + 均值) * 2 * Math.PI / 23); 曲线显示.Series["均值"].Points.AddXY(t, ch4); } } private void 画网格() { int 小时 = DateTime.Now.Hour; int 秒 = DateTime.Now.Second; int 分钟 = DateTime.Now.Minute; Graphics 实例 = 曲线显示.CreateGraphics(); //实例.Clear(Color.White); Pen 线条 = new Pen(Color.Green, 1); Pen 线条1 = new Pen(Color.Orange, 1); for (int 线 = 10; 线 < 210; 线 = 线 + 10) { 实例.DrawLine(线条, new Point(线 + 30, 10), new Point(线 + 30, 200));//竖线需X坐标=同 实例.DrawLine(线条1, new Point(40, 线), new Point(230, 线));//横线需Y坐标=同 } string[] 标注 = { "100", "90", "80", "70", "60", "50", "40", "30", "20", "10", "0", "-10", "-20", "-30", "-40", "-50", "-60", "-70", "-80", "-90", "-100" }; int y = 0; Font font = new System.Drawing.Font("Arial", 9, FontStyle.Regular); for (int i = 0; i < 21; i++) { 实例.DrawString(标注[i].ToString(), font, Brushes.Red, 0, y); y = y + 10; } PointF[] 弦线值 = new PointF[200], 弦线值1 = new PointF[180]; for (int i = 0; i < 弦线值.Length; i++) { 弦线值[i].X = 40 + i;//起始位置 弦线值[i].Y = 220 / 2 * (1 - (float)0.8 * (float)Math.Sin(i * 2 * Math.PI / 33)); }// 轴位置 幅度 for (int i = 0; i < 弦线值1.Length; i++) { 弦线值1[i].X = 40 + i;//起始位置 弦线值1[i].Y = 220 / 2 * (1 - (float)0.8 * (float)Math.Sin(i * 2 * Math.PI / 28)); } 实例.DrawLines(new Pen(SystemColors.WindowText), 弦线值); 实例.DrawLines(new Pen(SystemColors.WindowText), 弦线值1); } private void 生日_ValueChanged(object sender, EventArgs e) { 三曲线(生日.Value); } private void button1_Click(object sender, EventArgs e) { //三曲线(生日.Value); } private void 曲线显示_Paint(object sender, PaintEventArgs e) { //三曲线(生日.Value); } } }
// // 曲线显示 // this.曲线显示.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); chartArea1.AxisX.IsMarginVisible = false; chartArea1.AxisX.ScaleBreakStyle.MaxNumberOfBreaks = 1; chartArea1.AxisX.ScaleBreakStyle.Spacing = 1D; chartArea1.AxisY.IsMarginVisible = false; chartArea1.IsSameFontSizeForAllAxes = true; chartArea1.Name = "Default"; this.曲线显示.ChartAreas.Add(chartArea1); legend1.Name = "Legend1"; this.曲线显示.Legends.Add(legend1); this.曲线显示.Location = new System.Drawing.Point(2, 3); this.曲线显示.Name = "曲线显示"; series1.ChartArea = "Default"; series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline; series1.IsXValueIndexed = true; series1.Legend = "Legend1"; series1.Name = "智力"; series2.ChartArea = "Default"; series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline; series2.IsXValueIndexed = true; series2.Legend = "Legend1"; series2.Name = "情绪"; series3.ChartArea = "Default"; series3.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline; series3.IsXValueIndexed = true; series3.Legend = "Legend1"; series3.MarkerSize = 1; series3.Name = "体力"; series4.ChartArea = "Default"; series4.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline; series4.IsXValueIndexed = true; series4.Legend = "Legend1"; series4.Name = "均值"; this.曲线显示.Series.Add(series1); this.曲线显示.Series.Add(series2); this.曲线显示.Series.Add(series3); this.曲线显示.Series.Add(series4); this.曲线显示.Size = new System.Drawing.Size(780, 186); this.曲线显示.TabIndex = 0; this.曲线显示.Text = "曲线"; this.曲线显示.Paint += new System.Windows.Forms.PaintEventHandler(this.曲线显示_Paint);
运行效果如图:
一些较早开发的类似软件已经显得不太好用,采用新的控件设计出来,在操作上更好用,比如输入生日,新的控件点击选择年月日更方便,而且可以使用键盘上的4个方向键调节,即时得到曲线的滚动变化,还可以做到3D图像、漂亮的背景图片显示等......
以上初步完成主要功能和算法,有这个基础,再想怎么开发就看开发的人是怎么想的了,哈哈......;“前不见古人,后不见来者,念天地之悠悠,没人支持几下怆然怆然”哈哈哈哈......