6

紧缩紧缩。

使用Getting End Point in ArcSegment with Start X/Y 和 Start+Sweep Angles的计算,我怎么能挤压或膨胀(-ify)角度。

请参阅下面的图片。绿盒为原装。黄线描绘了皱缩或膨胀的开始/结束角度应该变成什么,但红线是如果原始角度 start=169, end=293 保持在皱缩或膨胀的椭圆弧上。

我需要一种方法来确定如何根据绿色框中的原始值以及蓝色和橙色框中的高度/宽度/xRadius/yRadius 值来创建新的开始/结束角度。

原来的宽度皱缩高度皱缩

有谁知道计算新角度应该是什么?

4

2 回答 2

1

我写了一个电子表格来计算这个。如果需要,您可以在https://skydrive.live.com/redir?resid=23B7BEDE6527529E!529&authkey=!AGboDW72AySsnK8上看到它。(这应该会产生一个在线工作版本,但您也应该能够下载它。)

基本技术是这样工作的:

  1. 计算出未弯曲端点的 X 和 Y 坐标
  2. Scrunch 那些使用简单缩放,以获得所需端点的 X 和 Y 坐标
  3. 从那些角度工作

这涉及到相当多的计算。您可以在该电子表格中进行操作,但所有步骤如下:

首先,我将您的角度转换为使用坐标几何约定 - 据我所知,您从 3 点钟开始顺时针测量,但在坐标几何中,正角逆时针方向更正常。所以你的开始和结束角度分别变成 191 度和 67 度。(我这样做是因为我发现这样的数学不太容易混淆。))

接下来,电子表格计算出起点和终点的半径。以下是我用于起点和终点的公式:

=D2*D3/SQRT(POWER(D3*COS(RADIANS(D4)),2) + POWER(D2*SIN(RADIANS(D4)),2))
=D2*D3/SQRT(POWER(D3*COS(RADIANS(D5)),2) + POWER(D2*SIN(RADIANS(D5)),2))

D2 和 D3 是 X 和 Y 半径。D4 是开始角度,D5 是结束角度(调整为“常规”角度)。我从标题为“相对于中心的极坐标”部分的椭圆上的维基百科项目中得到了这个公式。该等式采用一个角度,并告诉您椭圆在该角度处的半径。

接下来我用它来计算起点和终点的 X 和 Y 坐标。以下是起始 X 和 Y 的公式:

=$B$8*COS(RADIANS(D4)) + D2
=D3-$B8*SIN(RADIANS(D4))

如前所述,D2 和 D3 是 X 和 Y 半径,而 D4 是起始角度。(末端 X 和 Y 的公式仅在 D5 中看起来相同。添加 X 半径的原因是没有这个数字,范围从 -Xradius 到 +Xradius。加上这意味着它们的范围从 0 到宽度。Y 轴确实类似的东西,但我已经倒置它以获得屏幕坐标,因为计算机图形系统通常倾向于将其颠倒(增加 Y 沿着页面向下)。是的,我倒置它但纠正了角度并不完全一致。 。对不起!

接下来我们计算压缩后的 X 和 Y。以下是起点的公式:

=B9/B2*B13
=B10/B3*B14

B9 和 B10 是上一步计算的预拉伸 X 和 Y。B2 和 B3 是原始宽度和高度,而 B13 和 B14 是打褶后的宽度和高度。(当然,最终公式看起来非常相似。)所以这只是一个简单的缩放操作。

最后,我们从这些计算角度。这是开始角度公式(结束角度几乎相同)

=MOD(DEGREES(ATAN2(B16 - $D$13, $D$14-B17)), 360)

ATAN2 函数采用 X 和 Y 坐标,并告诉您从原点到 X、Y 点的直线角度。Excel 以弧度工作,因此我们必须将其转换回度数(就像我在早期公式中将度数转换为弧度一样)。然后我将其采用 MOD 360 以避免出现任何负角。ATAN2 永远不会产生大于 PI(即 180 度)的值,并且会为超过 PI 的角度产生负值。取模 360 将其包装回正数。

然后最后一步是将其转换回您的顺时针角度系统:

= 360 - B19

喂入您拉伸的 1.88/3.4 尺寸,我们得到 165.51 和 287.70 度。这与你的数字不太相符,但我正在努力弄清楚你从哪里得到这些数字。它们是用眼睛完成的吗?喂食 2.5/2.55,我得到 171.71 和 299.51。同样,与您的略有不同,但相差不大。

于 2013-03-08T18:11:22.210 回答
1

如果您考虑一下这段代码实际上在做什么,它与垂直或水平比例非常相似(顺便说一句,这会起作用吗?)。我认为这为我们提供了解决这个问题的线索,而无需真正深入研究特定于椭圆的几何。

一般的方法是根据角度和半径设置计算 x,y 坐标中的端点,应用比例因子,然后转换回角度。我们还需要知道的第一件事是椭圆的中心。我们所知道的是起点和终点,以及起点和终点的角度。有了这些信息,我们可以建立一组非常简单的方程并求解:((x,y)是椭圆的中心)

(yEnd-y)/(xEnd-x) = tan(endAngle) = 直线从中心到端点的斜率 (yStart-y)/(xStart-x) = tan(startAngle) = 直线从中心到起点的斜率

有了这些方便的信息,我们现在可以通过比例因子计算新的中心 (x',y')、x 和 y 半径以及端点 (xEnd', yEnd')。(根据定义,我相信起点是 0,0,但根据需要进行更改)。

x' = x * xScale, y' = y*yScale xEnd' = xEnd * xScale, yEnd' = yEnd * yScale

xRadius' = xRadius * xScale, yRadius' = yRadius * yScale

现在我们需要找出新的角度。

Math.Atan2(yStart', xStart') = 新的开始角度 Math.Atan2(yEnd', xEnd') = 新的结束角度

这种策略有意义吗?

于 2011-04-02T05:55:45.360 回答