C++ 椭圆旋转不居中

C++ 椭圆旋转不居中,c++,angle,ellipse,C++,Angle,Ellipse,我试图画一个旋转的椭圆,它不以原点为中心(在c++中) 到目前为止,我的代码“有效”: for(双i=0;i a_系数/2)*sin(θ)+polygonList[compt]->centroid->datapointx; y=(多线性列表[compt]>b_系数/2)*cos(θ)+多线性列表[compt]>centroid->datapointy; xTmp=(x-多边形列表[compt]->质心->数据点x)*cos(角度1)-(y-多边形列表[compt]->质心->数据点y)*sin(

我试图画一个旋转的椭圆,它不以原点为中心(在c++中)

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

for(双i=0;i a_系数/2)*sin(θ)+polygonList[compt]->centroid->datapointx;
y=(多线性列表[compt]>b_系数/2)*cos(θ)+多线性列表[compt]>centroid->datapointy;
xTmp=(x-多边形列表[compt]->质心->数据点x)*cos(角度1)-(y-多边形列表[compt]->质心->数据点y)*sin(角度1)+多边形列表[compt]->质心->数据点x;
yTmp=(x-多边形列表[compt]->质心->数据点x)*正弦(角度1)+(y-多边形列表[compt]->质心->数据点y)*科斯(角度1)+多边形列表[compt]->质心->数据点y;
}
PolygonList是一个“bloc”列表,它将被相同区域的椭圆替换

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

下面是一个例子:我试图在顶部椭圆(E1)上设置一个点,该点位于E1质心和第二个椭圆(E2)上任何点之间绘制的直线上。在这个例子中,E2上的点位于约220-230度的角度。我能抓住这个角度,这个角度看起来还可以

问题是,如果我试图用这个225度的角度将这一点投影到E1上,我最终会在顶部的第二个红色圆圈上。看起来我的角度现在是265度,但事实上,如果我把量角器做成适合椭圆的形状,我就得到了正确的角度(~225),cf img 2)

在重新成形的量角器上看角度有点困难,但它确实显示了225度

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

有人能告诉我怎么解决这个问题吗


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

您的参数化就是,圆是椭圆的一种情况,两个轴都相等。听起来您需要使用椭圆的有理表示而不是标准表示:

所以,我问了上面的问题,这样我就可以通过检查E2上的任意点与其在E1上的投影之间的距离来找到两个椭圆之间可能的重叠:如果E1的质心与E1上的投影点之间的距离大于E1的质心与E2上的点之间的距离,我将假设重叠。我认为这个解决方案从未被尝试过(或者我没有进行足够的搜索),应该可以很好地工作。但在工作之前,我需要把这些角度弄对

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

  • 焦点A和B到轴周围任意点的距离之和是恒定的(对于E1,我们称之为DE1)
  • 然后我检查我的焦点和E2上任何点之间的距离。如果这个距离小于DE1,我将假设一个连接
到目前为止,它似乎运作良好:)

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


Flo

你到底想问什么?你的角度不正确是什么意思?角度是正确的,你只是在看两个不同的定义。在一种情况下,你看极角,在另一种情况下,你想的是用来参数化椭圆的“角度”。但是你似乎画了一个旋转的椭圆,很好。对不起,我的问题可能不清楚。我也很困惑,因为我对谈论几何不太自信。我想我想问的是,我应该如何定义代表椭圆的360个点的X和Y。你似乎有360个点,它们在椭圆上的间隔不是均匀的。你的那些到底有什么问题?理想情况下,我想要360个点;它们每一个的间距为1度角。在我的例子中,它们的间距不是1度弧,所以基本上你希望在第一张图片中的线与椭圆的交点处有点(可能更密集,但这是基本想法)?在这种情况下,也许这正是你应该尝试解决的问题?好吧,如果我真的很快实现了rational表示,我会遇到同样的问题。
        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;
      }