none
Рисуем из файла txt RRS feed

  • Вопрос

  • Подскажите пожалуйста, как правильно нарисовать кривую линию в pictureBox, нажимая на кнопку и считывая координаты из файла txt?

    Я начал так: private void button_click(object sender,  EventArgs e)

    {

    StreamReader reader = new StreamReader(@"C:\u...txt");

    reader.ReadLine();

    Правильно ли это, если да то как продолжить дальше? Как перевести  цифры в точки и по ним построить    кривую линию?

    17 октября 2012 г. 18:55

Ответы

  • Эх-х... Чую, это затянется ещё не на одну неделю...

    Допустим, данные хранятся в файле points.txt в таком виде:

    10 10
    50 10
    100 50
    80 70
    
    То есть в одной строке координаты x и y, разделённые пробелом.

    Point[] points; // поле класса формы
    
    private void button1_Click(object sender, EventArgs e)
    {
        var lines = File.ReadLines("points.txt");
        var pointList = new List<Point>();
    
        foreach (var line in lines)
        {
            var values = line.Split(' ');
            int x = int.Parse(values[0]);
            int y = int.Parse(values[1]);
            var point = new Point(x, y);
            pointList.Add(point);
        }
        points = pointList.ToArray();
        pictureBox1.Refresh();
    }
    
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        if (points != null)
            e.Graphics.DrawLines(Pens.Black, points);
    }

    Все проверки, обработку возможных исключений оставляю на ваше усмотрение.

    • Помечено в качестве ответа georgushek 18 октября 2012 г. 15:39
    18 октября 2012 г. 13:28
  • а если у меня входные значения числа с плавающей точкой!

    Допустим, такие:

    10.5 10.5
    50.5 10.5
    100.5 50.5
    80.5 70.5
    

    var x = double.Parse(values[0], CultureInfo.InvariantCulture);
    var y = double.Parse(values[1], CultureInfo.InvariantCulture);
    var point = new Point((int)x, (int)y);

    Вам уже раньше говорили, что в WinForms координаты целочисленные. Поэтому преобразуем вещественные числа в целые путём приведения.

    • Помечено в качестве ответа georgushek 18 октября 2012 г. 15:39
    18 октября 2012 г. 14:09
  • а ещё можно умножить на число знаков после точки х10,
    главное везде на одно число умножать.
    будет как-бы в масштабе
    но это наврядли надо
    • Помечено в качестве ответа georgushek 18 октября 2012 г. 15:39
    18 октября 2012 г. 14:16
  • штука, которая поможет если ругается программа на запятую или точку при слове Парсе(...).
    по умолчанию (если без использования) берётся по настройкам компьютера вроде бы.

    а вообще http://msdn.microsoft.com/ru-ru/library/system.globalization.cultureinfo.aspx
    • Изменено INFEL8 18 октября 2012 г. 14:47
    • Помечено в качестве ответа georgushek 18 октября 2012 г. 15:39
    18 октября 2012 г. 14:46

Все ответы

  • Приветствую.
    Вроде бы что-то подобное было не очень давно тут на форуме.
    вот пример построчного чтения файла:
    http://msdn.microsoft.com/ru-ru/library/94223t4d.aspx
    у Double есть методы Parse и TryParse.
    Там же наверное с точкой координаты даны.
    Далее всё как в этой теме:
    http://social.msdn.microsoft.com/Forums/ru-RU/programminglanguageru/thread/d721d029-7d38-4bf7-97ab-a82d15da319d

    и тут ещё есть чего почитать:
    http://social.msdn.microsoft.com/Forums/ru-RU/programminglanguageru/thread/e656b211-7ff9-4053-bcad-9736e0dcc7af

    и тут
    http://social.msdn.microsoft.com/Forums/ru-RU/programminglanguageru/thread/029e6f98-ee86-40f9-b15c-cf29e195872c

    Если этого не хватит, то подсказать можно в принципе.
    в Parse может быть культуру надо будет указать или чего-то подобное.
    но может и не надо.
    F5 поможет.

    • Изменено INFEL8 17 октября 2012 г. 19:11
    17 октября 2012 г. 19:09
  • я не могу понять как мне прочитав файл начать рисовать в элементе pictureBox, нажимая на button1? А не рисовать по точкам из textBox и из консольного приложения мне тоже не надо рисовать.
    18 октября 2012 г. 7:53
  • так вот же
    http://social.msdn.microsoft.com/Forums/ru-RU/programminglanguageru/thread/d721d029-7d38-4bf7-97ab-a82d15da319d
    тут написано про то как создать список точек.

    построчно как в 1-м моём ответе прочитать можно, и, используя цикл тот же заполнить список точек.
    ну или все строчки разом (за один метод ReadAllLines()) прочитать, потом циклом по прочитанному пройтись и опять же создать список точек.

    потом этот список точек отправляете в рисование в перегрузке онпейнта.
    там что-то вроде e.графикс.дравмультилине(карандаш, точки); получится.

    если так рисовать, то можно и не на пицтуребокс, а на почти совсем чём угодно.


    Вернее по кнопке вашей сделать заполнение точек,
    а в онпейнте уже отрисовывать вашу кривую по этим точкам.
    • Изменено INFEL8 18 октября 2012 г. 8:15
    18 октября 2012 г. 8:13
  • Что делает оператор лист?

    И что записывать в кавычках в качестве x и y путь к файлу?

    18 октября 2012 г. 10:26
  • List не оператор, а тип коллекции,
    в коллекцию добавляете точки, собранные из файла.

    1) Вам нужно из прочитанной строки выяснить где там в строке координата X, а где Y.
    то есть выделить в строке 2 или сколько там (наверное 2, для х и у) подстроки.
    один кусочек строки будет содержать только координату X, другой только Y.

    2) потом эти куски преобразете через Parse() или TryParse() к нужному типу (наверное double или float, если с точкой).
    3) из этих 2-х преобразованных значений создаёте точку.
    4) добавляете точку в список.
    И тд с 1 по 4 до конца строк в файле.

    Этот цикл в методе, что вызывает кнопка. (ну или прямо в обработчике нажатия кнопки)
    А список должен лежать не в обработчике кнопки, а где-нибудь в месте,
    доступном для обработчика OnPaint.

    В этом обработчике OnPaint используете созданный по кнопке список для рисования кривой,
    так как описано ранее.

    18 октября 2012 г. 10:45
  • А как это передать pictureBox? при нажати на кнопку. Да и там вместо ref пишется out.
    18 октября 2012 г. 11:43
  • ну ref out не важно особо было тогда,
    среда подскажет, я просто так от руки писал.

    А при нажатии на кнопку заполняется список точек,
    который потом или в онпейнте рисуется на графиксе, который в параметре "е" приходит,
    или можно там же в кнопке, но тогда стираться будет до тех пор, пока опять кнопку не нажмёте.

    да и посложнее так чуток
    придётся несколько (или одну) строк дополнительно писать
    можно как тут
    http://social.msdn.microsoft.com/Forums/ru-RU/programminglanguageru/thread/029e6f98-ee86-40f9-b15c-cf29e195872c

    а может быть ещё можно, используя метод pictureBox1.CreateGraphics();
    и использовать этот графикс для рисования.
    потом только наверное нужно будет dispose делать, или using-ом пользоваться.
    но не уверен на счёт этого способа,
    мне всегда онпейнта хватало.
    • Изменено INFEL8 18 октября 2012 г. 13:16
    18 октября 2012 г. 12:02
  • сылка не работает!
    18 октября 2012 г. 12:46
  • подправил,
    некоторая несовместимость форума со мной произошла.
    тут надо постоянно проверять чего за ссылка получилась.
    18 октября 2012 г. 13:17
  • да и Point не работает с double!
    18 октября 2012 г. 13:17
  • Эх-х... Чую, это затянется ещё не на одну неделю...

    Допустим, данные хранятся в файле points.txt в таком виде:

    10 10
    50 10
    100 50
    80 70
    
    То есть в одной строке координаты x и y, разделённые пробелом.

    Point[] points; // поле класса формы
    
    private void button1_Click(object sender, EventArgs e)
    {
        var lines = File.ReadLines("points.txt");
        var pointList = new List<Point>();
    
        foreach (var line in lines)
        {
            var values = line.Split(' ');
            int x = int.Parse(values[0]);
            int y = int.Parse(values[1]);
            var point = new Point(x, y);
            pointList.Add(point);
        }
        points = pointList.ToArray();
        pictureBox1.Refresh();
    }
    
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        if (points != null)
            e.Graphics.DrawLines(Pens.Black, points);
    }

    Все проверки, обработку возможных исключений оставляю на ваше усмотрение.

    • Помечено в качестве ответа georgushek 18 октября 2012 г. 15:39
    18 октября 2012 г. 13:28
  • ну я же не знаю какой там тип Вам надо.
    всяко даже если с точкой там текст, то и это можно привести к точу что надо
    18 октября 2012 г. 13:37
  • а если у меня входные значения числа с плавающей точкой!
    18 октября 2012 г. 13:57
  • а если у меня входные значения числа с плавающей точкой!

    Допустим, такие:

    10.5 10.5
    50.5 10.5
    100.5 50.5
    80.5 70.5
    

    var x = double.Parse(values[0], CultureInfo.InvariantCulture);
    var y = double.Parse(values[1], CultureInfo.InvariantCulture);
    var point = new Point((int)x, (int)y);

    Вам уже раньше говорили, что в WinForms координаты целочисленные. Поэтому преобразуем вещественные числа в целые путём приведения.

    • Помечено в качестве ответа georgushek 18 октября 2012 г. 15:39
    18 октября 2012 г. 14:09
  • а ещё можно умножить на число знаков после точки х10,
    главное везде на одно число умножать.
    будет как-бы в масштабе
    но это наврядли надо
    • Помечено в качестве ответа georgushek 18 октября 2012 г. 15:39
    18 октября 2012 г. 14:16
  • А что такое CultureInfo?
    18 октября 2012 г. 14:38
  • штука, которая поможет если ругается программа на запятую или точку при слове Парсе(...).
    по умолчанию (если без использования) берётся по настройкам компьютера вроде бы.

    а вообще http://msdn.microsoft.com/ru-ru/library/system.globalization.cultureinfo.aspx
    • Изменено INFEL8 18 октября 2012 г. 14:47
    • Помечено в качестве ответа georgushek 18 октября 2012 г. 15:39
    18 октября 2012 г. 14:46
  • А почему у меня только CultureInfoConverter выскакивает? А просто CultureInfo нету.
    18 октября 2012 г. 14:57
  • может using надо,
    а может и сборку.

    Напишите просто CultureInfo,
    там красный (или синий) прямоугольник мелкий у слова слева может появиться.
    на него тыкните и посмотрите,
    может там написано чего


    • Изменено INFEL8 18 октября 2012 г. 15:07
    18 октября 2012 г. 15:06
  • спасибо большое! Когда только я сам этому научусь? Ведь когда смотрю на написанный код вами и понимаю что ответ был где–то на поверхности, а попробуй догадайся!
    • Изменено georgushek 18 октября 2012 г. 15:38
    18 октября 2012 г. 15:29
  • ну там написано слово в слово что я Вам писал и раньше и в этой теме.
    просто уже на языке
    18 октября 2012 г. 15:41