谁有画五角星的函数????????????分多多的给定一个中心原点,和五角星的大小

解决方案 »

  1.   

    我可以画出这个五角星了,但怎样用指定的颜色填充呢,我现在得到了五个顶点的坐标,上面的几位老大有例子的话发给我好了,   [email protected]
      

  2.   

    unit StarobjectU;interface
      uses Graphics,Types ;
    type
      TPoint3 =array[0..2] of Tpoint ;
      TPoint5 =array[0..4] of Tpoint ;
      TFiveStar = class
      private
        FBitmap: TBitmap;
        FRealOFFSet: Double;
        FRadius: Integer;
        FColor: TColor;
        FgraynessColor : Tcolor ;
        FContrast: integer;
        FBackColor: TColor;
        FLongpoints : TPoint5 ;
        FShortpoints : TPoint5 ;
        FShortR : Double ;
        procedure SetColor(const Value: TColor);
        procedure SetOFFSet(const Value: integer);
        procedure SetRadius(const Value: Integer);
        function GetOffset: integer;
        procedure SetContrast(const Value: integer);
        procedure ChangegraynessColor ;
        procedure SetBackColor(const Value: TColor);
        function GetRect: TRect;
        function GetCanvas: TCanvas;
       public
        constructor Create;
        destructor Destroy; override;
        procedure Draw ;
        procedure DrawToCanvas(aCanvas:TCanvas;Center:Tpoint);
        procedure SaveToFile(Filename:string);
        property Canvas : TCanvas Read GetCanvas;
        property BackColor : TColor  read FBackColor write SetBackColor;
        property Radius : Integer  read FRadius write SetRadius;
        property OFFSet : integer  read GetOffset write SetOFFSet;
        property Color : TColor  read FColor write SetColor;
        property Contrast : integer Read FContrast write SetContrast ;
        property ClipRect : TRect Read GetRect ;
       end;
    implementationuses color;{ TFiveStar }{ TFiveStar }procedure TFiveStar.ChangegraynessColor;
    var
      aRGB : TRGBColor ;
      aLum : integer ;
    begin
      aRGB := TRGBColor.Create ;
      try
        aRGB.Color := FColor ;
        aLum :=Round(aRGB.Lum*(1+FContrast/240)) ;
        if (aLum >240) then
          aRGB.Lum :=240
        else
          if aLum<0 then
            aRGB.Lum := 0
          else
            aRGB.Lum := aLum ;
        FgraynessColor := aRGB.Color ;
      finally
        aRGB.Free ;
      end;
    end;constructor TFiveStar.Create;
    begin
      inherited ;
      FBitmap := TBitmap.Create ;
      Fbitmap.Width := 100 ;
      Fbitmap.Height := 100 ;
      Radius := 50 ;
      color := clred ;
      Contrast := 50;
    end;destructor TFiveStar.Destroy;
    begin
      FBitmap.Free ;
      inherited;
    end;procedure TFiveStar.Draw;
    begin
      Canvas.Brush.Color := FBackColor ;
      Canvas.FillRect(Canvas.ClipRect);
      DrawToCanvas(Canvas,Point(FRadius,FRadius));
    end;procedure TFiveStar.DrawToCanvas(aCanvas: TCanvas; Center: Tpoint);
    var
      i : integer ;
      procedure FullColor(aColor:TColor;p1,p2:Tpoint);
      var
        aps:TPoint3 ;
      begin
        aps[0] := Center ;
        aps[1] := p1 ;
        aps[2] := p2 ;
        acanvas.Pen.Color := acolor ;
        acanvas.Brush.Color := acolor ;
        acanvas.Polygon(aps);
      end;
    begin
      for i := 0 to 4 do
      begin
       FLongpoints[i].Y :=Center.Y+ Round(sin(FRealOFFSet+i*2*pi/5)*FRadius) ;
       FLongpoints[i].x :=Center.x+ Round(Cos(FRealOFFSet+i*2*pi/5)*FRadius) ;
       FShortpoints[i].Y :=Center.Y+ Round(sin(FRealOFFSet+pi/5+i*2*pi/5)*FShortR) ;
       FShortpoints[i].x :=Center.X+ Round(Cos(FRealOFFSet+pi/5+i*2*pi/5)*FShortR) ;
      end;
      FullColor(FgraynessColor,FLongpoints[0],FShortpoints[0]);
      FullColor(FColor,FLongpoints[1],FShortpoints[0]);
      FullColor(FgraynessColor,FLongpoints[1],FShortpoints[1]);
      FullColor(FColor,FLongpoints[2],FShortpoints[1]);
      FullColor(FgraynessColor,FLongpoints[2],FShortpoints[2]);
      FullColor(FColor,FLongpoints[3],FShortpoints[2]);
      FullColor(FgraynessColor,FLongpoints[3],FShortpoints[3]);
      FullColor(FColor,FLongpoints[4],FShortpoints[3]);
      FullColor(FgraynessColor,FLongpoints[4],FShortpoints[4]);
      FullColor(FColor,FLongpoints[0],FShortpoints[4]);
    end;function TFiveStar.GetCanvas: TCanvas;
    begin
      Result := FBitmap.canvas ;
    end;function TFiveStar.GetOffset: integer;
    begin
      Result :=Round(180*FRealOFFSet/pi)
    end;function TFiveStar.GetRect: TRect;
    begin
      Result := Rect(0,0,2*FRadius,2*FRadius);
    end;procedure TFiveStar.SaveToFile(Filename: string);
    begin
      FBitmap.SaveToFile(filename);
    end;procedure TFiveStar.SetBackColor(const Value: TColor);
    begin
      FBackColor := Value;
    end;procedure TFiveStar.SetColor(const Value: TColor);
    begin
      FColor := Value;
      ChangegraynessColor ;
    end;procedure TFiveStar.SetContrast(const Value: integer);
    begin
      FContrast := Value ;
      ChangegraynessColor ;
    end;procedure TFiveStar.SetOFFSet(const Value: integer);
    begin
      FRealOFFSet := (Value mod 360)*pi/180 ;
    end;
    procedure TFiveStar.SetRadius(const Value: Integer);
    begin
      if FRadius = Value then Exit ;
      FRadius := Value;
      FShortR := FRadius*(Cos(pi/5))/2 ;
      FBitmap.Width := 2*FRadius ;
      fbitmap.Height := 2*FRadius ;
    end;end.其中TRGBColor是我寫的專用來處理顏色的一個類.你可以把ChangegraynessColor方法改一下.
    把FColor的R,G,B同時加FContrast得到FgraynessColor
      

  3.   

    这个行不?
    var
      trim: array [0..10, 0..1] of Single;procedure TNForm.InitTrim;
    var
      i: Integer;
    begin
      // 生成一个五角星形状的裁剪曲线,注意:要保证裁剪曲线是封闭的
      for i := 0 to 10 do
      begin
        if Odd(i) then
        begin
          trim[i,0] := 0.5 * cos(36*i*pi/180) + 0.5;
          trim[i,1] := 0.5 * sin(36*i*pi/180) + 0.5;
        end
        else begin
          trim[i,0] := 0.25 * cos(36*i*pi/180) + 0.5;
          trim[i,1] := 0.25 * sin(36*i*pi/180) + 0.5;
        end;
      end;
    end;
    procedure TNForm.FormPaint(Sender: TObject);
    begin
      gluBeginTrim(nurb);
          // 绘制一个分段线性的曲线用于从曲面上裁剪出一个星形形状来
          gluPwlCurve(nurb, 11, @trim, 2, GLU_MAP1_TRIM_2);
        gluEndTrim(nurb);
    end;