【问题标题】:Ellipse rotated not centered椭圆旋转不居中
【发布时间】:2018-05-28 11:54:16
【问题描述】:

我正在尝试绘制一个不以原点为中心的旋转椭圆(在 C++ 中)。

到目前为止,我的代码“有效”:

        for (double i = 0; i <= 360; i = i + 1) {

            theta = i*pi / 180;

            x = (polygonList[compt]->a_coeff / 2)  * sin(theta) + polygonList[compt]->centroid->datapointx;
            y = (polygonList[compt]->b_coeff / 2)  * cos(theta) + polygonList[compt]->centroid->datapointy;

            xTmp = (x - polygonList[compt]->centroid->datapointx)* cos(angle1) - (y - polygonList[compt]->centroid->datapointy)*sin(angle1) + polygonList[compt]->centroid->datapointx;
            yTmp = (x - polygonList[compt]->centroid->datapointx)* sin(angle1) + (y - polygonList[compt]->centroid->datapointy)*cos(angle1) + polygonList[compt]->centroid->datapointy;
      }

PolygonList 是一个“块”列表,将被相同区域的椭圆替换。

我的问题是角度不是很精确,好像我必须放置一个适合我椭圆形状的量角器,量角器显然会被挤压,角度也会被挤压(清楚吗? )

这是一个示例:我试图在顶部椭圆 (E1) 上设置一个点,该点位于 E1 的质心与第二个椭圆 (E2) 上的任何点之间的一条线上。在此示例中,E2 上的点位于约 220-230 度的角度。这个角度我能捕捉到,角度看起来还可以。

问题是,如果我尝试使用这个 ~225 度的角度将这个点投影到 E1 上,我最终会出现在顶部的第二个红色圆圈上。看起来我的角度现在是 ~265 度,但实际上,如果我将量角器调整为适合我的椭圆,我会得到正确的角度 (~225),cf img 2)

在重新塑造的量角器上看到角度有点困难,但它确实显示了 ~225 度。

我的结论是,椭圆的绘制就像我必须画一个圆然后我会压缩它,这会改变角度之间的距离。

谁能告诉我如何解决这个问题?

PS:为了绘制这些椭圆,我只使用了一个 for 循环,它在每个角度(从 0 到 360)绘制一个点。我们在第一张图片中清楚地看到,无论我们是在 0 度还是在 90 度,点之间的距离都是不同的。

【问题讨论】:

  • 你到底想在这里问什么?你是什​​么意思你的角度不正确 - 角度是正确的,你只是在看两个不同的定义。在一种情况下,您查看极角,而在另一种情况下,您正在考虑用于参数化椭圆的“角度”。但你似乎画一个旋转的椭圆就好了。
  • 抱歉,我的问题可能不清楚。我也很困惑,因为我对谈论几何并不是很有信心。我想我想问的是我应该如何为代表我的椭圆的每个点 360 点定义 X 和 Y。
  • 您似乎有 360 个点,它们只是在椭圆上的间距不均匀。你所拥有的到底有什么问题?
  • 理想情况下,我想要 360 点;它们中的每一个间隔 1 度角。在我的例子中,它们的间距不是 1 度弧
  • 我明白了,所以基本上你想在第一张图片中的椭圆线的交叉点上点点(可能更密集,但这是基本想法)?在那种情况下,也许这正是您应该尝试解决的问题?

标签: c++ angle ellipse


【解决方案1】:

您的参数化正是如此,圆是椭圆的情况,两个轴都相等。听起来您需要使用椭圆的有理表示而不是标准:https://en.m.wikipedia.org/wiki/Ellipse

【讨论】:

  • 好的,如果我真的很快实现有理表示,我会遇到同样的问题。
【解决方案2】:

所以,我问了上面的问题,以便我可以通过检查 E2 上的任何点与其在 E1 上的投影之间的距离来找到两个椭圆之间可能的重叠:如果 E1 的质心和投影点之间的距离E1 上的距离大于 E1 的质心到 E2 上的点之间的距离,我假设有重叠。我认为这个解决方案从未尝试过(或者我没有足够的搜索)并且应该可以正常工作。但在开始工作之前,我需要正确处理这些角度。

通过检查焦点,我找到了一种避免使用角度和投影点的方法:

  • 焦点 A 和 B 到围绕轴的任意点的距离之和是恒定的(我们将其称为 E1 的 DE1)。
  • 然后我检查我的焦点和 E2 上任意点之间的距离。如果该距离小于 DE1,我将假设连接。

到目前为止,它似乎工作正常:)

我会把它放在这里给有需要的人。

弗洛

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2022-01-01
    • 2015-10-03
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2017-08-31
    相关资源
    最近更新 更多