![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
В 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.
|
| Этот пользователь сказал Спасибо 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
|
||||
|
||||
|
Цитата:
|