首页 文章

椭圆旋转不居中

提问于
浏览
2

我正在尝试绘制一个不在原点居中的旋转椭圆(在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是“bloc”的列表,它将被相同区域的椭圆取代 .

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

这是一个例子:我试图在顶部椭圆(E1)上设置一个点,该点位于E1的质心和第二个椭圆(E2)上的任何点之间绘制的线上 . 在这个例子中,点在E2上的角度约为220-230度 . 我能够 grab 这个角度,角度似乎没问题 .

case 1

问题是,如果我试图通过使用~225度的这个角度在E1上投射这一点,我最终会在第二个红色圆圈顶部 . 看起来我的角度现在是~265度,但事实上,如果我将量角器塑造成适合我的椭圆,我会得到正确的角度(~225),参见img 2)

case 2

在重新形状的量角器上看到角度有点难,但确实显示出~225度 .

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

有人能告诉我如何解决这个问题吗?

PS:要绘制那些椭圆,我只使用一个for循环,在每个角度绘制一个点(从0到360) . 我们在第一张照片上清楚地看到,无论我们处于0度还是90度,点之间的距离都是不同的 .

2 回答

  • 0

    你的参数化就是这样,圆是椭圆的情况,两个轴都是相等的 . 听起来你需要使用椭圆的合理表示而不是标准:https://en.m.wikipedia.org/wiki/Ellipse

  • 0

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

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

    • 焦点A和B到轴周围任意点之间的距离之和是恒定的(我们称之为E1的DE1) .

    • 然后我检查我的焦点和E2上的任何点之间的距离 . 如果该距离小于DE1,我将假定连接 .

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

    我会把它放在有需要的人身上 .

    弗洛

相关问题