修改公式从围绕圆计算到椭圆周围?

Jer*_*dge 6 delphi math drawing delphi-7

我在下面的函数中有这个公式.这是一个相当简单的概念,但这个公式花了我差不多2个星期才完美.它的作用是计算将物体放置在给定角度的距离和距离中心点的距离.它对于手动绘制圆圈非常有用,而且我主要将它用于我的针规组件.它计算在哪里画针.

现在我想弄清楚如何修改这个公式来考虑椭圆或椭圆.我确实想到了首先绘制一个圆形的组件,然后在绘制完所有东西后拉伸它的想法,但这不是一个干净的解决方案,因为我正在做的绘图已经是椭圆形.

我需要在这个函数中只添加一个参数来告诉它宽度/高度之间的比例,以便它知道如何偏移这一点.默认情况下,此参数应为1,表示Width = Height,表示没有椭圆绘图或偏移.但假设我放2,这意味着宽度是高度的两倍,或1.5意味着宽度是高度的1.5倍.

这是原始功能:

function NewPosition(Center: TPoint; Distance: Integer; Degrees: Single): TPoint;
var
  Radians: Real;
begin
  //Convert angle from degrees to radians; Subtract 135 to bring position to 0 Degrees
  Radians:= (Degrees - 135) * Pi / 180;
  Result.X:= Trunc(Distance*Cos(Radians)-Distance*Sin(Radians))+Center.X;
  Result.Y:= Trunc(Distance*Sin(Radians)+Distance*Cos(Radians))+Center.Y;
end;
Run Code Online (Sandbox Code Playgroud)

这是我需要的附加参数:

function NewPosition(Center: TPoint; Distance: Integer; Degrees: Single;
  OvalOffset: Single = 1): TPoint;
var
  Radians: Real;
begin
  //Convert angle from degrees to radians; Subtract 135 to bring position to 0 Degrees
  Radians:= (Degrees - 135) * Pi / 180;
  Result.X:= Trunc(Distance*Cos(Radians)-Distance*Sin(Radians))+Center.X;
  Result.Y:= Trunc(Distance*Sin(Radians)+Distance*Cos(Radians))+Center.Y;
end;
Run Code Online (Sandbox Code Playgroud)

定义:

  • 中心=中心点(椭圆中心)的计算基点
  • 距离=中心在任何方向上的距离,无论学位如何
  • 度=中心点周围的度数,从右上角开始
  • OvalOffset =宽度和高度之差的比率

在此输入图像描述

Tot*_*oto 6

通过添加一个部门OvalOffset,只是将Result.Y公式...

Result.Y:= Trunc((Distance*Sin(Radians)+Distance*Cos(Radians))/OvalOffset)
           +Center.Y;
Run Code Online (Sandbox Code Playgroud)