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; 但画出来的不理想。
用新的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;
//学习中 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;
zswang(伴水)(* pascal→c *) :可不可以了?
//学习中 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;
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;
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;
用drawcircle2代替drawcircle1 效果更好一些!!!
to sundayboys(sunboy): 同意你的说法,计算周长再决定怎么,呵呵~~to yuanjunjing(※挪威森林※): 继续完善完善
to sundayboys(sunboy): 同意你的说法,计算周长再决定怎么,呵呵~~to yuanjunjing(※挪威森林※): 继续完善完善
老师:不也意思,很急,所以顺手写了一个,但上面那个已经解决了圆滑问题了!重新写一个标准的。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;
to yuanjunjing(※挪威森林※): 你不能修改函数的名称和接口以及调试的代码,这会让我多花时间
这个和 <for I := 1 to 36100 do> 有什么区别?! 如果画一个小圆也要循环这么多次?
这个和 <for I := 1 to 36100 do> 有什么区别?! 如果画一个小圆也要循环这么多次?
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;
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;
但画出来的不理想。
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;
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;
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;
我已经调试了
已经实现这个要求
但是你怎么能更改我的函数名称和接口
//将 票票 的方法修改修改就可以了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;
可以了没,我通过考试了没有?不过我觉得不是很理想,不是很圆滑!有没有更好的办法?票票:
mCanvas.TextOut(mX0+x,mY0+y,'.')出来的效果也一般般,上下密集,左右松散
(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;
效果更好一些!!!
同意你的说法,计算周长再决定怎么,呵呵~~to yuanjunjing(※挪威森林※):
继续完善完善
同意你的说法,计算周长再决定怎么,呵呵~~to yuanjunjing(※挪威森林※):
继续完善完善
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;
你不能修改函数的名称和接口以及调试的代码,这会让我多花时间
如果画一个小圆也要循环这么多次?
如果画一个小圆也要循环这么多次?
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;