从文本读取以绘制点
本文关键字:绘制 读取 文本 | 更新日期: 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();
}
然而,它不起作用,所以如果有人理解我的想法(和我糟糕的英语)并能够帮助我,我将不胜感激!
-
您看不到任何东西,因为您的 y 坐标很可能超出了范围,或者您的表单高度真的为 2700+ 像素?
-
这不是在 winform 中绘制任何东西的正确方法!而是这样做:
-
创建一个
List<Rectangle> plotpoints
并在按钮单击中填写它。或List<Point>
或List<someClassOrStruct> which could include a
颜色"和/或文件中的文本... -
决定绘制到哪个
Control
。代替Form
,使用例如Panel
-
Invalidate()
每次更新plotPoints
列表时都会Panel
-
使用 event 参数中的
Graphics
对象对Panel
的Paint
事件进行编码!
-
-
为什么你的方式错了?好吧,如果你缩小数字,你会看到一些像素,但在你最小化表单并恢复后,它们就会消失。他们不执着!若要创建持久图形,需要绘制到
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);
}
- 除了绘图问题之外,还有其他问题;最值得注意的是,您已经硬编码了行数。我建议用保存数字和文本的
List<PointF>
或List<someStructure>
替换这两个数组。这样,您的程序可以处理任何文件长度。