【问题标题】:Modify a formula from calculating around a circle to around an oval?将公式从围绕圆计算修改为围绕椭圆计算?
【发布时间】:2011-12-08 15:33:39
【问题描述】:

我在下面的函数中有这个公式。这是一个相当简单的概念,但这个公式花了我将近 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;

这是我需要的添加参数:

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;

定义:

  • Center = 计算基础的中心点(椭圆中心)
  • 距离 = 在任何方向上离中心有多远,与度数无关
  • 度数 = 围绕中心点的度数,从右上方开始
  • OvalOffset = 宽度和高度之间的差异比率

【问题讨论】:

  • 椭圆对称轴是水平的还是垂直的?
  • 是的,我不关心椭圆的旋转,只是宽度与高度不同。
  • 只是澄清一下:NewPosition 的结果应该具有给定的距中心的距离,并且在度数给定的角度上?至少这是我从你的定义中读到的。
  • 没错。我已经有这个工作了,不需要更多的帮助,除非你想用它做一些更有趣的事情?例如,添加将这个椭圆旋转到一定程度的能力?不过不重要,谢谢。
  • 在这种情况下,您的问题有些不清楚。给定一个固定距离和不同程度的函数,大多数结果点到中心的距离将与指定的不同。对于椭圆曲线,距离和度数的值通常与每个点的测量距离和度数不匹配。

标签: delphi math drawing delphi-7


【解决方案1】:

Result.Y 公式中添加除以OvalOffset...

Result.Y:= Trunc((Distance*Sin(Radians)+Distance*Cos(Radians))/OvalOffset)
           +Center.Y;

【讨论】:

  • 也许我弄错了,但是使用您的代码,ResultCenter 之间的距离不会与给定值 Distance 不同吗?
  • 距离 = 距离中心有多远,无论度数如何,度数 = 从右上角开始围绕中心点的度数
  • 是的,我尝试了你的公式,而不是做一个椭圆,它只做了一个更小的圆圈(我在 Result.X 上也使用了精确的公式)
  • @Jerry Y 偏移的线性缩放怎么会导致圆形?
  • 啊哈,我误解了答案,因为它没有得到彻底的解释。我也尝试将这个公式复制到 Result.X 中,结果只是一个更小的圆圈。将 Result.X 改回原始代码,现在可以使用:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多