将计算围绕圆形的公式修改为围绕椭圆形计算的公式?

6
我在下面的函数中有这个公式。这是一个相当简单的概念,但是这个公式让我花了将近两周的时间才完美地实现。它的作用是计算在给定角度和距离中心点多远的位置放置对象。它对于手动绘制圆非常有用,我主要用它来绘制我的指针表组件。它计算出绘制指针的位置。
现在我正在尝试弄清楚如何修改此公式以考虑椭圆或椭圆形。我想到了先绘制一个圆形组件,然后在绘制完毕后进行拉伸的想法,但这不是一个干净的解决方案,因为我正在绘制的图形已经是椭圆形状。
我需要向这个函数添加一个参数,告诉它宽度/高度之间的比率,以便它知道如何偏移这个点。默认情况下,此参数应为1,表示宽度=高度,即没有椭圆形状的绘制或偏移。但是假设我输入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;

这里是我需要的添加参数:

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;

定义:

  • 中心 = 椭圆的中心点,用于计算基准
  • 距离 = 从中心点向任意方向的距离,与角度无关
  • 角度 = 围绕中心点的角度数,从上右开始计算
  • OvalOffset = 宽度和高度之间差异的比率

enter image description here


没错,我已经把这个搞定了,不需要再帮忙了,除非你想让它变得更花哨一些?比如,加入旋转椭圆到某个角度的功能?不过这不是必须的,谢谢。 - Jerry Dodge
在这种情况下,您的问题有些不清楚。给定一个固定的距离和不同的函数度数,大多数结果点与指定的中心点的距离将不同。对于椭圆曲线,距离和度数的值通常不匹配每个点的测量距离和度数。 - Uwe Raabe
我添加了一张图片,展示了它现在的工作方式以及我想要它做什么(尽管我的问题已经得到了回答)。 - Jerry Dodge
实际上,看这张图片,很合理地说我所称的“距离”实际上被认为是这个圆的“半径”,而“度数”当然是“角度”。我应该在我的数学课上更加注意:P - Jerry Dodge
椭圆形还是椭圆? - OnTheFly
显示剩余7条评论
1个回答

6
Result.Y公式中的除数更改为OvalOffset
Result.Y:= Trunc((Distance*Sin(Radians)+Distance*Cos(Radians))/OvalOffset)
           +Center.Y;

也许我理解错了,但是根据你的代码,ResultCenter 之间的距离是否会与给定的值 Distance 不同? - Uwe Raabe
距离 = 离中心点的距离,不考虑角度,度数 = 围绕中心点的度数,从正上方开始。 - Jerry Dodge
是的,我尝试了你的公式,但它只生成了一个较小的圆形,而不是椭圆形(我在Result.X上使用了精确的公式)。 - Jerry Dodge
@Jerry,Y轴偏移的线性缩放如何导致圆形? - David Heffernan
啊哈,我误解了答案,因为它没有被彻底解释清楚。我试图将这个公式复制到Result.X上,结果只得到了一个较小的圆圈。将Result.X改回原始代码,现在它可以正常工作:D - Jerry Dodge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接