将在图表控件上绘制的点写入文本文件,但每个坐标仅一次?

Posted

技术标签:

【中文标题】将在图表控件上绘制的点写入文本文件,但每个坐标仅一次?【英文标题】:Write points drawn over a chart control to a text file the but only once each coordinate? 【发布时间】:2015-05-16 14:13:18 【问题描述】:

在按钮点击事件中:

private void chart1_MouseClick(object sender, MouseEventArgs e)

    if (outofrange == false)
    
        valuePoints.Add(new PointF(X, Y));
        paintToCalaculate = true;

        if (X > 0 && Y > 0)
        
            chart1.Invalidate();
            SavePointsCoordinates();
        
    

还有 SavePointsCoordinates 方法:

StreamWriter w;
int countPoints = 0;

private void SavePointsCoordinates()

    if (drawPoints.Count > 0)
    
        foreach (Point p in drawPoints)
        
            countPoints++;
            w = new StreamWriter(@"c:\chart\chartData.txt",true);
            w.WriteLine("Point " + countPoints + "X = " + p.X + " Y = " + p.Y);
        

        w.Close();
    

问题是,如果我多次单击按钮而不添加新点,它将继续向文本文件添加相同的坐标。

事实上,它已经在按钮单击事件中的 valuePoints 中添加了相同的点坐标。 valuePoints 是列表

drawPoints 是我在 chart1 绘制事件中使用的列表:

Pen pen = new Pen(Color.Blue, 2.5f);
SolidBrush myBrush = new SolidBrush(Color.Red);

private void chart1_Paint(object sender, PaintEventArgs e)

    if (paintToCalaculate)
    
        Series s = chart1.Series.FindByName("dummy");

        if (s == null)
        
            s = chart1.Series.Add("dummy");
        

        drawPoints.Clear();
        s.Points.Clear();

        foreach (PointF p in valuePoints)
        
            s.Points.AddXY(p.X, p.Y);
            DataPoint pt = s.Points[0];
            double x = chart1.ChartAreas[0].AxisX.ValueToPixelPosition(pt.XValue);
            double y = chart1.ChartAreas[0].AxisY.ValueToPixelPosition(pt.YValues[0]);
            drawPoints.Add(new Point((int)x, (int)y));
            s.Points.Clear();
        

        paintToCalaculate = false;
        chart1.Series.Remove(s);
    

    foreach (Point p in drawPoints)
    
        e.Graphics.FillEllipse(Brushes.Red, p.X - 2, p.Y - 2, 4, 4);
    

    if (drawPoints.Count > 1)
    
        e.Graphics.DrawLines(pen, drawPoints.ToArray());
    

我想要做的是将我在图表上绘制的所有点坐标写入文本文件,然后在构造函数中读回文本文件将点绘制回图表并在它们之间绘制线条.

我不确定我绘制的点和线之间的顺序是否有意义。只是将所有坐标写入文本文件并回读。

【问题讨论】:

你应该把你的问题分开。 a) 保存和检索数据,尤其是当它们可序列化时,最好在 xml 文件中完成。 b) 获得正确的数据集合和保存它们的最佳时机是一个或两个完全不同的问题.. 【参考方案1】:

这是保存List<Point> 的推荐方法。 Point 是Serializeable,所以这几行就可以保存和加载List<Point> points

string yourPointsFile = "d:\\myPoints.xml";
XmlSerializer xmls = new XmlSerializer(typeof(List<Point>));

// save the points maybe when closing the program:
using (Stream writer = new FileStream(yourPointsFile, FileMode.Create))

    xmls.Serialize(writer, points);
    writer.Close();


// load the points at startup:

using (Stream reader = new FileStream(yourPointsFile, FileMode.Open))

    points = xmls.Deserialize(reader);
    reader.Close();

收集正确的积分,添加或不添加它们是另一个问题。为避免重复,您始终可以使用

if (!points.Contains(somePoint) ) points.Add(somePoint);

保存和加载的点列表将具有相同的顺序。因此,如果要使用它们来绘制线条,在顺序确实很重要的情况下,生成的线条应该是相同的。

我认为每次点击都保存积分没有意义,但这是您的程序。也许在关闭程序时保存它们就足够了..?

如果您想保存PointF,只需将两个对Point 的引用更改为PointF

【讨论】:

我会考虑一下,也许我会在关闭程序时使用它。但我不明白如何处理 points2 ?我将它更改为表单中的全局,但它是对象我如何将点坐标内的值添加到我的 drawPoints(点)列表? points2 只是一个测试示例,以表明它们包含与points 相同的点。您可以将加载例程放在构造函数或 form_load 中以加载drawPoints。并将drawPoints 保存在结束事件中。所以你保存并加载drawPoints 列表。我已经稍微改变了答案,因为 points2 变量令人困惑地超出了范围.. 是的,我想你确实想保存值点列表,所以将类型更改为List&lt;PointF&gt;!绘图点包含像素,这些像素在开始和关闭之间可能完全不同! 你不能使 valuepoints = xmls.Deserialize(reader);我在右侧出现错误:错误 3 无法将类型“对象”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)我已经将 xmls typeof 更改为 List 但仍然出现此错误。 啊,我认为这是有效的。 valuepoints = (List)xmls.Deserialize(reader);

以上是关于将在图表控件上绘制的点写入文本文件,但每个坐标仅一次?的主要内容,如果未能解决你的问题,请参考以下文章

使用D3绘制图表--添加坐标轴和文本标签

Android雷达图(蜘蛛网图)绘制

R:在 shapefile 中的多边形上绘制 .gdb 文件中的点

我使用excel插入图表时,横坐标本来是文本,但显示的是数字,这是啥原因

如何获取 ContextMenuStrip 的位置?

C#/ Excel:在图表上使用最大系列尺寸