uses
cgBezier;
var
Line: TCGLine; //羘?BezierΡ絬?癸禜
face: TCGFace;
Angle: GLInt;
const
ctrlpoints1: array[0..4,0..2] of GLFloat = //﹚竡北?翴
((-4.0,-2.0,0.0),(-2.0,4.0,0.0),(2.0,-2.0,0.0),
(2.0,2.0,0.0),(4.0,-2.0,0.0) );
ctrlpoints2: Array[0..3,0..3,0..2] of GLFloat =
(((-1.5,-1.5,4.0),(-0.5,-1.5,2.0),(0.5,-1.5,-1.0),(1.5,-1.5,2.0)),
((-1.5,-0.5,1.0),(-0.5,-0.5,3.0),(0.5,-0.5,0.0),(1.5,-0.5,-1.0)),
((-1.5,0.5,4.0),(-0.5,0.5,0.0),(0.5,0.5,3.0),(1.5,0.5,0.0)),
((-1.5,1.5,-2.0),(-0.5,1.5,-2.0),(0.5,1.5,0.0),(1.5,1.5,-1.0)));
implementation
{$R *.dfm}
procedure Tfrmbezier.FormCreate(Sender: TObject);
begin
InitGL;
glClearColor(0.0,0.0,0.0,0.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
//承?Bezier癸禜??﹍て―?竟
line := TCGLine.Create(GL_MAP1_VERTEX_3,0,1,3,4,@ctrlPoints1);
// ?﹍て?ΩΡ?
face := TCGFace.Create(GL_MAP2_VERTEX_3,0,1,3,4,0,1,12,4,@ctrlPoints2);
Angle := 20;
end;
procedure Tfrmbezier.FormPaint(Sender: TObject);
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
line.BezierLine(GL_LINES,30);
// draw bezier surface
glPushMatrix;
glRotatef(Angle,1.0,1.0,1.0);
face.BezierFace(GL_LINE_STRIP,10,10);
glPopMatrix;
glFinish;
PageFlip;
end;
procedure Tfrmbezier.FormResize(Sender: TObject);
var
w,h: Integer;
begin
w := ClientWidth;
h := ClientHeight;
glViewPort(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
if (w<h) then
glOrtho(-5.0,5.0,-5.0*h/w,5.0*h/w,-5.0,5.0)
else
glOrtho(-5.0*w/h,5.0*w/h,-5.0,5.0,-5.0,5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
Paint;
end;
procedure Tfrmbezier.FormDestroy(Sender: TObject);
begin
line.Free;
face.free;
end;
procedure Tfrmbezier.Timer1Timer(Sender: TObject);
begin
if Angle > 360 then
Angle := Angle - 360
else
Angle := Angle + 3;
Paint;
end;