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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2010, 11:50   #1
Jigarkhwar
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 15
По умолчанию Проблема с графиком

Код:
// Функция, график которой надо построить
Function f(x:real):real;
begin
f:=power(-1,x-1)*power(x,-x);

end;

// строит график функции
procedure GrOfFunc;
var
l,b:integer; // левый нижний угол области вывода графика
w,h:integer; // ширина и высота области вывода графика

nfx1,nfx2:real; // границы изменения аргумента функции
nfy1,nfy2:real; // границы изменения значения функции
nfx:real; // аргумент функции
nfy:real; // значение функции в точке x
nfdx:real; // приращение аргумента
nfmx,nfmy:real; // масштаб по осям X и Y
nfx0,nfy0:integer; // точка - начало координат


begin

with Form2.Image1 do
begin
// область вывода графика

l:=10; // X - координата левого верхнего угла
b:=Height-20; // Y - координата левого верхнего угла
h:=Height-40; // высота
w:=Width-40; // ширина

nfx1:=1; // нижняя граница диапазона аргумента
nfx2:=5; // верхняя граница диапазона аргумента
nfdx:=1; // шаг аргумента

// найдем максимальное и минимальное значения
// функции на отрезке [x1,x2]
nfy1:=f(nfx1); // минимум 
nfy2:=f(nfx1); // максимум
nfx:=nfx1;
repeat
nfy := f(nfx);
if nfy < nfy1 then nfy1:=nfy;
if nfy > nfy2 then nfy2:=nfy;
nfx:=nfx+nfdx;
until (nfx>=nfx2);

// вычислим масштаб
nfmy:=h/abs(nfy2-nfy1); // масштаб по оси Y
nfmx:=w/abs(nfx2-nfx1); // масштаб по оси X

// оси
nfx0:=l;
nfy0:=b-Abs(Round(nfy1*nfmy));

with Form2.Image1.Canvas do
begin
// оси
MoveTo(l,b);LineTo(l,b-h);
MoveTo(nfx0,nfy0);LineTo(nfx0+w,nfy0);
TextOut(l+5,b-h,FloatToStrF(nfy2,ffGeneral,6,3));
TextOut(l+5,b,FloatToStrF(nfy1,ffGeneral,6,3));
// построение графика
nfx:=nfx1;
repeat
nfy:=f(nfx);
Pixels[nfx0+Round(nfx*nfmx),nfy0-Round(nfy*nfmy)]:=clRed;
nfx:=nfx+nfdx;
until (nfx>=nfx2);
end;
end;
проблема заключается здесь
Код:
nfx1:=1; // нижняя граница диапазона аргумента
nfx2:=5; // верхняя граница диапазона аргумента
nfdx:=1; // шаг аргумента
Если так, то всё работает, если в функцию входят целые числа, но этого недостаточно, на канве будут просто отдельные пиксели. Как только изменить допустим шаг на
Код:
nfdx:=0,001; // шаг аргумента
, то в функцию войдёт значение вещественное и получается так, что в степени дробь.Дробь в степени - это корень и, соответственно, извлекается корень из отрицательного числа. Как менять? что править? переходить к комплексным числам - то как ?
Знак (минус на плюс и наоборот) меняется каждый раз, может можно сначала посчитать значение а потом определить знак ?

Последний раз редактировалось Jigarkhwar; 07.12.2010 в 11:58.
Jigarkhwar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с графиком функции Elu Microsoft Office Excel 5 15.11.2010 19:26
Проблема с графиком в Delphi. JDD Помощь студентам 4 05.05.2010 16:23
Проблема с графиком функции zeppelin58 Общие вопросы C/C++ 1 15.12.2008 14:16
проблема с графиком Алёнка2 Помощь студентам 3 25.05.2008 09:44