|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Плавный график в 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
|
||||
|
||||
Сделать X дробным, поменять цикл for на while и увеличивать X на 0.1.
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
SHIFT999 (21.11.2012)
|
#3
|
|||
|
|||
Цитата:
Код:
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, притом у тот же, что и на следующем целом... Последний раз редактировалось SHIFT999, 21.11.2012 в 18:57. |
#4
|
||||
|
||||
Цитата:
Код:
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
|
|||
|
|||
Спасибо тебе, дяденька полиционер, большое . Все работает, вот только если несколько Series сделать, то графики как-то странно рисуются (с первым всегда все в порядке), то если + к "у", то выше уезжает и шире становится, а если они еще и пересекутся, то еще хуже становится. Это в принципе TChart такой гад, или я накосячил?
dfsagfdsg.jpg dsafnjkdsfk.jpg |
#6
|
||||
|
||||
Цитата:
Кстати в 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
|
|||
|
|||
Цитата:
Код:
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
|
||||
|
||||
Цитата:
|