您的位置:首页 > 其它

根据中心点、半径长度和角度画点

2016-01-20 21:44 302 查看
直接上代码: 需要引用 Math 单元。

procedure CenterRadiusPoint(const PX, PY: Integer; const Angle: Double;
const Radius: Integer; var X, Y: Integer);
var
AngleHude: Double;
begin
AngleHude := Angle * PI / 180;  // 角度变成弧度
X := Round(Radius * Cos(AngleHude)) + PX;
Y := Round(Radius * Sin(AngleHude)) + PY;
end;


C#版:

/// 根据中心点、半径、角度,求半径另一端的坐标。注意用的是笛卡尔坐标系
/// </summary>
/// <param name="center">中心点</param>
/// <param name="angle">半径角度</param>
/// <param name="radius">半径长度</param>
/// <returns>半径另一端的坐标</returns>
public static Point CenterRadiusPoint(Point center, double angle, double  radius)
{
Point p = new Point();
double angleHude = angle * Math.PI / 180;/*角度变成弧度*/
p.X = (int)(radius * Math.Cos(angleHude)) + center .X;
p.Y = (int)(radius * Math.Sin(angleHude)) + center .Y;
return p;
}


使用示例:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
AX, AY: Integer;
R: Integer;
public
{ Public declarations }
procedure Clear();
procedure CenterRadiusPoint(const PX, PY: Integer; const Angle: Double;
const Radius: Integer; var X, Y: Integer);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses Math;

procedure TForm1.CenterRadiusPoint(const PX, PY: Integer; const Angle: Double;
const Radius: Integer; var X, Y: Integer);
var
AngleHude: Double;
begin
AngleHude := Angle * PI / 180;  // 角度变成弧度
X := Round(Radius * Cos(AngleHude)) + PX;
Y := Round(Radius * Sin(AngleHude)) + PY;
end;

procedure TForm1.Clear;
begin
Canvas.FillRect(Canvas.ClipRect);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
AX := X;
AY := Y;
R := 0;
Clear();
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
I: Integer;
X, Y: Integer;
T: Cardinal;
begin
Inc(R, 8);
T := GetTickCount;
for I := 0 to 360 - 1 do begin
CenterRadiusPoint(AX, AY, I, R, X, Y);
Canvas.Pixels[X, Y] := 0;
end;
T := GetTickCount - T;
Canvas.TextOut(10, 10, IntToStr(T));
end;

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: