急!求算法:已知坐标(X,Y)和半径R,画一半圆,最好有DELPHI代码,另API函数ARC怎么用,能解释一下,谢!(50分)

  • 主题发起人 YongSoft
  • 开始时间
Y

YongSoft

Unregistered / Unconfirmed
GUEST, unregistred user!
急!求算法:已知坐标(X,Y)和半径R,画一半圆,最好有DELPHI代码,另API函数ARC怎么用,能解释一下,谢!
 
procedure Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);
例子:
procedure TForm1.FormPaint(Sender: TObject);
var
R: TRect;
begin
R := GetClientRect; {Gets the boundaries of the current window}
Canvas.Arc(R.Left, R.Top, R.Right, R.Bottom, R.Right, R.Top, R.Left, R.Top);

end;
 
以下是我寫的一個類,你可以直接使用.
Unit Circles;

interface

uses
Graphics, Classes, SysUtils, Types;

type
TCircle=class(TObject)
private
FCenter:TPoint;
FRadius:Integer;
FColor: TColor;
public
constructor Create(ACenter:TPoint; ARadius:Integer);
destructor Destroy;override;
procedure Draw(ACanvas:TCanvas);
property Center:TPoint read FCenter write FCenter;
property Radius:Integer read FRadius write FRadius;
property Color:TColor read FColor write FColor;
end;

implementation

{ TCircle }

constructor TCircle.Create(ACenter: TPoint; ARadius: Integer);
begin
FCenter:=ACenter;
FRadius:=ARadius;
end;

destructor TCircle.Destroy;
begin
inherited;
end;

procedure TCircle.Draw(ACanvas: TCanvas);
var
PenColor:TColor;
begin
with ACanvas do
begin
PenColor:=Pen.Color;
Pen.Color:=FColor;
Brush.Style:=bsClear;
Pixels[FCenter.X,FCenter.Y]:=clRed;
Ellipse(FCenter.X-FRadius,FCenter.Y-FRadius,FCenter.X+FRadius,FCenter.Y+FRadius);
Pen.Color:=PenColor;
end;
end;

end.

使用如下:
procedure TForm1.Button1Click(Sender: TObject);
var
C:TCircle;
begin
C:=TCircle.Create(Point(50,50),100);
try
C.Draw(PaintBox1.Canvas);
finally
C.Free;
end;
end;
 
转:
API函数
Arc(HDC hdc;X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);
。(X1,Y1)和(X2,Y2)定义了椭圆的一个范围(约束)矩形。
从矩形中心点到点(X3,Y3)的一条线段与椭圆的交点标志着圆弧的起点。
而到(X4,Y4)的一条线与椭圆的交点则标志着圆弧的终点。
ArcTo函数会将当前画笔位置设为弧的终点,而Arc函数则不会对当前的画笔位置造成影响.
 
过一点同半径的圆有很多,如果是确定的一个,point(x,y)就是圆心了(我理解),
procedure draw(canvas:tcanvas;r,x,y,from ,tocorner:integer );
var
i:integer;
v:extended;
const
pi=3.1415;
begin
v:=pi/180;
for i:=from to tocorner-1 do
begin
canvas.moveto(x+round(r*sin(i*v)),y+round(r*cos(i*v)));
canvas.lineto(x+round(r*sin((i+1)*v)),y+round(r*cos((i+1)*v)));

end;
end;
这样可画不仅半圆,任意角度的部分员都可以画。
 
看看先!
 
顶部