Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Построение графиков


Автор: Redstuff 30.10.2006, 23:36
Подскажите какой компанент отвечает за построение графиков? 
Например, как построить кривую по заданным координатам в плоскости:
X:  Y:
1   3
2   5
3   7
4   9 
5   11
6   15

Автор: Exception 31.10.2006, 00:58
Ну вообще-то это запросто рисуется ручками на PictureBox'е smile . См. метод Graphics.DrawLine().

Автор: ivashkanet 31.10.2006, 09:59
http://forum.vingrad.ru/index.php?showtopic=110706&hl=%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA

Автор: Redstuff 7.11.2006, 00:06
А можно пример  smile ?

Автор: mr.DUDA 7.11.2006, 16:38
Цитата(Redstuff @  6.11.2006,  23:06 Найти цитируемый пост)
А можно пример

Да сколько угодно  smile :

Код
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            // задаём координаты точек и масштаб
            Point[] координаты_точек = {
                new Point(1, 3),
                new Point(2, 5),
                new Point(3, 2),
                new Point(4, 9),
                new Point(5, 1),
                new Point(6, 15)
            };
            float масштаб_по_X = 20f;
            float масштаб_по_Y = 10f;

            // преобразуем в координаты на форме (направление по Y - сверху вниз)
            PointF[] координаты_на_форме = new PointF[координаты_точек.Length];
            for (int i = 0; i < координаты_точек.Length; i++)
            {
                координаты_на_форме[i] = new PointF(
                    координаты_точек[i].X * масштаб_по_X,
                    panel1.Height - координаты_точек[i].Y * масштаб_по_Y);
            }

            // выводим кривую графика
            e.Graphics.DrawCurve(Pens.Black, координаты_на_форме);

            // рисуем "оси координат"
            e.Graphics.DrawLine(Pens.Red, 0, panel1.Height, 0, 0);
            e.Graphics.DrawLine(Pens.Red, 0, panel1.Height - 1, panel1.Width, panel1.Height - 1);
        }
    }
}

Автор: Redstuff 7.11.2006, 17:18
Спасибо mr.DUDA!

А можно примерчик, чтобы точки были не заданны, а вводить их с формы можно было?

Автор: mr.DUDA 7.11.2006, 17:56
Хы, так это некислый пример получится. Вот упрощённый вариант:
Код
using System;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // динамический список точек
        List<Point> _points = new List<Point>();

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                // при нажатии кнопки "Добавить", добавляем точку в список и листбокс
                // чтобы было видно что у нас за точки
                Point pt = new Point(int.Parse(textBox1.Text), int.Parse(textBox2.Text));
                _points.Add(pt);
                listBox1.Items.Add(string.Format("X={0};Y={1}", pt.X, pt.Y));

                // перерисовка графика
                panel1.Refresh();

                // ставим в текстбоксе какие-то данные для следующей точки, фокус - в текстбокс "Y"
                textBox1.Text = (1 + _points.Count).ToString();
                textBox2.Text = "0";
                textBox2.Focus();
                textBox2.SelectAll();
            }
            catch
            {
            }
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            // если точек слишком мало для графика, то и рисовать нечего
            if (_points.Count < 2) return;

            // берём координаты точек и масштаб
            Point[] координаты_точек = _points.ToArray();
            float масштаб_по_X = 20f;
            float масштаб_по_Y = 10f;

            // преобразуем в координаты на форме (направление по Y - сверху вниз)
            PointF[] координаты_на_форме = new PointF[координаты_точек.Length];
            for (int i = 0; i < координаты_точек.Length; i++)
            {
                координаты_на_форме[i] = new PointF(
                    координаты_точек[i].X * масштаб_по_X,
                    panel1.Height - координаты_точек[i].Y * масштаб_по_Y);
            }

            // выводим кривую графика
            e.Graphics.DrawCurve(Pens.Red, координаты_на_форме);
        }
    }
}



Автор: XAH 9.12.2006, 01:39
mr.DUDA  smile АГРОМНОЕ СПАСИБО за этот код, я вообще не представляю себе как бы я сам всё это написал, у меня задание построить разного вида диаграммы, а я мучался, с тем, как создать свою систему координат, щас мне осталось его чуть доработать и меня задание выполенно. Вот только у меня еще есть вопрос по поводу круговой диаграммы, я даже алгоритма не представляю как это сделать. а доработать осталось: масшабируемость, сетку координатную, подписи, сделать столбчатую и круговую диаграммы.

Есть ли какие нибудь несложные библиотеки для построения графиков?

СПАСИБО ЗА КОД ЕЩЁ РАЗ!!!

Автор: Redstuff 9.12.2006, 13:09
XAH, я тоже искал подобное, нашел чарты с разными видами диаграм (круговые....), но масштабируемости нет к сожалению.
скачать сможешь из этой темы http://forum.vingrad.ru/topic-121293/0.html#entry937903

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)