从文本读取以绘制点

本文关键字:绘制 读取 文本 | 更新日期: 2023-09-27 18:32:05

>问候!我想从看起来像这样的文本中阅读:

1111.49 2822.06 Aba
1235.94 2848.48 Abadszalok
1087.09 2768.63 Abaliget
第一个数字是

x,第二个数字是 y。在带有按钮的表单上,它将读取文件并将它们制成点,如下所示:

private void button1_Click(object sender, EventArgs e)
    {
        StreamReader sr = new StreamReader("helyforr.txt");
        double[] x = new double[3124] //there is 3124 lines in the text;
        double[] y = new double[3124];
        while (!sr.EndOfStream)
        {
            string sor = sr.ReadLine();
            sor = sor.Replace('.', ','); //swap '.' to ',' make it double
            string[] r = sor.Split(' ');
            x[0] = Convert.ToDouble(r[0]);
            y[0] = Convert.ToDouble(r[1]);
            Graphics rl = this.CreateGraphics();
            rl.FillRectangle(new SolidBrush(Color.Blue), (Int32)x[0], (Int32)y[0], 1, 1);
        }
        sr.Close();
    }

然而,它不起作用,所以如果有人理解我的想法(和我糟糕的英语)并能够帮助我,我将不胜感激!

从文本读取以绘制点

  1. 您看不到任何东西,因为您的 y 坐标很可能超出了范围,或者您的表单高度真的为 2700+ 像素?

  2. 这不是在 winform 中绘制任何东西的正确方法!而是这样做:

    • 创建一个List<Rectangle> plotpoints并在按钮单击中填写它。或List<Point>List<someClassOrStruct> which could include a颜色"和/或文件中的文本...

    • 决定绘制到哪个Control。代替Form,使用例如Panel

    • Invalidate()每次更新plotPoints列表时都会Panel

    • 使用 event 参数中的 Graphics 对象对 PanelPaint 事件进行编码!

  3. 为什么你的方式错了?好吧,如果你缩小数字,你会看到一些像素,但在你最小化表单并恢复后,它们就会消失。他们不执着!若要创建持久图形,需要绘制PictureBox's Image或使用任何控件的 Paint 事件,以便在需要时绘制到控件上。这意味着当系统注意到需要或调用Invalidate函数时!

因此,您的按钮单击可能如下所示:

List<Rectangle> plotPoints = new List<Rectangle>();
private void button1_Click(object sender, EventArgs e)
{
    StreamReader sr = new StreamReader("helyforr.txt");
    double[] x = new double[3124] //there is 3124 lines in the text;
    double[] y = new double[3124];
    int scale = 10;    // I start with a scale down fastor of 10. 
           // you could also calculate it taking the size of the canvas into account..
    while (!sr.EndOfStream)
    {
        string sor = sr.ReadLine();
        sor = sor.Replace('.', ','); //swap '.' to ',' make it double
        string[] r = sor.Split(' ');
        x[0] = Convert.ToDouble(r[0]) / scale;
        y[0] = Convert.ToDouble(r[1]) / scale;
        plotPoints.Add(new Rectangle( (Int32)x[0], (Int32)y[0], 1, 1));
    }
    sr.Close();
    canvasPanel.Invalidate();
}

您的Paint事件在Panel canvasPanel中看起来像这样:

private void canvasPanel_Paint(object sender, PaintEventArgs e)
{
    foreach (Rectangle r in plotPoints)
       e.Graphics.FillRectangle(new SolidBrush(Color.Blue), r);
}
  1. 除了绘图问题之外,还有其他问题;最值得注意的是,您已经硬编码了行数。我建议用保存数字和文本的List<PointF>List<someStructure>替换这两个数组。这样,您的程序可以处理任何文件长度。