gpt4 book ai didi

形状计算算法(椭圆)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:48:54 27 4
gpt4 key购买 nike

我有 n 个圆圈,它们必须完美地围绕着一个椭圆,如下图所示:

Ellipse & Circles

在这张图片中,我需要找出椭圆周围每个圆的位置,并且还能够计算出完全适合这些周围圆的椭圆。

我知道的信息是每个圆的半径(都一样),以及圆的个数。

希望这次帖子是清楚的。感谢您的帮助。如果您需要更多解释,请告诉我。

最佳答案

好的,据我了解,您知道圆的公用半径 R0 及其编号 N,并且想知道椭圆内部的参数和所有元素的位置。

如果我们将椭圆转换为圆形,那么我们会得到:

const int N=12; // number of satelite circles
const double R=10.0; // radius of satelite circles
struct _circle { double x,y,r; } circle[N]; // satelite circles

int i;
double x,y,r,l,a,da;
x=0.0; // start pos of first satelite circle
y=0.0;
r=R;
l=r+r; // distance ang angle between satelite circle centers
a=0.0*deg;
da=divide(360.0*deg,N);
for (i=0;i<N;i++)
{
circle[i].x=x; x+=l*cos(a);
circle[i].y=y; y+=l*sin(a);
circle[i].r=r; a+=da;
}
// inside circle params
_circle c;
r=divide(0.5*l,sin(0.5*da))-R;
c.x=circle[i].x;
c.y=circle[i].y+R+r;
c.r=r;

Circle + circles

[编辑 1]

对于椭圆来说这是一个全新的挑战(我花了两个小时才找出所有的怪癖)

const int    N=20;      // number of satelite circles
const double R=10.0; // satelite circles radius
const double E= 0.7; // ellipse distortion ry=rx*E
struct _circle { double x,y,r; _circle() { x=0; y=0; r=0.0; } } circle[N];
struct _ellipse { double x,y,rx,ry; _ellipse() { x=0; y=0; rx=0.0; ry=0.0; } } ellipse;

int i,j,k;
double l,a,da,m,dm,x,y,q,r0;
l=double(N)*R; // circle cener lines polygon length
ellipse.x =0.0; // set ellipse parameters
ellipse.y =0.0;
r0=divide(l,M_PI*sqrt(0.5*(1.0+(E*E))))-R;// aprox radius to match ellipse length for start
l=R+R; l*=l;
m=1.0; dm=1.0; x=0.0;
for (k=0;k<5;k++) // aproximate ellipse size to the right size
{
dm=fabs(0.1*dm); // each k-iteration layer is 10x times more accurate
if (x>l) dm=-dm;
for (;;)
{
ellipse.rx=r0 *m;
ellipse.ry=r0*E*m;
for (a=0.0,i=0;i<N;i++) // set circle parameters
{
q=(2.0*a)-atanxy(cos(a),sin(a)*E);
circle[i].x=ellipse.x+(ellipse.rx*cos(a))+(R*cos(q));
circle[i].y=ellipse.y+(ellipse.ry*sin(a))+(R*sin(q));
circle[i].r=R;
da=divide(360*deg,N); a+=da;
for (j=0;j<5;j++) // aproximate next position to match 2R distance from current position
{
da=fabs(0.1*da); // each j-iteration layer is 10x times more accurate
q=(2.0*a)-atanxy(cos(a),sin(a)*E);
x=ellipse.x+(ellipse.rx*cos(a))+(R*cos(q))-circle[i].x; x*=x;
y=ellipse.y+(ellipse.ry*sin(a))+(R*sin(q))-circle[i].y; y*=y; x+=y;
if (x>l) for (;;) // if too far dec angle
{
a-=da;
q=(2.0*a)-atanxy(cos(a),sin(a)*E);
x=ellipse.x+(ellipse.rx*cos(a))+(R*cos(q))-circle[i].x; x*=x;
y=ellipse.y+(ellipse.ry*sin(a))+(R*sin(q))-circle[i].y; y*=y; x+=y;
if (x<=l) break;
}
else if (x<l) for (;;) // if too short inc angle
{
a+=da;
q=(2.0*a)-atanxy(cos(a),sin(a)*E);
x=ellipse.x+(ellipse.rx*cos(a))+(R*cos(q))-circle[i].x; x*=x;
y=ellipse.y+(ellipse.ry*sin(a))+(R*sin(q))-circle[i].y; y*=y; x+=y;
if (x>=l) break;
}
else break;
}
}
// check if last circle is joined as it should be
x=circle[N-1].x-circle[0].x; x*=x;
y=circle[N-1].y-circle[0].y; y*=y; x+=y;
if (dm>0.0) { if (x>=l) break; }
else { if (x<=l) break; }
m+=dm;
}
}

好吧,我知道它的代码有点乱,所以这里有一些信息:

  1. 首先尝试设置尽可能接近的椭圆 rx,ry 轴

    椭圆长度应约为 N*R*2这是圆心之间线的多边形长度

  2. 尝试组合圆圈,使它们相互接触并接触椭圆

    我为此使用椭圆角的迭代。问题是圆在它们的位置角上不接触椭圆,这就是为什么有 q 的原因。变量...以补偿椭圆法线。寻找图像中的金黄色线条

  3. 放置圆圈后检查最后一个是否接触第一个

    如果不插入椭圆的大小,它实际上会缩放 rx,ry通过 m向上或向下可变

  4. 您可以调整准确度

    通过更改j,k for s 和/或更改 dm,da比例因子

  5. 输入参数E应该至少是 0.5和最大值 1.0

    如果不是,那么很可能会错放圆圈,因为在非常偏心的椭圆上不可能拟合圆圈(如果 N 太低)。理想的设置是 0.7<=E<=1.0越接近 1 算法越安全

  6. atanxy(dx,dy)与 `atan(dy/dx)

    相同

    但它处理所有 4 个象限,如 atan2(dy,dx)通过符号分析dx,dy

Ellipse + circles

希望对你有帮助

关于形状计算算法(椭圆),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19556544/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com