Сразу предупрежу – материал очень сырой и некоторые моменты я пропущу. Но это скорее всего все я дополню позднее. Во всяком случае надеюсь, что все получится.
Итак. Я с этим не сталкивался, но наверное в Универах могут давать лабораторные построения графиков по разным формулам. По большому счету неважно как выглядит формула, все сводится к однообразному построению и у начинающих не такие уж сложные задачи.
Я выбрал простой график y=x*x Короткая формула, всем известная кривая (всем кто хоть чуть-чуть учился в школе)
Код C++ Рисование графика
============
#include // включить описание графических функций С/С++ Borland’a
#include // описание функций ввода-вывода с консоли (для getch())
int main ()
float x , y ;
/* Автоматическое определение графических параметров */
int gdriver = DETECT , gmode ;
initgraph ( gmode , “” ); // Инициализация графического режима
x =- 10 ; //Инициализируем x
moveto ( x , x * x ); //Устанавливаем курсор
примитивная графика с++. SetPixel C++. #programming #программирование #обучение #itnotes
do
y = x * x ; //Наша формула для построения графика
lineto ( x * 50 + getmaxx ()/ 2 , getmaxy ()/ 2 -( y * 20 )); // ..откуда рисуем график
x = x + 0.02 ;
> while( x < 10 );
getch (); // ожидание нажатия пользователем любой клавиши
closegraph (); // выход из графического режима
return 0 ;
>
============
Что ж. Сразу скажу – Я не знаю почему x увеличивается на дробное число. При моих попытках увеличивать его на единицу график получался очень даже не гладким и это было плохо, поэтому оставил так как отыскал в просторах интернета. Чтобы начать рисовать линию из какой-то точки имеет смысл определить первоначальную точку, для чего была использована функция moveto Сам график строится с помощью циклического вычисления, ведь для каждого значения x нужно получить соответствующий ему y, значит, чтобы не писать все эти выражения вручную нужно использовать цикл.
Внутри цикла вызывается функция lineto, внутри которой написаны такие параметры, которые могут сбить с толку бедного новичка, но пугаться не стоит. lineto чертит линию от текущей позиции до, но не включая в нее, указанной точки. Другими словами при вычислении значения y мы будем получать некоторые точки, а чтобы получить график, нужно эти точки соединять линиями.
x * 50 + getmaxx ()/ 2 Обозначает, что первоначальная точка x смещена к центру экрана по оси x. Цифра 50 здесь нужна только для того чтобы расширить рисуемый график. Нетрудно попробовать её изменить или убрать, чтобы увидеть эффект. Когда я пытался убрать эту 50 и прибавлять к x единицу вместо 0.02 график рисовался ужасно, хотя если подумать, то то что написано здесь или то что хотел написать я сводится к тому что x прибавляется на единицу, но что-то вот в этом есть чего я понять пока что увы не могу. Точнее понимаю, но понимаю как-то туманно, не полностью и сложно для разъяснений
Не буду скрывать, надеюсь на помощь кого-нибудь из читателей, благодаря критике, благодарностям, указанию моих ошибок этот материал может стать намного легче и понятнее. Проверку на ошибки я убрал, чтобы не отвлекало глаза от описываемого кода
Как построить графики в Windows Forms. Компонент — Chart (Пример кода на C++/C#)
Источник: ciplusplussnachala.wordpress.com
2. Функции базовой графики языка C++
Для того чтобы студент мог свободно читать тексты программ на языке C++ желательно ознакомиться с тем положительным опытом программирования графики, накопленным с DOS средах. Все лучшее созданное там было перенесено в Windows программирование. Дадим сравнение программирования графики в DOS и Windows средах.
2.1 Базовая графика в среде Borland С++ 3.1
В настоящее время во всех современных компьютерах применяется графический режим вывода информации, а операционная система Windows не знает символьного режима. В языке программирования C++ с реализацией под операционную систему DOS графические функции хранятся в библиотеке graphics.lib , а прототипы (объявления) этих функций находятся в файле graphics.h . Мы будем рассматривать графические функции не в отрыве от практического применения, но наоборот обратим особое внимание на логику составления графических программ. Это понадобится вам при изучении технологии DirectDraw в C++ Builder под Windows, так как в технологии DirectDraw для обеспечения быстрого вывода изображения на дисплей переняты лучшие воплощения графических функций для операционной системы DOS.
2.1.1 Инициализация графического режима
> /* 2. Рисование линии из правого верхнего угла в левый нижний */ line(0, 0, getmaxx(), getmaxy()); /* 3. Закрытие графического режима */ getch(); closegraph(); return 0; > Если вы не внесли опечаток в текст программы, тогда файл proba1.exe начнет работать. По диагонали экрана должна рисоваться на черном фоне белая линия из правого верхнего угла в левый нижний угол.
2.1.2 Типовые ошибки инициализации
Возможны три причины, по которым программа proba1.exe с графикой будет работать не так, как мы предположили. Первая — отсутствие в рабочей папке с исполняемым файлом proba1.exe файла драйвера egavga.bgi . Результатом работы программы будет сообщение: Ошибка инициализации: Device driver file not found Нажми любую клавишу (Press any key to halt) Это как-то даже неуместно называть проблемой.
Из папки BGI среды программирования файл egavga.bgi переписывается в вашу рабочую папку и все. Другой вариант. Файл egavga.bgi «лежит» в папке рядом с файлом proba1.exe , но линия не рисуется.
Если программа proba1.exe начинает вытворять неизвестно что (или выдает другую ошибку или по экрану начинает «бегать» курсор), тогда смело сотрите старый драйвер egavga.bgi и поищите у знакомых или на дисках новую версию. «Ломаные» драйверы встречаются не так редко. Третья причина — это экзотический «баг». Она встречается в основном в компьютерных сетях. По неизвестной причине файл драйвера egavga.bgi отказывается работать до тех пор, пока с этого файла не снять атрибут «только для чтения». Надеюсь, что вы не работаете с удаленного компьютера в сети, поскольку там есть еще ряд особенностей работы среды программирования, связанных c загрузкой среды с другого компьютера и атрибутами «только для чтения».
2.1.3 Графические примитивы
Основу мы уже заложили: знаем, как переключиться в графический режим, где применить функции и как правильно завершить работу графической части. Теперь займемся непосредственно разбором примеров с рисованием графических функций. Самые простые функции называются графическими примитивами. Условно примитивы можно разделить на группы: примитивы рисования контуров и площадные фигуры. К примитивам контуров относятся: линии ( line ), прямоугольники ( rectangle ), дуги ( arc ), окружности ( circle ), эллипсы ( ellipse ), многоугольники ( drawpoly ) и прочие не закрашиваемые внутри фигуры. Площадными, закрашиваемыми внутри фигурами являются прямоугольники ( bar , bar3d ), круговые и эллиптические секторы ( pieslice, sector ). Если у вас фигура замкнута, но не залита, например, многоугольник ( drawpoly ), то его всегда можно закрасить внутри с помощью функций закраски ( floodfill , setfillstyle ). Для выбора цвета рисования применяется функция задания текущего (по умолчанию) цвета графических примитивов ( setcolor ). Для определения цвета точки по ее координатам на экране существует функция getpixel , а для
вывода точки заданным цветом на экран — setpixel . Вот и весь смысл работы с выводом графических примитивов. Данная логика интуитивно понятна обычному школьнику. Подробное описание и параметры графических функций можно найти в любом справочнике по C++.
Если у вас под рукой нет справочника, тогда наберите в редакторе среды программирования интересующее вас имя функции, наведите на него курсор и нажмите комбинацию клавиш Ctrl+F1 . На экране появится описание функции и внизу подсказки ссылка на пример программы с выбранной графической функцией. Например, если вы введете имя функции rectangle и нажмете нужные клавиши, появится подсказка по функции рисования прямоугольника с характерным примером применения. Но кое-что вы можете увидеть и в примере из листинга 2.2, в котором воедино собраны некоторые распространенные функции для работы с примитивами. Листинг 2.2. Демонстрация работы графических функций // rectangl.cpp #include #include #include #include void main(void)
// 2 Рисование | |||
setcolor(WHITE); | |||
outtextxy(xr,yr+100, | |||
«rectangle | ellipse | circle | arc»); |
left = xr +0; top = yr +0; right = xr+100; bottom = yr+50; rectangle(left,top,right,bottom); ellipse(xr+150, yr+25, stangle, endangle, xradius, yradius); circle(xr+250, yr+25, radius); arc(xr+350, yr+25, stangle_arc, endangle_arc, radius); midx = xb; midy = yb;
outtextxy(xb+100, yb+60, «bar + setfillstyle»); outtextxy(xb+100, yb+200, «sector + setfillstyle»); for (int i=SOLID_FILL; i // 3 Закрытие графического режима getch(); closegraph(); > В этой простой программе обратите внимание на перечисление типов закраски площадных фигур в цикле for (int i=SOLID_FILL; i
I=0 | ENUM_FILL | Заливка цветом фона | |||
I=1 | SOLID_FILL | Заливка | текущим | цветом | |
(установленным setcolor()) | |||||
I=2 | LINE_FILL | Горизонтальная штриховка | |||
I=3 | LTSLASH_FILL | Штриховка тонкими линиями под углом | |||
45 ° влево | |||||
I=4 | SLASH_FILL | Штриховка | толстыми | линиями | под |
углом 45 ° влево | |||||
I=5 | BKSLASH_FILL | Штриховка | толстыми | линиями | под |
углом 45 ° вправо | |||||
I=6 | LTBKSLASH_FILL | Штриховка линиями под углом 45 ° | |||
вправо | |||||
I=7 | HATCH_FILL | Штриховка в клетку | |||
I=8 | XHATCH_FILL | Штриховка в клетку под углом 45 ° | |||
I=9 | INTERLEAVE_FILL | Частая штриховка в клетку под 45 ° | |||
I=10 | WIDEDOT_FILL | Заполнение редкими точками | |||
I=11 | CLOSEDOT_FILL | Заполнение частыми точками | |||
I=12 | USER_FILL | По шаблону программиста |
На рис. 2.2 показана экранная копия работы программы rectang1.cpp , иллюстрирующая перечисленные способы заполнения внутренних областей.
Источник: studfile.net
LiveCharts. Строим графики в WinForms
Вот готовый проект AnalitikProg, если лень читать.
Итак, поехали.
1) Создаем проект WinForm называем его AnalitikProg, платформа .Net Framework 4.7.2
2) Св-ву Name формы присваиваем значение «AnalitikProg».
3) Добавляем на форму элемент ToolStrip, делаем кнопке Display равным «Text».
4) Выделяем кнопку и меняем св-во name на «toolStripButtonGenerate», а св-ву Text значение «Сформировать график».
5) Теперь необходимо добавить nuget-пакет, который называется LiveChart.

6) Обратим внимание, что в панели элементов появились новые элементы:

7) Перетаскиваем на форму элемент CartesianChart и его св-ву Dock выставим Fill.
8) Теперь дважды нажимаем кнопку «Сформировать график», переходим в код и за пределами метода обработчика нажатия по кнопке создаем класс Data, так сказать «заготовочка» для будущей коллекции со значения для графика.
< public int values < get; set; >public DateTime date < get; set; >>
9) Перед методом Form1 создаем переменную типа List , а в методе Form1 после компонента initializeComponent() инициализируем обобщенную коллекцию в которой будут содержаться элементы типа Data и заполним ее данными.
Значит легенда такая, программа нужна трейдеру, чтобы просматривать динамику изменения его заработка.
datas = new List() < new Data()< values=35000,date=new DateTime(2020,01,01) >, new Data()< values=30000,date=new DateTime(2020,01,02) >, new Data()< values=40000,date=new DateTime(2020,01,03) >, new Data()< values=55000,date=new DateTime(2020,01,04) >, new Data()< values=55000,date=new DateTime(2020,01,05) >, new Data()< values=30000,date=new DateTime(2020,01,06) >, new Data()< values=35000,date=new DateTime(2020,01,07) >, new Data()< values=42000,date=new DateTime(2020,01,08) >, new Data()< values=57000,date=new DateTime(2020,01,09) >, new Data()< values=88000,date=new DateTime(2020,01,10) >, new Data()< values=51000,date=new DateTime(2020,01,11) >, new Data()< values=65000,date=new DateTime(2020,01,12) >, new Data()< values=100000,date=new DateTime(2020,01,13) >, new Data()< values=75000,date=new DateTime(2020,01,14) >, new Data()< values=88000,date=new DateTime(2020,01,15) >, new Data()< values=92000,date=new DateTime(2020,01,16) >, new Data()< values=99000,date=new DateTime(2020,01,17) >, new Data()< values=87000,date=new DateTime(2020,01,18) >, new Data() < values=110000,date=new DateTime(2020,01,19) >>;
Сейчас код выглядит так:
10) Теперь переходим к кнопке, кликаем по ней 2 раза и забиваем в нее следующий код.
SeriesCollection series = new SeriesCollection(); //отображение данных на график. Линии и т.д. ChartValues zp = new ChartValues(); //Значения которые будут на линии, будет создания чуть позже. List date = new List(); //здесь будут храниться значения для оси X foreach (var item in datas) //Заполняем коллекции < zp.Add(item.values); date.Add(item.date.ToShortDateString()); >cartesianChart1.AxisX.Clear(); //Очищаем ось X от значений по умолчанию cartesianChart1.AxisX.Add(new Axis //Добавляем на ось X значения, через блок инициализатора. < Title = «Дата», Labels = date >); LineSeries line = new LineSeries(); //Создаем линию, задаем ей значения из коллекции line.Title = «»; line.Values = zp; series.Add(line); //Добавляем линию на график cartesianChart1.Series = series; //Отрисовываем график в интерфейсе
12) В общем то все, осталось запустить и проверить
Могу порекомендовать сходить на сайт поддержки библиотеки https://lvcharts.net там есть много интересной информации и раскрыты все возможности библиотеки.
Если понравилось — ставь лайк!
Опубликовано 01.07.2020 03.05.2021 Автор admin Рубрики Пример программ на C#
Один комментарий к “LiveCharts. Строим графики в WinForms”
а если надо динамически данные добавлять на график, а не в коде? ну например по нажатию кнопки добавить новые значения? м?