Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TChart


Автор: lotax 8.9.2006, 15:32
Привет, всем!!!
Вопрос:
Есть диаграмма (TChart) (тип: график(Line)) как можно узнать значение оси Y,
при пересечении оси X с графиком.

Автор: Alexeis 8.9.2006, 15:51
Код

procedure TForm1.btn1Click(Sender: TObject);
begin
  LineSeries1Series1.AddXY(1,1);
  LineSeries1Series1.AddXY(2,2);
  LineSeries1Series1.AddXY(3,3);
  Application.ProcessMessages;
  ShowMessage(FloatToStr(cht1.LeftAxis.Minimum) +
              ' ' + FloatToStr(cht1.LeftAxis.Minimum));

end;

Автор: lotax 10.9.2006, 14:25
alexeis1 спасибо за ответ, но этот вариант не подходит.

Имеется в виду что значение оси Х известное, например X=10, смотрим по графику, где идет пересечение с графиком, надо узнать значение Y (график по определенным координатам уже построен).

Автор: Alexeis 10.9.2006, 16:59
Ну встроеной функции я не нашел, приходит в голову только такое
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i, xn : Integer;
  found : Boolean;

const
  err = 0.1;

begin
  Series1.AddXY(1,1);
  Series1.AddXY(2, 1.5);
  Series1.AddXY(3,4);
  Series1.AddXY(8,7);

  found := False;
  for i := 0 to Series1.Count - 1
  do
    if abs(Series1.XValue[i] - 2) < err
    then
      Begin
        found := True;
        xn := i
      end;

  ShowMessage(FloatToStr(Series1.YValue[xn]));
end;

Автор: lotax 11.9.2006, 09:16
Все верно, только значения могут быть не постоянными, по которым построен график 
(если укажем x=2, то соответст. y=1.5 ), например X=2.0063
 smile 

Может есть компоненты, которые дают выше указанные возможности...

Автор: Guedda 11.9.2006, 09:18
Тогда тебе лучше не Tchart пользоваться, а на канве рисовать, предварительно высчитывая нужные тебе значения, и помещая их на канву. Моё ИМХО, так быстрее будет.

Автор: Alexeis 11.9.2006, 09:30
lotax, В таких делах привязка алгоритма к отображению, не самый лучший способ програмирования. Я обычно все расчеты и интерполяции (линейные, параболические) между точками делаю в алгоритме, а Chart использую, по его назначенью, т.е. по выводу информации, а не по обработке.

Автор: Fedia 11.9.2006, 09:40
lotax, находим две точки графика, соответствующие условию: 
1. Они следуют одна за другой.
2. Координата X искомой точки находится между значениями X этих точек. 
Составляем уравнение прямой по этим двум точкам. Подставляем в это уравнение значение X искомой точки и находим Y. Математика, класс 5 или 6-й.

Автор: lotax 11.9.2006, 09:41
Цитата

lotax, В таких делах привязка алгоритма к отображению, не самый лучший способ програмирования. Я обычно все расчеты и интерполяции (линейные, параболические) между точками делаю в алгоритме, а Chart использую, по его назначенью, т.е. по выводу информации, а не по обработке.


Не подскажешь ссылки или примеры как примерно реализовать. С такими вещами не сталкивался... smile  

Автор: Alexeis 11.9.2006, 10:19
Ну вот возьмем реальный фрагмент программы, в которой требуется получение интерполированого значения определенного коэффициента в случае если значения абсцис заданы ввиде равномерной сетки значений
Код

  c : array[1..20] of Extended = (1, 1.15, 1.2, 1.15, 1.25, 1.28, 1.25, 1.3,
                                  1.3, 1.35, 1.15, 1.1, 1.25, 1.2, 1.32,
                                  1.25, 1.3, 1.1, 1.1, 1.1);

       {$O-}
       
function C1(d : Extended) : Extended;
var
  index : Integer;
begin
  if (d < 0.05) or (d > 1)
  then
    begin
      Result := 0;
      Exit;
    end
  else
    if d = 1
    then
      begin
        Result := a[20];
        Exit;
      end;

  index := Trunc(d * 20);
  Result := 20 * (a[index+1]-a[index]) * (d - index / 20) + a[index];
end;


 c : array[1..20] of - это значения в точках индекс номер точки.
в данном случае для получения индекса точки, по известной абсцисе надо, умножить ее на 20 (такой здесь масштаб), 
  index := Trunc(d * 20); - определяет ближайшую левую тчку.
index + 1 это ближайшая правая точка. И просто из уравнения прямой, полученной по 2 точкам (тут уже оно упрощеное), подставляя, значение абсциссы, получаем ординату. Для неравностоящих узлов все сложнее, нужно более сложный алгоритм поиска близлежащих точек, например бинарный поиск. 

Автор: lotax 11.9.2006, 10:35
Всем спасибо,  в особенности alexeis1, буду разбираться...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)