Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 4
1

Неправильное вычисление масштабного коэффициента при построении графика

24.04.2016, 18:59. Показов 2073. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В большинстве примеров построения графиков масштабный коэффициент вычисляют по формуле ky=height/abs(y_max-y_min). Что эта формула не подходит для случаев когда y_min и y_max не симметричны относительно оси абсцисс можно убедиться на примере.
w = 400, h = 640
a = - 5, b = 5
f(x) = x + 2
X0 = 200, Y0 = 320
y_min = -3, y_max = 7
kx = 400/(5 + 5) = 40
ky = 640/(3 + 7) = 64
Формулы для экранных координат:
X = X0 + x·kx
Y = Y0 + y·ky
Получаем:
X_min = 200 + 40·(-5) = 0
X_max = 200 + 40·5 = 400

Y_min = 320 - 64·(-3) = 512
Y_max = 320 - 64·7 = -128
Очевидно, что последние значения неправильны. Если вычислить ky «по бумажке», Y_min = 440
Y_max = 40,
то имеем ky = 400/10 = 40
Тогда и график строится правильно.
Пример неправильного и правильного (зелёный) графиков.
Но вот вопрос: как узнать правильный коэффициент???
Миниатюры
Неправильное вычисление масштабного коэффициента при построении графика   Неправильное вычисление масштабного коэффициента при построении графика  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2016, 18:59
Ответы с готовыми решениями:

Ошибка при построении графика
Народ подскажите ,пожалуйста,почему выскакивает ошибка(( Invalid Floating Operation Заранее...

Ошибка при построении графика функции
График функции е в степени х в паскале, выбивает вот такую вот ошибку, помогите пожалуйста

Основы графического программирования и выбор масштабного коэффициента
Пожалуйста, помогите найти информацию по теме. Особенно интересует понятие масштабного...

Ошибка при построении графика
помогите найти ошибки, график не хочет строиться uses GraphABC; function F(a:real):real; var ...

5
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
24.04.2016, 19:38 2
Цитата Сообщение от kabinformatyky Посмотреть сообщение
как узнать правильный коэффициент???
Принять равные масштабы по Х и Y.
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
24.04.2016, 19:40 3
y_min и y_max - это не мин и макс значения функции, а мин и макс значение y, которое умещается на графике. Если берёте их несимметричными, то и оси координат будут не X0 = 200, Y0 = 320, а другие - по пропорции
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{ymin}{ymin+ymax}=\frac{Y0}{640}
1
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 4
24.04.2016, 21:04  [ТС] 4
Согласен с приведённой формулой, но смещение оси абсцисс ситуацию не спасает. Если пропорции неправильные, то при рисовании, например окружности, заданной в параметрической форме получается окружность только с центром (0, 0). А если сдвинута вверх или вниз, то эллипс.

Добавлено через 2 минуты
Цитата Сообщение от Puporev Посмотреть сообщение
Принять равные масштабы по Х и Y.
Равные масштабы не всегда получаются. Например, f(x) = 1/x
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
24.04.2016, 21:19 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Смотрите. Вот я рисовал кому-то два графика со смещённым центром.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
{программа построения дух графиков на одной оси координат}
program P;
 
uses
  Graph,
  WinCRT;
 
  function f1(X: real): real;
  begin
    f1 := 16 * sqr(X);
  end;
 
  function f2(X: real): real;
  begin
    f2 := 1 / 7 * sqr(X);
  end;
 
var
  GraphDevice, GraphMode: integer;
  ScreenXstart, ScreenXfinish, ScreenYstart, ScreenYfinish: integer;
  ScaleX, ScaleY: real;
  Xstart, Xfinish, Ystart, Yfinish: real;
  X, Y, dX: real;
  Xscreen, Yscreen: integer;
  IsNextVisiblePixel: boolean;
begin
  {параметры графиков}
  Xstart  := -0.05;
  Xfinish := 0.05;
  Ystart  := 0.0;
  Yfinish := 0.0010;
  {инициализация графики}
  GraphDevice := Detect;
  GraphMode := Detect;
  InitGraph(GraphDevice, GraphMode, '');
  if GraphResult <> grOk then
  begin
    writeln('Error');
    Exit;
  end;
  {от края экрана отступим по 10% экрана}
  ScreenXstart := GetMaxX div 10;
  ScreenXfinish := GetMaxX - ScreenXstart;
  ScreenYstart := GetMaxY div 10;
  ScreenYfinish := GetMaxY - ScreenYstart;
  {расчёт масштабных коэффициентов}
  ScaleX := (ScreenXfinish - ScreenXstart) / (Xfinish - Xstart);
  ScaleY := (ScreenYfinish - ScreenYstart) / (Yfinish - Ystart);
  {построение осей координат}
  SetColor(7);
  MoveTo(ScreenXstart, ScreenYstart);
  LineTo(ScreenXstart, ScreenYfinish);
  LineTo(ScreenXfinish, ScreenYfinish);
  LineTo(ScreenXfinish, ScreenYstart);
  LineTo(ScreenXstart, ScreenYstart);
 
  MoveTo((ScreenXfinish + ScreenXstart) div 2, ScreenYstart);
  LineTo((ScreenXfinish + ScreenXstart) div 2, ScreenYfinish);
  {построение 1-го графика}
  SetColor(5);
  IsNextVisiblePixel := False;
  X  := Xstart;
  dX := (Xfinish - Xstart) / 1000;
  while X <= Xfinish do
  begin
    Y := f1(X);
    Xscreen := round((X - Xstart) * ScaleX) + ScreenXstart;
    Yscreen := -round((Y - Ystart) * ScaleY) + ScreenYfinish;
    if (Xscreen >= ScreenXstart) and (Xscreen <= ScreenXfinish) and
      (Yscreen > ScreenYstart) and (Yscreen < ScreenYfinish) then
    begin
      if IsNextVisiblePixel then
        LineTo(Xscreen, Yscreen)
      else
        MoveTo(Xscreen, Yscreen);
      IsNextVisiblePixel := True;
    end
    else
      IsNextVisiblePixel := False;
    X := X + dX;
  end;
  {построение 2-го графика}
  SetColor(4);
  IsNextVisiblePixel := False;
  X  := Xstart;
  dX := (Xfinish - Xstart) / 1000;
  while X <= Xfinish do
  begin
    Y := f2(X);
    Xscreen := round((X - Xstart) * ScaleX) + ScreenXstart;
    Yscreen := -round((Y - Ystart) * ScaleY) + ScreenYfinish;
    if (Xscreen >= ScreenXstart) and (Xscreen <= ScreenXfinish) and
      (Yscreen > ScreenYstart) and (Yscreen < ScreenYfinish) then
    begin
      if IsNextVisiblePixel then
        LineTo(Xscreen, Yscreen)
      else
        MoveTo(Xscreen, Yscreen);
      IsNextVisiblePixel := True;
    end
    else
      IsNextVisiblePixel := False;
    X := X + dX;
  end;
  ReadKey;
end.
Видно, что я применял другие формулы
Pascal
66
67
68
    Y := f1(X);
    Xscreen := round((X - Xstart) * ScaleX) + ScreenXstart;
    Yscreen := -round((Y - Ystart) * ScaleY) + ScreenYfinish;
Я вычитал из текущего Y значение левого нижнего угла поля графика. Моя переменная Ystart соответствует вашей y_min.
То же самое делал и с X.

Прога для FPC. Для запуска под TurboPascal замените WinCRT на CRT.
1
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 4
24.04.2016, 21:32  [ТС] 6
Спасибо. Попробую разобраться.
0
24.04.2016, 21:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2016, 21:32
Помогаю со студенческими работами здесь

Ошибка при построении графика
Не строит график. Ошибка: замените комплексные значения и значения nan на вещественные числа. Файл...

Ошибка при построении графика
Помогите пожалуйста,выдает ошибку,что значение должно быть действительным...

Ошибка при построении графика
Необходимо построить график зависимости Е(w) от длины волны. Формулу вроде написали правильно. Но...

Ошибка при построении графика.
L= Mp= V= k= M=(L.*Mp.*V.*k) figure(1) plot(V,k) L =


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru