是不是入门考试呀,
答出来了你就做收我做弟子了。
http://www.csdn.net/expert/topic/691/691437.xml?temp=.8445551

解决方案 »

  1.   

    查询的点范围(X-R,X+R)和(Y-R,Y+R),苯办法。
      

  2.   

    procedure TForm1.DrawCircle(r: integer; pt: Tpoint; clr: TColor);
      var x,y:Integer;
    begin
        for x:=pt.X-r to pt.X+r do
        begin
           for y:=pt.Y-r to pt.Y+r do
           begin
              if (x-pt.X)* (x-pt.X)+(y-pt.Y)*(y-pt.Y)=R*R  then
                 Canvas.Pixels[x,y]:=clr;
           end
        end
    end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var pt:tpoint;
    begin
        pt.X:=x;
        pt.y:=y;
        DrawCircle(100,pt,clred);
    end;
    但画出来的不理想。
      

  3.   

    用新的drawcircle1代替drawcircle,效果好一些
    procedure TForm1.drawcircle1(r: integer; pt: Tpoint; clr: TColor);
    var
      i,x,y:integer;
    begin
      for i:=1 to 360  do
        begin
          X:=pt.X+Round(r*cos(i));
          Y:=pt.y+Round(r*sin(i));
          Canvas.Pixels[x,y]:=clr;
        end;
    end;
      

  4.   

    //学习中
    function Calc(mCanvas: TCanvas; mX0, mY0: Integer; mRadii: Integer;
      mColor: TColor): Boolean;
    //mCanvas:指定画布//只能访问TCanvas.Pixels[X, Y]//#不能用TCanvas.Ellipse函数
    //mX0, mY0:指定圆中心坐标
    //mRadii:指定半径
    //mColor:指定颜色
    var ii: Integer;
        x,y: Integer;
    begin
      Result := False;
      if not Assigned(mCanvas) then Exit;
      { TODO : 画圆算法 }
      mCanvas.brush.Style := bsClear;
      mCanvas.Font.Color := mColor;
      for ii := 0 to 3600 do
      begin
        x := ROUND(mRadii*Sin(ii/10));
        y := ROUND(mRadii*Cos(ii/10));
        mCanvas.TextOut(mX0+x,mY0+y,'.');
      end;
      Result := True;
    end;
      

  5.   

    zswang(伴水)(* pascal→c *) :可不可以了?
      

  6.   

    //学习中
    function Calc(mCanvas: TCanvas; mX0, mY0: Integer; mRadii: Integer;
      mColor: TColor): Boolean;
    //mCanvas:指定画布//只能访问TCanvas.Pixels[X, Y]//#不能用TCanvas.Ellipse函数
    //mX0, mY0:指定圆中心坐标
    //mRadii:指定半径
    //mColor:指定颜色
    var ii: Integer;
        x,y: Integer;
    begin
      Result := False;
      if not Assigned(mCanvas) then Exit;
      { TODO : 画圆算法 }
      mCanvas.brush.Style := bsClear;
      mCanvas.Font.Color := mColor;
      for ii := 0 to 3600 do
      begin
        x := ROUND(mRadii*Sin(ii/10));
        y := ROUND(mRadii*Cos(ii/10));
        mCanvas.TextOut(mX0+x,mY0+y,'.');
      end;
      Result := True;
    end;
      

  7.   

    zswang (伴水)(* pascal→c *) 老师真是桃李满天下呀!深深感动和佩服中......
      

  8.   

    to yuanjunjing(※挪威森林※):
    我已经调试了
    已经实现这个要求
    但是你怎么能更改我的函数名称和接口
    //将 票票 的方法修改修改就可以了function Calc(mCanvas: TCanvas; mX0, mY0: Integer; mRadii: Integer;
      mColor: TColor): Boolean;
    var
      I: Integer;
      X, Y: Integer;
    begin
      Result := False;
      if not Assigned(mCanvas) then Exit;
      for I := 0 to 3600 do begin
        X := Round(mRadii * Sin(I / 10));
        Y := Round(mRadii * Cos(I / 10));
        mCanvas.Pixels[X + mX0, Y + mY0] := mColor;
      end;
      Result := True;
    end;
      

  9.   

    zswang(伴水)(* pascal→c *) :
      可以了没,我通过考试了没有?不过我觉得不是很理想,不是很圆滑!有没有更好的办法?票票:
      mCanvas.TextOut(mX0+x,mY0+y,'.')出来的效果也一般般,上下密集,左右松散
      

  10.   

    procedure TForm1.drawcircle2
    (r: integer; pt: Tpoint; clr: TColor);
    var
      i:real;
      x,y:integer;
    begin
      i:=0;
      while i<361 do
        begin
          X:=pt.X+Round(r*cos(i));
          Y:=pt.y+Round(r*sin(i));
          Canvas.Pixels[x,y]:=clr;
          i:=i+0.01;
        end;
    end;
      

  11.   

    用drawcircle2代替drawcircle1
    效果更好一些!!!
      

  12.   

    to sundayboys(sunboy):
    同意你的说法,计算周长再决定怎么,呵呵~~to yuanjunjing(※挪威森林※):
    继续完善完善
      

  13.   

    to sundayboys(sunboy):
    同意你的说法,计算周长再决定怎么,呵呵~~to yuanjunjing(※挪威森林※):
    继续完善完善
      

  14.   

    老师:不也意思,很急,所以顺手写了一个,但上面那个已经解决了圆滑问题了!重新写一个标准的。function Calc(mCanvas: TCanvas; mX0, mY0: Integer; mRadii: Integer;
      mColor: TColor): Boolean;
    var
      I: real;
      X, Y: Integer;
    begin
      Result := False;
      if not Assigned(mCanvas) then Exit;
      i:=0;
      while i<361 do
        begin
          X := Round(mRadii * Sin(I));
          Y := Round(mRadii * Cos(I));
          mCanvas.Pixels[X + mX0, Y + mY0] := mColor;
          i:=i+0.01;
        end;
      end;
      Result := True;
    end;
      

  15.   

    to yuanjunjing(※挪威森林※):
    你不能修改函数的名称和接口以及调试的代码,这会让我多花时间
      

  16.   

    这个和 <for I := 1 to 36100 do> 有什么区别?!
    如果画一个小圆也要循环这么多次?
      

  17.   

    这个和 <for I := 1 to 36100 do> 有什么区别?!
    如果画一个小圆也要循环这么多次?
      

  18.   

    从纯理论上讲,我想不可能将这个圆画到100%的圆滑,但可以通过调整步长趋于无穷小,达到“很”圆滑的效果,(与半径应该有个类似的反比关系)但round函数的存在,又证明这是不可能的老师,我想不出好办法了。
      

  19.   

    function Calc(mCanvas: TCanvas; mX0, mY0: Integer; mRadii: Integer;
      mColor: TColor): Boolean;
    var
      I, J: Integer;
    begin
      Result := False;
      if not Assigned(mCanvas) then Exit;
      for I := mX0 - mRadii to mX0 + mRadii do
        for J := mY0 - mRadii to mY0 + mRadii do
          if Round(Sqrt(Sqr(I - mX0) + Sqr(J - mY0))) = mRadii then
            mCanvas.Pixels[I, J] := mColor;
      Result := True;
    end;