Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Графики в турбо С или С++ 3.1

Ответить
Настройки темы
Графики в турбо С или С++ 3.1
Ruffo


Сообщения: n/a

Профиль | Цитировать


У кого есть исходники прог для рисования графиков любых функций. Выложите пожалуйста

Отправлено: 01:50, 12-07-2005

 

Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Ruffo
Ну у меня допустим есть.
Но давайте сначала разберемся, что у Вас конкретно не получается. Задача-то элементарно проста. Прямо по шагам:

1. Инициализация графического режима.
2. Вычисление констант для преобразования относительных значений x, y (в функции) в абсолютные x, y (на экране).
3. Отображение координатной сетки и различных дополнительных элементов (засечек, подписей, ...).
4. Построение графика путем вычисления для каждого x ? [min_x; max_x] своего y по заданной функции с учетом некоторого шага step (задающего в итоге точность построения графика). Полученные относительные значения преобразуются в абсолютные и результат выводится на экран в виде линии или точки (смотря какой график нужен).
5. Ожидание действий пользователя и закрытие графического режима.

Если же Вам программирование совсем не нужно ине интересно, то добро пожаловать к Гуглю. Там уже есть готовые решения, как платные, так и бесплатные.

Отправлено: 10:28, 12-07-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

Ruffo


Сообщения: n/a

Профиль | Цитировать


1. и 5. получается все остальное нет
Новый препод дал задание на практику (ни лекций ничего не проводил) и уматал в отпуск ...
Мне необходим хотябы образец построения какой нибудь функции (т.к. мне задана конкретная функция) может разобрав пример смогу нарисовать свою функцию ... буду очень благодарен если кто нибудь запостит или отправит на мыло в@профиле.оно

Последний раз редактировалось Savant, 14-07-2005 в 09:13.


Отправлено: 13:27, 12-07-2005 | #3


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: zip TEST.zip
(1017 байт, 39 просмотров)

Ruffo
Так как задана кокретная функция, то задача еще больше упрощается: не надо писать парсер для произвольной функции, которую пользователь вводит уже во время работы программы.

Рассмотрим шаг №2:
у меня он реализовался в таком виде
Код: Выделить весь код
#define MIN_COORD_X -8 // минимальный Х, для которого строится график
#define MAX_COORD_X 8 // максимальный
 
#define MIN_X -10 // минимальный Х, для которого строится координатная сетка
#define MAX_X 10 // ...(тут все по аналогии)...
#define MIN_Y -40 // .......
#define MAX_Y 15 // ........
 
#define STEP .01 // тот самый шаг (можно назвать и как приращение аргумента)
 
void main(void)
{
  // инициализация граф. режима
  ........
 
  // вычисление констант для преобразования относительных значений в абсолютные
  int rel_x =  getmaxx() / (MAX_X - MIN_X + 2);
  int add_x = (getmaxx() / (MAX_X - MIN_X)) * MAX_X;
  int rel_y = -getmaxy() / (MAX_Y - MIN_Y + 2);
  int add_y = (getmaxy() / (MAX_Y - MIN_Y)) * MAX_Y;
Формулы вопросов, надеюсь, не вызывают.
Таким образом вычисляется месторасположение точки (x;y) на экране - это будет пиксель с координатами (x*rel_x+add_x; y*rel_y+add_y). rel_x и rel_y задают масштаб преобразования из единиц в пиксели (вообще их надо было бы делать типа double, но обычно такой точности и не требуется).

Теперь переходим к шагу 3:
Код: Выделить весь код
  if (MAX_Y * MIN_Y < 0)
  {
	moveto(0, add_y);
	linerel(getmaxx(), 0);
  }
 
  if (MAX_X * MIN_X < 0)
  {
	moveto(add_x, 0);
	linerel(0, getmaxy());
  }
Строим координатные оси, проверяя по ходу, видны ли они на экране (в этом случае не строим). Как видно, все тоже просто: смещаемся в крайнюю точку оси и проводим прямую линию до противоположного края экрана.

Шаг 4: собственно постройка графика
Код: Выделить весь код
  double i = MIN_COORD_X;
  moveto(MIN_COORD_X * rel_x + add_x, f(i) * rel_y + add_y);
 
  for (i += STEP; i <= MAX_COORD_X; i += STEP)
  {
	lineto(i * rel_x + add_x, f(i) * rel_y + add_y);
  }
Здесь f() - функция, возвращающая значение заданной функции (тавтология млин ) при некотором аргументе. Я использовал такую :
Код: Выделить весь код
double f(double x)
{
  return (x*x-5.0*x*cos(x)-6.0);
}
Первым действием мы смещаемся (moveto()) на первую точку графика функции и далее в цикле просто проводим линию из старой точки в новую. При рассчетах используются вычисленные ранее константы rel_x, add_x и т.п.

Надеюсь, хоть что-то объяснил. Здесь представлен только скелет программы. Все необходимые навороты добавить труда не составит. Внизу он же прикреплен, только уже в более-менее рабочем состоянии (с наворотами) и без комментариев.

Единственное, чего тут потенциально не хватает - это обработчика исключительных ситуаций (при вычислении значения функции)...

Текст программы исправлен (14.07.2005)

Последний раз редактировалось Savant, 14-07-2005 в 08:58.


Отправлено: 14:06, 12-07-2005 | #4


Аватара для Turman

Старожил


Сообщения: 205
Благодарности: 8

Профиль | Отправить PM | Цитировать


а у меня вопрос наоборот связан с инициализацией графического режима- как это делается?

и еще принципиальный вопрос-как это связано с библиотекой MFC?
это еще один способ работы с графикой или есть важные отличия инициализации от работы с классами Cview.
я только начинаю изучать графические возможности с++ поэтому пока с этими классами не работал.

Отправлено: 03:51, 21-07-2005 | #5


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Turman
Цитата:
у меня вопрос наоборот связан с инициализацией графического режима- как это делается?
RTFM?!
Код: Выделить весь код
// Графический драйвер
int graph_driver = DETECT; // автоопределение
// Графический режим
int graph_mode = DETECT;
 
void main(void)
{
  // Инициализация графического режима
  initgraph(&graph_driver, &graph_mode, "");
  int errorcode = graphresult();
 
  // Обработка ошибок
  if (errorcode != grOk)
  {
	printf("Graphics error: %s\n", grapherrormsg(errorcode));
	printf("Press any key to exit");
	getch();
	return;
  }
 
  // работа с графикой
  .....
 
  // Закрытие графического режима
  closegraph();
Цитата:
и еще принципиальный вопрос-как это связано с библиотекой MFC?
Никак. Потому что:
1. Работаем под realmode ДОС'ом
2. TC и TC++ - продукты Borland'a

Отправлено: 11:03, 21-07-2005 | #6


Аватара для Turman

Старожил


Сообщения: 205
Благодарности: 8

Профиль | Отправить PM | Цитировать


ага понятно.
а на visual c++ это пройдет?

Отправлено: 14:19, 21-07-2005 | #7


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Что "это" ?!
ОС win32 (или у Вас vc++ под ДОС?) и так вроде бы работает в графическом режиме. И имеет собственные наборы средств для "рисования" - библиотеки gdi, opengl, directx.

Отправлено: 14:29, 21-07-2005 | #8


Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


А не хотите обсудить построение графика с поиском экстремумов функции? Или с этим не сюда?

Отправлено: 00:47, 20-08-2005 | #9


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


penykov
Цитата:
А не хотите обсудить построение графика с поиском экстремумов функции?
Ok, начнём с простого: какие проблемы ?

Отправлено: 21:46, 20-08-2005 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Графики в турбо С или С++ 3.1

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Опера Турбо не хочет работать Telnor Хочу все знать 22 19-03-2012 11:10
архивирование графики WChek Программное обеспечение Windows 10 23-06-2006 12:32
созданные при помощи турбо поскаля Rognarog Программирование и базы данных 3 23-06-2006 10:58
графики dzekka Хочу все знать 4 03-10-2003 14:40
Как мне запустить notepad в Турбо Си++ Beaver Программирование и базы данных 1 26-11-2002 16:50




 
Переход