Форум программистов, компьютерный форум CyberForum.ru

Как нарисовать график функции? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
12.03.2014, 19:27     Как нарисовать график функции? #1
Привет всем. Учусь программированию всего пол года. И тут мне дают задание - написать программу для рисования графика функции y=x. Скажите, чтобы написать программу, нужны графические библиотеки? Я не хочу, чтоб вы писали программу за меня. Просто скажите, какую лучше библиотеку установить? И можно ли как-то обойтись без них? И последний вопрос. Библиотеку DirectX будет трудно освоить новичку? Извините за такое большое количество вопросов. Заранее спасибо за ответ.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2014, 19:27     Как нарисовать график функции?
Посмотрите здесь:

Как нарисовать график? C++
C++ Как нарисовать график функции?
Как построить график функции x=5 C++
C++ Нарисовать график функции
C++ Как нарисовать график в Excel через Visual Studio?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dogg12
 Аватар для dogg12
57 / 23 / 5
Регистрация: 21.02.2011
Сообщений: 503
12.03.2014, 22:10     Как нарисовать график функции? #2
Sh@dow777,
C++
1
2
3
4
5
6
7
8
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
12.03.2014, 23:08  [ТС]     Как нарисовать график функции? #3
Извините, а можно поподробнее?=) Я повторюсь - учусь всего лишь полгода. Знаю пока немного. Где мне можно посмотреть команды для рисования?
dogg12
 Аватар для dogg12
57 / 23 / 5
Регистрация: 21.02.2011
Сообщений: 503
13.03.2014, 10:39     Как нарисовать график функции? #4
Позволю себе немного копи-паста)

1) Библиотека graphcs.h
Кликните здесь для просмотра всего текста
Опираясь на знаниях, полученных давным давно в институте, я помнил что была, была в C++ либа graphics.h, которая что-то такое умела. Н-но!... (Ультразвуком, в подражание Радзинскому...) Н-но-о... Это было давно и неправда, библиотека устарела. Да и расчитана она была на рисование на VGA-экране, а не картинки в файл, многопоточно, под x64. Все течет все меняется... Как бы то ни было, мне эта либа не подходила.


2) ImageMagick
Кликните здесь для просмотра всего текста
ImageMagick - первое что предлагает Гугл начинающему погроммисту. Я тоже подумл, что это может быть клево - пром.стандарт, поддержка всего, всё такое... Но я ошибался. Несмотря на картинку милого дедушки в колпаке волшебника, обширные рекомендации дедушек с habrahabr и обширную документацию на оф.сайте, библиотека, скажу честно, поганая. То есть - как сказать... После того как сорцы библиотеки откомпилированны, получается в общем-то неплохой набор утилит для конвертации и прочих изощрений над картинками из командной строки (Linux-style). И откомпилированные бинарники уже есть, даже и с красивым виндовым инсталлятором. Но - главный и основной недостаток - API Magick++ никак не доступно в уже готовых скомпиллированных версиях. Чтобы получить нормальный набор подключаемых библиотек, ты должен скачать сорц и скомпиллировать его. И вот тут-то и начинаются проблемы.

В качестве IDE для разработки я использую CodeBlocks, в связке с компиллятором MinGW32 или -64. Мне нравится CodeBlocks, он удобный, работоспособный, MinGW - это хороший компиллер, всё работает просто, надежно, классно. НО! ImageMagick под ним не компиллится. Никак. И об этом даже написано на форуме разработчиков. А в ответ на прямой вопрос разрабы ответили столь же прямо: "Ну низнаю, мы юзаем Visual Studio C++ 2k8 и у нас всё работает!.."

После таких гордых заявок сразу стало понятно что это не мой выбор.


3) GraphicsMagick
Кликните здесь для просмотра всего текста
GraphicsMagick - форк от предыдущего нашего подопытного, ImageMagick, перепиленный для вящей стабильности, поддержки многопоточности и т.п. На логотипе GM красуется жирная жаба.

Также как и предыдущий подопытный, не работает. Кроме того, я не нашел в бинарниках версии под Winx64. Короче - жаба она и есть жаба. Не наш выбор.


4) CImg
Кликните здесь для просмотра всего текста
CImg - творение одного немецкого программиста. Библиотечка призвана облегчить работу с перенаворочанной ImageMagick, и требует наличия на компьютере оной, пусть даже установленной из бинарников. По словам разработчика, задачей было обеспечить максимальное удобство и простоту в подключении, работе и действиях с либой. ИЧСХ, отчасти ему удалось этого добиться - подключение действительно простейшее. Библиотечка вся собственно состоит из одного массивненького заголовочного файла CImg.h, который просто подтыкаешь к проекту и юзаешь. Но вот когда дело доходит до программирования, становится грустно. Сразу начинает ощущаться ДОВЛЕНИЕ сумрачного тевтонского гения. Угрюмая документация угрюма, функции единственного класса CImg, отвечающего практически за всё, угрюмы еще более и перегружены по уши.

Тем не менее, если ваш гений не менее сумрачен и довлеющ, разобраться можно. И это действительно работает. Но мне, скажу честно, эта библиотека показалась неудобной, переусложненной для моих целей.


5) OpenCV
Кликните здесь для просмотра всего текста
О-о-о, это песня! Дедушки с хабры часто советуют салагам юзать этот пакет, дабы обрабатывать картинки как настоящие джыдаи. Но - черт побери, зачем?! Open CV даже в запакованном состоянии весит 250 метров, и страшно подумать сколько в распакованном, а главное - это же, черт побери, библиотека для обеспечения зрения роботам! Да, помимо прочего она таки работает под x64, и умеет обрабатывать картинки, да... Но - использовать её чтобы рисовать линии и сохранять jpg - это колоть орехи микроскопом! OpenCV - очень интересная для меня вещь, так как я хочу с её помощью реализовать несколько амбициозных проектов связанных с игровыми устройствами для ПК, но в данном случае использовать её смешно и нелепо.


6) FreeImage
Кликните здесь для просмотра всего текста
FreeImage - это небольшая и аккуратная библиотека для манипулирования картинками. Она позиционируется как универсальная библиотека для работы с изображениями, и, что характерно, это почти что так и есть. Первоначально библиотека написана на C, но есть врапперы, не только на C++, но и на Delphi, и на VB. Библиотека сделана скромненько и чистенько, классы и методы удобны и интуитивно понятны, но есть одно важное "но". Библиотека обрабатывает изображения, конвертирует их, поворачивает, и т.п., но не рисует. Использовать стоит, если хотите сделать просматривальщик картинок.


7) ImageStone
Кликните здесь для просмотра всего текста
ImageStone - тащемта, то же самое, что и описанный выше FreeImage. Отличия в том что представляет собой единый класс, и писано изначально на C++. В остальном примерно то же самое, разве что доступных эффектов побольше. В целом мило, но опять же, не рисует. На любителя.


8) Предложения от Micro$oft
Кликните здесь для просмотра всего текста
Перебрав 7 вариантов и не найдя ничего толкового, я задумался. Это выглядело уже как-то нездорово - неужели для С++ нет какой-то простой, примитивной библиотеки, которая способна нарисовать на картинке простую линию и простой квадратик, без каких-то безумных классов, корявых врапперов, кибернетического зрения, привязки к контрольным точкам и прочих афинных преобразований? То есть (исходя из своего опыта) я предполагал, что вполне возможно что и нет, но верить в это не хотелось. Я полез на сайт Micro$oft в MSDN и TechNet. Известно же, что редмондский софтверный джаггернаут за время своего бесконечного существования наклепал бесконечное количество кода для абсолютно любых случаев жизни...

Я вот выше заметил что, мол, нездорово. Так вот, дорогие кинослушатели, это еще - не нездорово, это еще очень даже ничего было!..

M$ предлагает несколько вариантов кода для работы с изображениями, и варианты эти один, кхм, эзотеричнее другого.

В качестве стандартизированного современного метода нам предлагается графика на базе Direct2D. Спору нет, это всё мило. Но посмотрите на объем кода! Это что, чтобы нарисовать один квадратик, я должен накопипастить всю эту, простите, копипасту?! Это как в старом еврейском анекдоте:
“Приходят два еврея к раввину, Изя и Моня.

Моня: Рабби, Изя меня обозвал дураком! Таки не годится так!

Раввин: Таки да. Изя, такь нельзя! Сейчас же скажи что Моня не дурак, и извинись.

Изя: Моня? Не дурак?! Ну извините!..


Так и здесь - ну извините!..

Помимо совсем уж эзотерического современного метода есть и более традиционные, старые методы, такие как GDI, GDI+ и т.п. Почитать о них можете здесь. Вообще нельзя сказать, что они намного уж менее эзотерические, но таково любое программирование под продукцию Micro$oft.

А вообще говоря, прямо насмехаться над таким кодом не очень корректно. Несмотря на сложность и громоздкость, код от M$ обычно весьма универсальный, предназначен для максимальной функциональности и опирается на всю мощь окружающей его винды. Да, это сделано в ущерб простоте. Но с другой стороны, позволяет в нескольких командах использовать всю мощь современного железа и результаты объединенного труда тысяч микрософтовских кодеров.

Другое дело, что для моих задач разбирать наскальную живопись M$ было неинтересно.


9) EasyBMP.
Кликните здесь для просмотра всего текста
Я уже было приуныл, думая что придется либо возиться с D2D от M$ (если уж писать, то на основе клевой технологии, использующей мощь видяхи!), или писать что-то своё (по традиции, изобретая очередной атомный велосипед с восемью додекаэдрическими колесами и фисташковым охлаждением), но тут мне попалась ссылка на EasyBMP.

Что это такое? Это маленькая библиотека на C++, предназначенная для создания файлов .BMP и рисования в них. Добавляется к проекту легко, работает быстро. Несколько огрочало отсутствие инструментов для рисования линий и заливки всей картинки, но дополнительный класс быстро сыскался в расширениях к библиотеке, правда, для моих задач методы рисования линий пришлось слегка поправить чтоб работали быстрее (профиксить использование алгоритмов Брезенхема для вертикальных линий), а метод для заливки я сварганил сам за 3 минуты.

Обращаю ваше внимание, что библиотека написана достаточно примитивно, на уровне новичка. но тем не менее, главное её достоинство - она работает быстро, а методы интуитивно понятны.

Библиотечка написана человеком и пароходом Paul Macklin, ныне директором Объединения по Компьютерному Исследованию Онкологических Заболеваний при университете Южной Калифорнии. Что ж, я кажу - нэплохо. Для такого проекта как простой визуализатор звуковой волны, EasyBMP - наш выбор.

Если исследования рака ведутся так же хорошо, как сделана EasyBMP, то онкологические заболевания абсолютно точно будут побеждены.
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
13.03.2014, 10:51     Как нарисовать график функции? #5
А я могу посоветовать OpenGL. Мне кажется, что движок не такой уж и сложный. Во всяком случае для рисования примитивов долго учиться ну нужно. Я сам довольно быстро освоил 2D-графику, что в принципе и нужно для построения графиков. Есть конечно свои минусы, но в целом мне нравится. Вот как вариант.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
13.03.2014, 10:58     Как нарисовать график функции? #6
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
написать программу для рисования графика функции
Тут самый первый вопрос это рисование в чем? Прям в консоли, в любой области на экране, на каком-нибудь элементе в визуальной среде?

Цитата Сообщение от Sh@dow777 Посмотреть сообщение
DirectX будет трудно освоить новичку?
Да.

Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Где мне можно посмотреть команды для рисования?
Например:
Рисование в с++ :)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2014, 17:52     Как нарисовать график функции?
Еще ссылки по теме:

Как с помощью функции setpixel нарисовать прямую C++
Нарисовать график функции в отдельном окне C++
Как в Visual C++ 2012 нарисовать линию или график функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
13.03.2014, 17:52  [ТС]     Как нарисовать график функции? #7
А что вы можете сказать про библиотеку GTK+? Плюсы, минусы?
Yandex
Объявления
13.03.2014, 17:52     Как нарисовать график функции?
Ответ Создать тему
Опции темы

Текущее время: 21:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru