Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Графики в турбо С или С++ 3.1 (http://forum.oszone.net/showthread.php?t=51589)

Ruffo 12-07-2005 01:50 340281

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

Savant 12-07-2005 10:28 340338

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

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

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

Ruffo 12-07-2005 13:27 340405

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

Savant 12-07-2005 14:06 340415

Вложений: 1
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)

Turman 21-07-2005 03:51 342569

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

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

Savant 21-07-2005 11:03 342624

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

Turman 21-07-2005 14:19 342676

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

Savant 21-07-2005 14:29 342680

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

penykov 20-08-2005 00:47 349394

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

Savant 20-08-2005 21:46 349537

penykov
Цитата:

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

penykov 23-08-2005 20:55 350178

При построении графика, когда берётся каждое k-е значении функции можно запросто пропустить короткие всплески этой функции. Интересует быстрый алгоритм "правильного" рисования.
В моём случае функции нет, а есть оцифрованный сигнал, нужно его корректно отобразить (а по сути промасштабировать по x).
Решение:
Предположим, что размер данных (сигнала) M, ширина экрана K (для простоты K<M). Максимальное значение амплитуды пусть будет равно высоте экрана.
Сигнал условно разбивается на N частей, N=M/K.
Теперь на каждом из N участков ищется максимум и минимум сигнала. строится отрезок с координатами (x,min;x,max).
Недостатком метода является то, что если на соседних участках минимум одного участка больше максимума другого и наоборот, то график получается непрерывным. Приходится после каждого участка проверять это условие и корректировать max или min.

Какие ещё есть методы?


Время: 16:36.

Время: 16:36.
© OSzone.net 2001-