Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.11.2012, 18:05
SHIFT999 SHIFT999 вне форума
Прохожий
 
Регистрация: 18.11.2012
Сообщения: 15
Репутация: 10
По умолчанию Плавный график в TChart

В TChart строится график по функции вида y=f(x). В цикле через скриптконтрол вычисляется у, а х - это значение цикла, то есть точки он ставит через каждую еденицу. Как сделать точки чаще, чтобы график красивее выглядел? Вот цикл:
Код:
for x:=min to max do //min и max вводит юзер
  begin
  for i:=0 to Length(formula) do
    if formula[i]='x' then
      begin
      Delete(formula,i,1);
      Insert(floattostr(x),formula,i); //заменяем неизвестную х числом
      end;
  y:=ScriptControl.Eval(formula);
  formula:=Edit1.Text;
  Form1.Chart1.SeriesList[0].AddXY(x,y,' ',col); //col - цвет, вводит юзер
  end;
Вот что выводится (синус):
12wqedwa.jpg
А вот что бы примерно хотелось (синус + косинус):
13wdfsdf.jpg

Последний раз редактировалось SHIFT999, 21.11.2012 в 18:09.
Ответить с цитированием
  #2  
Старый 21.11.2012, 18:17
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Сделать X дробным, поменять цикл for на while и увеличивать X на 0.1.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
SHIFT999 (21.11.2012)
  #3  
Старый 21.11.2012, 18:40
SHIFT999 SHIFT999 вне форума
Прохожий
 
Регистрация: 18.11.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Сделать X дробным, поменять цикл for на while и увеличивать X на 0.1.
Код:
x:=min;
while x<max do
  begin
  for i:=0 to Length(formula) do
    if formula[i]='x' then
      begin
      Delete(formula,i,1);
      Insert(floattostr(x),formula,i);
      end;
  y:=ScriptControl.Eval(formula);
  formula:=Edit1.Text;
  Form1.Chart1.SeriesList[0].AddXY(x,y,' ',col);
  x:=x+0.1;
  end;
14sdffe.jpg

Похоже, теперь он прибавляет 0.1, притом у тот же, что и на следующем целом...

Последний раз редактировалось SHIFT999, 21.11.2012 в 18:57.
Ответить с цитированием
  #4  
Старый 21.11.2012, 19:37
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от SHIFT999
Код:
x:=min;
while x<max do
  begin
  for i:=0 to Length(formula) do
    if formula[i]='x' then
      begin
      Delete(formula,i,1);
      Insert(floattostr(x),formula,i);
      end;
  y:=ScriptControl.Eval(formula);
  formula:=Edit1.Text;
  Form1.Chart1.SeriesList[0].AddXY(x,y,' ',col);
  x:=x+0.1;
  end;

Похоже, теперь он прибавляет 0.1, притом у тот же, что и на следующем целом...
У меня вот так работает:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  formula: string = 'sin(x)';
var
  SaveDecimalSeparator: Char;
  i: Integer;
  min, max, step, x, y: Extended;
  s: string;
begin
  min := 0;
  max := 10;
  step := 0.1;

  SaveDecimalSeparator := DecimalSeparator;
  try
    DecimalSeparator := '.';

    x := min;
    while x < max do
    begin
      s := formula;
      for i := Length(s) downto 1 do
      begin
        if s[i] = 'x' then
        begin
          Delete(s, i, 1);
          Insert(FloatToStr(x), s, i);
        end;
      end;

      y := ScriptControl.Eval(s);
      Chart1.SeriesList[0].AddXY(x, y, ' ', clRed);
      x := x + step;
    end;
  finally
    DecimalSeparator := SaveDecimalSeparator;
  end;
end;

Результат:
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
SHIFT999 (21.11.2012)
  #5  
Старый 21.11.2012, 21:51
SHIFT999 SHIFT999 вне форума
Прохожий
 
Регистрация: 18.11.2012
Сообщения: 15
Репутация: 10
По умолчанию

Спасибо тебе, дяденька полиционер, большое . Все работает, вот только если несколько Series сделать, то графики как-то странно рисуются (с первым всегда все в порядке), то если + к "у", то выше уезжает и шире становится, а если они еще и пересекутся, то еще хуже становится. Это в принципе TChart такой гад, или я накосячил?

dfsagfdsg.jpg dsafnjkdsfk.jpg
Ответить с цитированием
  #6  
Старый 21.11.2012, 23:07
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от SHIFT999
Это в принципе TChart такой гад, или я накосячил?
Скорее всего второе Я таких глюков не наблюдал.

Кстати в Delphi есть стандартная функция StringReplace для замены в строке вхождений одной подстроки на другую, благодаря чему код который я выше привёл можно упростить:
Заменяем это:
Код:
      s := formula;
      for i := Length(s) downto 1 do
      begin
        if s[i] = 'x' then
        begin
          Delete(s, i, 1);
          Insert(FloatToStr(x), s, i);
        end;
      end;
на единственную строку:
Код:
      s := StringReplace(formula, 'x', FloatToStr(x), [rfReplaceAll, rfIgnoreCase]);

Впрочем мне всё равно не нравится эта идея с вставками значений прямо в строку с формулой. Например таким способом не получится посчитать такое выражение: 'exp(x)'.
Ответить с цитированием
  #7  
Старый 21.11.2012, 23:20
SHIFT999 SHIFT999 вне форума
Прохожий
 
Регистрация: 18.11.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Например таким способом не получится посчитать такое выражение: 'exp(x)'.
Ага, я тоже так подумал, так что вот, вроде работает:
Код:
x := min;
    while x < max do
    begin
      s := formula;
      for i := Length(s) downto 1 do
        if s[i] = 'x' then
        begin
          if s[i+1] = 'p' then
            break;
          Delete(s,i,1);
          Insert(floattostr(x),s,i);
        end;
        y := ScriptControl.Eval(s);
        Form1.Chart1.SeriesList[count].AddXY(x,y,' ',col);
        x := x + step;
    end;
Ответить с цитированием
  #8  
Старый 21.11.2012, 23:26
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от SHIFT999
Ага, я тоже так подумал, так что вот, вроде работает:
Код:
x := min;
    while x < max do
    begin
      s := formula;
      for i := Length(s) downto 1 do
        if s[i] = 'x' then
        begin
          if s[i+1] = 'p' then
            break;
Только наверное не "break", а "continue", иначе такая формула не посчитается: 'x + exp(x)'
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter