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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Memcpy, buffer overflow. Может ли возникнуть ошибка в функции memcpy http://www.cyberforum.ru/cpp-beginners/thread1117493.html
Бывает ли на практике такое, что код #define size 1000; // some value int x, y; /* ... */ memcpy(y, x, (size + 1) * sizeof(int)); y = 0;вызовет ошибку в функции memcpy?
C++ Наследование Всем привет. Может кто нибудь подсказать с чего начать при создании класса для работы с файлами на подобии ostream( а точнее как правильно реализовать методы open, close,seek,read,write) и возможно ли унаследовать их от самого класса ostream? http://www.cyberforum.ru/cpp-beginners/thread1117492.html
Программа для расчета математического примера C++
Помогите пожалуйста с кодом программы,заранее спасибо.Пример 10
Класс рациональных дробей C++
Разработать класс рациональных дробей. Предусмотреть в нём все методы, которые необходимы, чтобы новый тип данных мог быть использован наравне с системными типами: арифметические операции, операции сравнения, преобразования тип. Программа выглядит вот-так: #include <iostream> #include <conio.h> #define show(x) #x << " = " << x << " " #define test(x) if(x) cout << #x << endl // Âû÷èñëåíèå...
C++ Вывести на консоль те строки, длина которых меньше (больше) средней, а также длину. http://www.cyberforum.ru/cpp-beginners/thread1117486.html
Вывести на консоль те строки, длина которых меньше (больше) средней, а также длину. Собственно вот проблема..Мне помогали писать данную программу но она что-то все равно не работает. Она просто тупо зависает. Может кто помочь объяснить что в ней не так? Мб я просто неправильно заполняю строки? #include <stdio.h> #include <conio.h> #include <string.h> #include <iostream> using namespace...
C++ Работа с координатами векторов Привет, ребята. Вновь пришёл к Вам с вопросами. Поставили задачу написать проект калькулятора, который будет выполнять операции с координатами векторов. На вход поступает 2 вектора, координаты каждого из которых x,y,z соответственно. Задача такая - как оформить координаты, чтобы было удобно работать с ними? //Пробовал делать x1,y1,z1,x2,y2,z2 переменными делать, но это быдло-код какой-то... подробнее

Показать сообщение отдельно
dogg12
 Аватар для dogg12
57 / 23 / 5
Регистрация: 21.02.2011
Сообщений: 503
13.03.2014, 10:39     Как нарисовать график функции?
Позволю себе немного копи-паста)

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, то онкологические заболевания абсолютно точно будут побеждены.
 
Текущее время: 15:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru