首页 > 代码库 > 【Spine】Spine Runtime for Delphi移植笔记(二) - spine.math

【Spine】Spine Runtime for Delphi移植笔记(二) - spine.math

////////////////////////////////////////////////////////////////////////////////
//Generic delphi runtime v3.6 for Spine animation tool                        //
//Runtime port by cjk (hzi1980@163.com)                                       //
////////////////////////////////////////////////////////////////////////////////

unit spine.math;

interface

type
  TSpineMath = class
  public const
    PI2 = PI * 2;
    RadDeg = 180.0 / PI;
    DegRad = PI / 180;
    RadFull = PI * 2;
    DegFull = 360;
  public
    class function Sin(const radians: Single): Single; static;
    class function Cos(const radians: Single): Single; static;
    class function SinDeg(const degrees: Single): Single; static;
    class function CosDeg(const degrees: Single): Single; static;
    class function Atan2(const x,y: Single): Single; static;
    class function Clamp(const value, min, max: Single): Single; static;
  end;

implementation

{ TSpineMath }

class function TSpineMath.Atan2(const x, y: Single): Single;
var
  lAtan: Single;
  lZ: Single;
begin
  if x = 0 then
  begin
    if y > 0 then exit(PI / 2);
    if y = 0 then exit(0);
    exit(-PI / 2);
  end;
  lZ:= y / x;
  if Abs(lZ) < 1 then
  begin
    lAtan:= lZ / (1 + 0.28 * lZ * lZ);
    if x < 0 then
    begin
      if y < 0 then
        exit(lAtan - PI)
      else
        exit(lAtan + PI);
    end;
    exit(lAtan);
  end;
  lAtan:= PI / 2 - lZ / (lZ * lZ + 0.28);
  if y < 0 then
    result:= lAtan - PI
  else
    result:= lAtan;
end;

class function TSpineMath.Clamp(const value, min, max: Single): Single;
begin
  if value < min then exit(min);
  if value > max then exit(max);
  result:= value;
end;

class function TSpineMath.Cos(const radians: Single): Single;
begin
  result:= System.Cos(radians);
end;

class function TSpineMath.CosDeg(const degrees: Single): Single;
begin
  result:= System.Cos(degrees * DegRad);
end;

class function TSpineMath.Sin(const radians: Single): Single;
begin
  result:= System.Sin(radians);
end;

class function TSpineMath.SinDeg(const degrees: Single): Single;
begin
  result:= System.Sin(degrees * DegRad);
end;

end.

一些需要用到的数学函数

【Spine】Spine Runtime for Delphi移植笔记(二) - spine.math