Фрилансер
3418 / 2815 / 3000
Регистрация: 08.02.2012
Сообщений: 8,561
Записей в блоге: 1
1

Неправильное масштабирование графика по оси Y

15.10.2012, 14:31. Показов 1356. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure Grafik;
    function F(x:real):real;
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function TForm1.F(x: real): real;
begin
    f:=cos(x);
end;
 
procedure TForm1.FormPaint(Sender: TObject);
Begin
    Grafik;
end;
 
procedure TForm1.Grafik;
Const a=-10;b=10;dx=0.01;
Var h,w,i,t1:integer;
    x,y,mh,mw,y1,y2,t:real;
begin
    w:=Form1.ClientWidth div 2-5; //середина по оси X
    h:=Form1.ClientHeight div 2-5; //середина по оси Y
    Form1.Canvas.MoveTo(w,5); //начальная точка оси Y
    Form1.Canvas.LineTo(w,h*2-3); //ось Y
    Form1.Canvas.MoveTo(5,h); //начальная точка оси X
    Form1.Canvas.LineTo(w*2-5,h); //ось X
    Form1.Canvas.TextOut(w+14,1,'Y'); //Вывод "Y"
    Form1.Canvas.TextOut(w*2-10,h-20,'X'); //Вывод "X"
    Form1.Canvas.TextOut(w-8,h+3,'0'); //Точка 0
    x:=a; //начальное значение x
    y1:=f(x);y2:=f(x); //делаем max и min первые значения фукнции
    While x<=b do //пока не дошли до верхней границы x
    Begin
      t:=f(x); //вычисляем значение функции в точке x
      if t>y1 then y1:=t; //если значение в данной точке больше max делаем это значение max
      if t<y2 then y2:=t; //если значение в данной точке меньше min делаем это значение min
      x:=x+dx; //увеличиваем x на шаг
    End;
    mw:=(w*2-10)/abs(b-a); //маштаб по x
    mh:=(h*2-10)/abs(y1-y2); //маштаб по y
    i:=round(y2);
    While i<=round(y1) do   // засечки оси y с полож-ми знач-ми
    Begin
      if i<>0 then Form1.Canvas.TextOut(w+3,h-round(i*mh)-7,IntToStr(i));
      Form1.Canvas.MoveTo(w-5,h-round(i*mh));
      Form1.Canvas.LineTo(w+2,h-round(i*mh));
      inc(i,1);
    End;
    i:=a;
    While i<abs(a+b) div 2 do   // засечки оси x с отр-ми знач-ми
    Begin
      Form1.Canvas.TextOut(w+round(i*mw),h+3,IntToStr(i));
      Form1.Canvas.TextOut(w+round(i*mw)+5,h-8,'|');
      inc(i);
    End;
    i:=1;
    While i<=b do // засечки оси x с полож-ми знач-ми
    Begin
      Form1.Canvas.TextOut(w+round(i*mw)-10,h+3,IntToStr(i));
      Form1.Canvas.TextOut(w+round(i*mw)-7,h-8,'|');
      inc(i);
    End;
    x:=a; //начальное значение x
    While x<=b do //построение графика
    Begin
      y:=f(x); //вычисляем значение функции в точке x
      Form1.Canvas.Pixels[w+round(x*mw),h-round(y*mh)]:=clGreen; //прорисовываем точку [x,y]
      x:=x+dx; //увеличиваем x1 на шаг
    End;
end;
 
procedure TForm1.FormResize(Sender: TObject);
begin
    Form1.Canvas.Rectangle(0,0,Form1.ClientWidth,Form1.ClientHeight);
    Grafik;
end;
 
end.
Вот написал программу построения графика но почему то масштабирование по Y не правильное какое то...Если sin или cos график строить то всё норм а вот если график например x^2 то уже не правильно масштабирует вернее обрезает часть верхнюю
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2012, 14:31
Ответы с готовыми решениями:

Масштабирование графика по оси Y
Привет всем. У меня есть график, нарисованный в Canvas, на ImageView с постоянной переменной X и...

Неправильное масштабирование приложения?
Блокирую развертывание формы (параметр maximizeBox=false) Как видно из изображения, панель...

Масштабирование оси в Windows Forms Charting
Может кто сталкивался. Имеем чарт с забинденнымы данными: var results = (from r in...

Неправильное построение графика
Здравствуйте, пишу программу и для обработки данных необходимо построить график, для этого я...

3
Фрилансер
3418 / 2815 / 3000
Регистрация: 08.02.2012
Сообщений: 8,561
Записей в блоге: 1
16.10.2012, 19:59  [ТС] 2
помогите реализовать правильное маштабирование графика :-)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32627 / 21094 / 8139
Регистрация: 22.10.2011
Сообщений: 36,356
Записей в блоге: 8
16.10.2012, 21:58 3
Что не так? Нормально всё отображается. Или ты хочешь, чтобы программа автоматически отслеживала отсутствие точек в III и IV четвертях и сдвигала ось OX в низ формы?
0
Фрилансер
3418 / 2815 / 3000
Регистрация: 08.02.2012
Сообщений: 8,561
Записей в блоге: 1
16.10.2012, 22:13  [ТС] 4
Цитата Сообщение от UI Посмотреть сообщение
Что не так? Нормально всё отображается. Или ты хочешь, чтобы программа автоматически отслеживала отсутствие точек в III и IV четвертях и сдвигала ось OX в низ формы?
Хм странно...я когда меняю функцию на x^2 у мя маштабируется по y на половину это можно видеть из засечек по y...а на счет отсутствия точек представляю как сделать если преподаватель попросит сделаю :-)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2012, 22:13
Помогаю со студенческими работами здесь

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

Масштабирование графика
Здравствуйте! Помогите пожайлуста закончить задачу. Мне надо постоить график функции...

Масштабирование графика
Доброго времени суток! Подскажите, как можно сделать так, чтобы график правильно отображался в...

Масштабирование графика
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Масштабирование графика функции
Здравствуйте. Написал программу, строящую один из трех графиков функции в зависимости от выбора...

Графика в picturebox. Масштабирование
Понимаю что наверно боян, но толком ничего не нашел. Имеется 3 параметра и picturebox...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru