關於TChart |
尚未結案
|
kaiming
一般會員 發表:6 回覆:11 積分:8 註冊:2004-03-01 發送簡訊給我 |
|
StrongLemon
高階會員 發表:10 回覆:166 積分:105 註冊:2004-04-18 發送簡訊給我 |
kaiming你好: 請參閱範例 觀念:由X下去找這個Series最接近的兩點,直線公式算出Y
function TForm1.GetLineYByX(PriorPoint,NextPoint:TPoint;X:Double):Double; //y=ax b var a,b:Double; begin if (PriorPoint.X-NextPoint.X)=0 then a:=0 else a:=(PriorPoint.Y-NextPoint.Y)/(PriorPoint.X-NextPoint.X); b:=NextPoint.Y-(NextPoint.X*a); Result:=a*X b; end; procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Edit1.Text:=FloatToStr(GetSeriesYValueByX(Series1,X)); Edit2.Text:=FloatToStr(GetSeriesYValueByX(Series2,X)); Edit3.Text:=FloatToStr(GetSeriesYValueByX(Series3,X)); Edit4.Text:=FloatToStr(GetSeriesYValueByX(Series4,X)); end; function TForm1.GetSeriesYValueByX(ASeries:TChartSeries;X:Integer):Double; var I: Integer; XValue,YValue: Double; ClosePrior,CloseNext:Integer; PriorPoint,NextPoint:TPoint; tmpY:Integer; begin Result:=0; XValue:=ASeries.XScreenToValue(X); ClosePrior:=0; CloseNext:=0; for I := ASeries.FirstValueIndex to ASeries.LastValueIndex do // Iterate begin if I>=ASeries.Count then exit; //取最接近兩點 if ASeries.XValue[I]<=XValue then ClosePrior:=I; if ASeries.XValue[I]>=XValue then begin CloseNext:=I; Break; end; end; // for if (ClosePrior>-1) and (ClosePrior |
kaiming
一般會員 發表:6 回覆:11 積分:8 註冊:2004-03-01 發送簡訊給我 |
StrongLemon你好:
我把你給我的Code轉成BCB的模式,但Compiler會失敗 我的Code如下: void __fastcall TForm1::Chart1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
Edit1->Text = FloatToStr(GetSeriesYValueByX(Series1,X));
Edit2->Text = FloatToStr(GetSeriesYValueByX(Series2,X));
Edit3->Text = FloatToStr(GetSeriesYValueByX(Series3,X));
Edit4->Text = FloatToStr(GetSeriesYValueByX(Series4,X));
}
//---------------------------------------------------------------------------
double __fastcall TForm1::GetLineYByX(TPoint PriorPoint , TPoint NextPoint , double X)
{
//y=ax+b
double a , b; if ((PriorPoint.x - NextPoint.x) == 0)
a =0 ;
else
a = (PriorPoint.y - NextPoint.y)/(PriorPoint.x - NextPoint.x);
b = NextPoint.y - (NextPoint.x * a);
return a*X+b ;
}
//---------------------------------------------------------------------------
double __fastcall TForm1::GetSeriesYValueByX(TChartSeries ASeries , int X)
{
int I ;
double XValue,YValue ;
int ClosePrior,CloseNext ;
TPoint PriorPoint,NextPoint;
int tmpY ; YValue = 0 ;
// return YValue ;
XValue = ASeries.XScreenToValue(X) ;
ClosePrior = 0 ;
CloseNext = 0 ;
for (I = ASeries.FirstValueIndex ; I < ASeries.LastValueIndex ; I++) // Iterate
{
if (I >= ASeries.Count()) break ; //取最接近兩點
if (ASeries.XValue[I] <= XValue)
ClosePrior = I ;
if (ASeries.XValue[I] >= XValue)
{
CloseNext = I ;
break;
}
} // for
if ((ClosePrior > -1) && (ClosePrior < ASeries.Count())
&& (CloseNext > -1) && (ClosePrior
|
StrongLemon
高階會員 發表:10 回覆:166 積分:105 註冊:2004-04-18 發送簡訊給我 |
|
kaiming
一般會員 發表:6 回覆:11 積分:8 註冊:2004-03-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |