Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2015, 14:22   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию График функции, приведение координат

Доброго времени суток.
В моём задании нужно нарисовать график функции на каком нибудь Graphics (C#).
Моя проблема состоит в следующем:
у меня есть математическая шкала (абсцисса, X), например от -10 до 10, есть ширина изображения, на котором я рисую.
Вопрос: как привести позицию на шкале к координате на изображении ?
Сначала я подумал примерно так:
width - ширина изображения
count - количество делений шкалы
position - выбранная позиция на шкале
тогда конечная точка по x = width/count*position.

В этом случае для position=-10 я получаю отрицательное число (смещение относительно позиции ординаты Y на изображении).
У меня есть позиция этой ординаты, тогда я к полученному значению прибавляю смещение.
Но в результате получается отрицательное число, а как известно - на изображении нет отрицательных координат.
Где я ошибаюсь и что мне делать/исправлять ? Помогите пожалуйста.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 30.11.2015, 16:55   #2
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Приведи пример функции.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 30.11.2015, 18:35   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от tsar_ Посмотреть сообщение
Приведи пример функции.
Сама функция не имеет значения. На входе начало и конец шкалы, позиции абсциссы и ординаты, размер изображения и количество делений шкалы.
Но если вам сильно нужно - пример функции: sin(X). Или я вас не правильно понял ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 30.11.2015, 23:30   #4
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Вроде этого?
Прога в архиве.
Изображения
Тип файла: jpg Screenshot.jpg (59.5 Кб, 54 просмотров)
Вложения
Тип файла: rar Plot.rar (475.6 Кб, 3 просмотров)
Программирую по необходимости

Последний раз редактировалось tsar_; 01.12.2015 в 13:39. Причина: Добавил котэ в архив
tsar_ вне форума Ответить с цитированием
Старый 01.12.2015, 00:47   #5
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от tsar_ Посмотреть сообщение
Вроде этого?
Прога в архиве.
Вроде как да, но мне бы глянуть на код ... Заранее благодарен.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 01.12.2015, 13:18   #6
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

С# не знаю, прогу делал на delphi.
Основной код (рисование графика) в обработчике нажатия на кнопку:
Код:
//функция для построения графика
function F(x: single):single;
begin
  Result:=sin(x);
end;

procedure TForm1.Button1Click(Sender: TObject);
const Y_SCALE = 100;     //масштаб по оси ординат
var Xmin, Xmax: single;  //min и max значение абсциссы
    X,Y: single;         //текущие абсцисса и ордината
    PX,PY: integer;      //координаты текущего пикселя холста
begin
  //Оставляем только котэ
  PaintBox1.Repaint;

  //задаем min и max значение абсциссы
  Xmin:=SpinEdit1.Value;
  Xmax:=SpinEdit2.Value;

  //вычисляем текущую абсциссу и ординату
  X:=Xmin;
  Y:=Y_SCALE*F(X);

  //по горизонтали начинаем с нуля
  PX:=0;
  //вычисляем количество пикселей холста по вертикали
  PY:=trunc((PaintBox1.height div 2) - Y);

  //перемещаемся в начальную точку
  PaintBox1.Canvas.MoveTo(PX,PY);
  PaintBox1.Canvas.Pen.Width:=3;

  //перебираем пиксели холста по горизонтали
  for PX:=0 to PaintBox1.Width do
    begin
    //вычисляем текущую абсциссу и ординату
    X:=Xmin+PX*(Xmax-Xmin)/PaintBox1.Width;
    Y:=Y_SCALE*F(X);

    //вычисляем количество пикселей холста по вертикали
    PY:=trunc((PaintBox1.height div 2) - Y);

    //рисуем отрезок
    PaintBox1.Canvas.LineTo(PX,PY);
    end;
end;
Красным выделил выражение для подгонки математической шкалы к ширине холста.
По ординате ограничился заданием масштаба (константа Y_SCALE = 100), т.к. sin(x) не может быть больше единицы.
Если надо весь проект, пиши.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 01.12.2015, 15:02   #7
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

tsar_, спасибо, по абсциссе всё заработало правильно. По ординате проблема осталась ... Вы показали мне пример со статическим масштабом, а у меня масштаб изменяется (шкала Y тоже имеет определённый пользователем диапазон). И вот я не могу рассчитать координату по Y.
Как рассчитывать масштаб ? Попытался так же, как и масштаб по X - но не почему то результат всегда вне пределов высоты изображения ...
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 01.12.2015 в 15:05.
OmegaBerkut вне форума Ответить с цитированием
Старый 01.12.2015, 15:35   #8
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Можно вот так подкрутить
Код:
procedure TForm1.Button1Click(Sender: TObject);
var Xmin, Xmax: single;  //min и max значение абсциссы
    Ymin, Ymax: single;  //min и max значение ординаты
    X,Y: single;         //текущие абсцисса и ордината
    PX,PY: integer;      //координаты текущего пикселя холста
begin
  //Оставляем только котэ
  PaintBox1.Repaint;

  //задаем min и max значение абсциссы
  Xmin:=SpinEdit1.Value;
  Xmax:=SpinEdit2.Value;

  //задаем min и max значение ординаты
  Ymin:=SpinEdit3.Value;
  Ymax:=SpinEdit4.Value;

  //вычисляем текущую абсциссу и ординату
  X:=Xmin;
  Y:=F(X);

  //по горизонтали начинаем с нуля
  PX:=0;
  //вычисляем количество пикселей холста по вертикали
  PY:=PaintBox1.Height-trunc((Y-Ymin)/(Ymax-Ymin)*PaintBox1.Height);

  //перемещаемся в начальную точку
  PaintBox1.Canvas.MoveTo(PX,PY);
  //толщина линии пусть будет 3px
  PaintBox1.Canvas.Pen.Width:=3;

  //перебираем пиксели холста по горизонтали
  for PX:=0 to PaintBox1.Width do
    begin
    //вычисляем текущую абсциссу и ординату
    X:=Xmin+PX*(Xmax-Xmin)/PaintBox1.Width;
    Y:=F(X);

    //вычисляем количество пикселей холста по вертикали
    PY:=PaintBox1.Height-trunc((Y-Ymin)/(Ymax-Ymin)*PaintBox1.Height);

    //рисуем отрезок
    PaintBox1.Canvas.LineTo(PX,PY);
    end;
end;
Изображения
Тип файла: jpg Plot.jpg (63.1 Кб, 39 просмотров)
Вложения
Тип файла: rar Plot.rar (474.9 Кб, 7 просмотров)
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 01.12.2015, 16:30   #9
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

tsar_, премного благодарен за помощь !!
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 02.12.2015, 03:51   #10
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Как в этом методе отрисовки графика избавиться от соединяющихся разрывов графиков функций ? Например, tg(x), у которого на графике наблюдаются разрывы с периодом в PI ...
Собственно, на следующем изображении отображён правильный график функции tg(x)


На моём же изображении разрывы соединяются.
Как от этого избавиться ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Затабулировать функцию. график указанной функции и график касательной к ней в точке с абсциссой AntonKalinin01 Помощь студентам 0 26.05.2013 07:18
[delphi] График в полярной системе координат и построение зависимости!!! vika18 Помощь студентам 0 09.04.2013 21:01
[delphi] График в полярной системе координат vika18 Помощь студентам 0 09.04.2013 17:11
Построить график функции F(x) на заданном интервале с заданным шагом и вывести значения х и функции F(x) в таблицу в графическом р Proskurina Паскаль, Turbo Pascal, PascalABC.NET 8 12.11.2012 21:57
В графическом режиме нарисова оси координат и график функции polina222 Помощь студентам 1 13.01.2012 20:26