Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
jolene
0 / 0 / 1
Регистрация: 31.03.2012
Сообщений: 9
1

Построение графика функции на Канве

17.05.2012, 21:05. Просмотров 1124. Ответов 1
Метки нет (Все метки)

Доброго времени суток. Пытаюсь построить график на Канве, да как-то не выходит. Судя по всему, какая-то ошибка в 38 строке, там считается значение функции и заодно она масштабируется. В данном случае выдаёт ошибку: "Invalid floating point operation" Если в этой же строке переменной f присвоить значение, например, функции синуса: f:=msh*sin(x/msh), то график строится (вроде даже правильно), а если аргументом будет, например, корень (f:=msh*sin(sqrt(x/msh))) - выдаёт описанную выше ошибку. Подскажите, пожалуйста, как правильно сделать.
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
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Math;
type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormPaint(Sender: TObject);
var
  x, y, a, b : Extended;
  h, w, xmax, ymax, msh : integer;
 
  function  xscr(xc : integer) : integer;
    begin
      xscr:= xc+w div 2
    end;
 
  function  yscr(yc : integer) : integer;
    begin
      yscr:=h div 2-yc
    end;
 
  function   f(x : Extended) : Extended;
    begin
      f:=msh*((1/4)*((((x/msh)+1)*sinh(sqrt(x/msh))/sqrt(x/msh))-(cosh(sqrt(x/msh)))));
    end;
 
  begin
    h:=form1.ClientHeight;
    w:=form1.ClientWidth;
    xmax:=w div 2 - 20;
    ymax:=h div 2 - 20;
    a:=-10;
    b:=4;
    msh:=20;
    with   form1.Canvas   do
      begin
        Brush.Color := clRed;
        FillRect(Rect(0, 0, ClipRect.Right, ClipRect.Bottom));
        moveto(xscr(-xmax),yscr(0));
        lineto(xscr(xmax),yscr(0));
        moveto(xscr(0),yscr(-ymax));
        lineto(xscr(0),yscr(ymax));
        textout(xscr(xmax)+10,yscr(0),'x');
        textout(xscr(0),yscr(ymax)-20,'y');
        x:=a*msh;
        y:=f(x);
        moveto(xscr(round(x)),yscr(round(y)));
        pen.Color:=clAqua;
        pen.Width:=2;
        repeat
          x:=x+0.1;
          lineto(xscr(round(x)),yscr(round(f(x))))
        until   x>=b*msh;
    end;
  end;
 
end.
Добавлено через 24 минуты
Так-то, вообще, он строит на промежутке >0.
Видимо корень из отрицательного значения не извлекает. Вроде. Что делать с этим всё равно не знаю... Аргумент не очень, но: матлаб же как-то строит. =)

Добавлено через 20 минут
Хотя, матлаб выдаёт на отрицательной части области определения действительные значения...
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2012, 21:05
Ответы с готовыми решениями:

Построение графика в Delphi на канве
Помогите построить график одномерных массивов на канве. Нужно на одном графике построить массивС и...

Построение графика функции с использованием подпрограммы-функции
Помогите с задачей: требуется написать программу для построения графика функции, где начальные...

Построение графика функции
Добрый день,помогите пожалуйста Нужно написать программу, которая предлагает пользователю...

Построение графика функции
Вывести график функции. Для построения графика используется вся доступная область формы, причем...

Построение графика функции
Доброго времени суток! Помогите, пожалуйста, построить график в координатной сетке. var x0,...

1
Kardynal
5 / 5 / 3
Регистрация: 14.05.2012
Сообщений: 26
17.05.2012, 22:08 2
Matlab и Delphi по разному вычисляют квадратный корень. Делфи использует функцию FSQRT математического сопроцессора, которая при отрицательном аргументе выдаёт ошибку. А Матлаб использует свою реализацию алгоритма с применением комплексных чисел для отрицательного аргумента, имхо.
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2012, 22:08

Построение графика функции
Доброго времени суток! Построить график функции (y=2*sin(x/3)) при помощи графических примитивов в...

Построение графика функции
Здравствуйте, товарищи. Изобретаю тут программу, но получается какая-то дичь в итоге. Сведущие...

Построение графика функции
Помогите, пожалуйста. Где ошибка в коде? Реализовать построение с помощью примитивов по заданному...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.