如何巩固角度?

时间:2011-04-01 15:53:54

标签: .net wpf geometry drawing angle

紧缩。

使用Getting End Point in ArcSegment with Start X/Y and Start+Sweep Angles中的计算,我怎样才能对角度进行scrunchify或膨胀(-ify)。

见下图。绿盒子是原创的。黄线描绘了松散或膨胀的开始/结束角度应该变成什么,但是如果原始的开始角度= 169,结束= 293,则在红色的弧线上保持原始角度。

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

original width-scrunched height-scrunched

是否有人知道计算以确定新角度应该是什么?

2 个答案:

答案 0 :(得分: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')=新的结束角度

这种策略有意义吗?

答案 1 :(得分:1)

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

基本技术的工作原理如下:

  1. 计算未经破碎的端点的X和Y坐标
  2. 使用简单缩放对那些进行碾压,以获得所需端点的X和Y坐标
  3. 从那些工作回到角度
  4. 这涉及很多计算。您可以在该电子表格中进行操作,但以下是所有步骤:

    首先,我将您的角度转换为使用坐标几何约定 - 据我所知,您从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是结束角度(调整为“常规”角度)。我从Ellipses上的维基百科项目的标题为“相对于中心的极地形式”一节中得到了这个公式。该等式采用一个角度,并告诉您椭圆的半径将在该角度。

    接下来我用它来计算起点和终点的X和Y坐标。以下是Start 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的情况下)。是的,我把它颠倒了但是纠正了角度并不完全一致。 .sorry!

    接下来,我们计算了碾压的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度),并且对于超过该值的角度产生负值。采用模数360将其包装回正数。

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

    = 360 - B19
    

    在伸展的1.88 / 3.4尺寸范围内喂食,我们得到165.51和287.70度。这与你的数字并不完全一致,但我正在尝试找出你从那里得到的数据。它们是用眼睛完成的吗?以2.5 / 2.55喂养,我得到171.71和299.51。再次,与你的略有不同,但不是很多。