如何实现使用Bezier曲线画圆弧(如椭圆)???(35分)

  • 主题发起人 主题发起人 ybsnui
  • 开始时间 开始时间
TO 卷起千堆雪tyn :
没办法。单位要求这么做???
怎么实现啊?哪位大虾出手相助,小弟实在是没分了!
 
呵呵!你们领导一定是“图象处理的@@狂”!
开个玩笑!助人为乐!不要Cry了!

一个小的Bezier曲线运用单元,用来画圆弧的(如:圆,椭圆等等)

type
T2DPoint = packed record
X, Y: Double;
end;

procedure EllipseEx(DC: hDC; X, Y, A, B, Angle: Double; N: Integer);
var
P: array of T2DPoint;
Q: array of TPoint;
Alpha, Beta: Double;
SinA, CosA: Double;
Temp: Double;
I, J, K: Integer;
begin
if N < 2 then N := 2;
Alpha := Pi/N;
Beta := 4 * (1-Cos(Alpha)) / (3*Sin(Alpha));
SetLength(P, N*3+1);
for I := 0 to N-1 do
begin
Temp := I * (2*Alpha);
CosA := cos(Temp);
SinA := sin(Temp);
K := I*3;
if K = 0
then J := N*3-1
else J := K-1;
P[K].X := A * CosA;
P[K].Y := B * SinA;
SinA := Beta * A * SinA;
CosA := Beta * B * CosA;
P[J].X := P[K].X + SinA;
P[J].Y := P[K].Y - CosA;
P[K+1].X := P[K].X - SinA;
P[K+1].Y := P[K].Y + CosA;
end;
P[N*3] := P[0];
CosA := cos(Angle);
SinA := sin(Angle);
SetLength(Q, N*3+1);
for i := Low(P) to High(P) do
begin
Q.X := Round(P.X*CosA - P.Y*SinA +X);
Q.Y := Round(P.X*SinA + P.Y*CosA +Y);
end;
BeginPath(DC);
PolyBezier(DC, Q, High(Q)+1);
EndPath(DC);
StrokeAndFillPath(DC);
end;
 
TO 卷起千堆雪tyn :
这么肯定?呵呵!
你可以试试上面的代码,画一个椭圆,No Problem !
这世界多么奇妙,因为一切都没有绝对 !
^_^
 
to 人在边缘:你好,我不知道你是不是做人在边缘flash动画的老大呢?
如果是的话希望跟你学学,最好呢要.fla文件
我的email:cwl-cw-@sohu.com
 
接受答案了.
 

Similar threads

后退
顶部