返璞归真6:关于得到曲线上所有点的方法。 (1分)

  • 主题发起人 主题发起人 卷起千堆雪tyn
  • 开始时间 开始时间

卷起千堆雪tyn

Unregistered / Unconfirmed
GUEST, unregistred user!
这里我们说得曲线是指根据控制点绘制的BEZIER曲线、椭圆等;
如何由控制点求得曲线上的所有点,在图形学里称之为曲线的折线化。
下面利用 FlattenPath 函数实现这一目的,并结合以前介绍的流动线,我们来形成流动的椭圆。

设置: Timer1.Interval :=100;

var
Form1: TForm1;
pathpoints :array [0..1000] of TPoint;
PathTypes :array [0..1000] of byte;
PPts :PPoint;
PTypes :PByteArray;
Number :Integer;
Counter,CounterStart :Byte;

procedure MovingDots(X,Y: Integer; TheCanvas: TCanvas); stdcall;
begin
Counter := Counter shl 1;
if Counter = 0 then Counter := 1;
if (Counter and 224) > 0 then
TheCanvas.Pixels[X,Y] :=clWhite
else
TheCanvas.Pixels[X,Y] :=clBlue;
end;

procedure DrawThePolygon;
var
J :Integer;
begin
for J := 0 to Pred(Number) do
begin
if J <> Pred(Number) then
LineDDA(PathPoints[J].X,PathPoints[J].Y,PathPoints[J+1].X,PathPoints[J+1].Y,
@MovingDots,LongInt(Form1.Canvas))
else
LineDDA(PathPoints[Number-1].X,PathPoints[Number-1].Y,PathPoints[0].X,PathPoints[0].Y,
@MovingDots,LongInt(Form1.Canvas));
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
CounterStart := CounterStart shr 2;
if CounterStart = 0 then CounterStart := 128;
Counter := CounterStart;
DrawThePolygon;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
BeginPath(Canvas.Handle);
Canvas.Ellipse(30,30,300,150);
EndPath(Canvas.Handle);
if FlattenPath(Canvas.Handle)then
begin
PPts := nil;
PTypes := nil;
Number := GetPath(Canvas.Handle,PPts,PTypes,0);
Number := GetPath(Canvas.Handle,PathPoints,PathTypes,Number);
end;
end;
 
雪儿什么时候出书,偶一定买!
 
听课,agree,怎么不行啊
 
这样的效率高吗,如果数据是从数据库中取出,而且要根据键盘的上下键来左右移动,会出现
闪烁吗?
 
我只是抛砖引玉了,其他的事情应该自己去做吧?
 
多人接受答案了。
 
后退
顶部