我靠,高手都跑那里去了?用chart画曲线,如何画一个封闭的不规则曲线? (10分)

  • 主题发起人 主题发起人 lcl_003
  • 开始时间 开始时间
1)求出你曲线上的点
从起点沿曲线再回到起点开始做如下循环:
begin
2)为每相邻的两个点创建一个TFastLineSeries对象,并加了TCHAT中
3)将所有的TFastLineSeries对象属性设为相同的
4)将这个每相邻两个点都加到所对应的TFastLineSeries对象中
end;
不会吧,
光不光滑只取决于你点的密度,只要你有足够的点,用计算机画图的原理都是
一样的,最终都是象素点的着色,我上面的算法是每相邻两点之点都连线,只要你的
点足够的近,肯定是能达到你的光滑要求,对计算机而言,最大的精度也就是象素点吧。

我上面说的即然是每相邻两点连线,就可以用于任意复杂图形,而且是可编程实现的,如
果象你说的那种标准图形,最多两根线就搞定,难道你用TCANVAS不是这样画的么?

当然你需要考虑开销,这个我没有试,但你非要用TCHAT 还要画很复杂的封闭曲线,又
不进行人工分割,又没找到能直接实现的方法,又不去找别的控件,那还有什么办法呢?

最后给你一个建议:象你说的这种情况,去找一个免费的画数学函数那种控件吧。

 
是的,我并不是说你的方法不行,我只是考虑如果这么做chart允许最多有多少个series?
我的图形画出来也许要几百个series ,我不知道这样可不可以
 
你为什么不试试呢?

下面的程序,加了501根,结果得到一条直线

var
Form1: TForm1;
ser:array[0..500] of TFastlineSeries;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=0 to 500 do
begin
ser:=TFastlineSeries.Create(self);
chart1.AddSeries(ser);
ser.AddXY(i-1,i,'',clred);
ser.AddXY(i,i+1,'',clred);
end;
end;
 
查了一下,是TArrowSeries,很简单,下面是一个例子。

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
X1,Y1,X2,Y2: Double;
begin
with TArrowSeries(Series1) do
begin
Clear;
ArrowHeight:=1;
ArrowWidth:=1;
for I:=0 to 90 do
begin
X1 := cos(2*PI /90* I)*100;
Y1 := sin(2*PI /90* I)*100;
X2 := cos(2*PI /90* (I+1))*100;
Y2 := sin(2*PI /90* (I+1))*100;
AddArrow(X1,Y1,X2,Y2);
end;
end;
end;
//最好把3D效果去掉
 
Huzzz,你的方法的确实现了画封闭曲线,问个问题,你的方法是画两条线吗?
x1,y1,x2,y2,是指这两条线吗。

beyondair,的确你的方法可以画,但是我发现series超过1000条的时候会非常的慢。
而我接收数据是每500ms接收50个点的数据,那可想而知用你的方法 画的series
要远远大于1000。而且大于5000基本就死掉了。
 
x1,y1,x2,y2,这是一条线段啊。我上面的代码是添加了91条线段(不好意思多加了一条)。
x1,y1是起点,X2,Y2是终点,起点和终点相连成为一条线段。
第二条线段的起点就是第一条线段的终点。
第三条线段的起点就是第二条线段的终点。
。。。
第一条线段的起点就是最后一条线段的终点。
所以最后成了一个闭合曲线。
 

Huzzz,还是有点不明白:( 按你所说,x1,y1,x2,y2是起点和终点,但是我画完第一条的时候
有两个点,一个是第一条线的起点一个是第一条线的终点,同时第一条线的终点也是第二条
线的起点,我的理解对吧?那既然第二条线的起点有了就不用在指定了,只用指定第二条线
的终点就可以了啊。但是代码里还是要AddArrow(X1,Y1,X2,Y2);对于第二条线来说,这里的
x1,y1是指什么?是它的起点?可它的起点就是第一条线的终点啊。
按照你的说法应该可以画出下面的曲线吧?但是因为这个起点和终点没弄明白所以我没画
出来:(

|-------------|
| |
/ /
/ /
/ /
/ /
| |
|-------------|
 
>>既然第二条线的起点有了就不用在指定了,只用指定第二条线的终点就可以了啊
你说得很对,肯定是写添加程序的那个人水平差才搞成这样。但人家既然要你指定,
又有什么办法呢?你可以自己写一个。

这样吧,你定义一堆变量(用数组更好):

(x1,y1)
|-------------|(x2,y2)
|(x90,y90) |(x3,y3)
/ /
/ /(x4,y4)...
/ /
/ /
| |
|-------------|

var
x1,y1,
x2,y2,
x3,y3,
x4,y4,
....
x90,y90: Double;
begin
x1 := ...; y1 := ...;
x2 := ...; y2 := ........

那么你这样添加线段:
with TArrowSeries(Series1) do
begin
Clear;
ArrowHeight:=1;
ArrowWidth:=1;

AddArrow(X1,Y1,X2,Y2);
AddArrow(X2,Y2,X3,Y3);
AddArrow(X3,Y3,X4,Y4);
...
AddArrow(X89,Y89,X90,Y90);
AddArrow(X90,Y90,X1,Y1);
end;

//TArrowSeries本来设计就不是画线形图的,用法跟TLineSeries是不一样的。它的图
//线本身是可以分散的,我们需要它连续,当然只能让起点和终点互连了。
//这段程序跟我上面一段的结果是一样的,只是长了点。我快晕倒了。
 
Huzzz, 哦,非常感谢你的帮助,基本上搞定了。但是我还是要问一句,
teechart这么强大难道真的就没有直接画封闭曲线的series?
哦,留个联系方式吧。最好是QQ或msn及时通信的方式:)
 
你这么一说倒提醒了我,我研究了一下,发现TCHART的TLineSeries是可以画的,只需要
设置一下XValues.Order := loNone就可以了。
唉,搞那么久,最终结果是如此简单。
 
哦,感情饶了一大圈:)不过非常感谢huzzz,你是怎么查到的?help里我没找到:(
而且用lineseries画解决了arrowseries的延迟问题,因为我发现用arrowseries超过几千
点会有延迟。

huzzz留个联系方法吧,象你学习:)
 
huzzz@163.com
QQ我是很少用的。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
595
import
I
后退
顶部