如何改变椭圆周围的速度

How to vary the velocity around an ellipse

我有一个 c++ 程序,它创建一个偏移量列表,对应于绕椭圆的遍历。我需要改变速度,以便更多时间(即更多产生的偏移量)靠近椭圆的远端。椭圆又长又瘦,我目前计算偏移的方法导致椭圆中心附近有更多偏移,这与我想要的相反。

代码:

// breathingPeriod, intervalMS, and yRadius are variables.
// Good defaults are: breathingPeriod = 5, intervalMs = 10, yRadius = 20
const int points = breathingPeriod * 1000 / intervalMS;
const double velocityCoeff = 360 / (breathingPeriod * 1000);
const zRadius = 3;
std::ofstream out("output.txt");


for(int i = 0; i < points; ++i)
{
    const int age = intervalMS * i;
    const uint64_t thetaDeg = static_cast<uint64_t>(age * velocityCoeff) % 360;
    const double thetaRad = thetaDeg * M_PI / 180.0;
    const double tanTheta = tan(thetaRad);
    double zOffset= (yRadius* zRadius) / sqrt(pow(yRadius, 2) + pow(zRadius, 2) * pow(tanTheta, 2));

    if(thetaRad > M_PI_2 && thetaRad <= 3 * M_PI_2)
    {
        zOffset = -zOffset;
    }
    const double yOffset = zOffset * tanTheta;
    double xOffset = 0;
    std::string str;
    str += std::to_string(xOffset) + " " + std::to_string(yOffset) + " " + std::to_string(zOffset) + "\n";

    out << str;
}
out.close;

我试过根据前一个角度的余弦值改变速度,但我还没有成功。

虽然运动类似于轨道,但它不需要遵循轨道的大部分规则。此外,输入参数与普通轨道力学方程完全不同,objective 是为单个物体随时间创建偏移量,而不是在给定观察者位置的情况下计算出大量物体的位置和一个恒星坐标数据库。

从你的问题来看,你似乎想要一种调整椭圆周围采样点间距的方法,而不是拥有一个生成轨道的特定物理系统。显然,如果你有一个由引力场定义的椭圆轨道,那么它的方程是 well known,并提供速度和位置之间作为时间函数的固定关系。

如果您想要的只是椭圆周围点的可调间距,那么实现此目的的一种方法就是让 "angle" 参数非线性变化,但仍能保证单调地覆盖范围 [0,2*pi]。假设您有一个覆盖范围 [0,2*pi] 的 "time" 坐标,但是您的 "angle" 由以下关系定义:

其中偏度参数 a 必须在 (-0.5, 0.5) 范围内,以确保角度不会在曲线上的任何点回溯。如果 a=0.3,这会产生这样的趋势:

其中曲线的梯度在 theta 是 pi 的倍数附近最陡,在 pi/2 的奇数倍附近最浅。

然后你的椭圆就可以用通常的方法生成了:

假设我们生成一个由 100 个点组成的序列,这些点在 t 中均匀分布,并从 a=0 开始,那么我们得到这样的配置文件:

如果我们将 a 增加到 0.2,我们会得到在 y 轴附近更紧密分组的点:

a 进一步增加到 0.48,我们得到更紧密的聚束:

在Python中,这可以通过如下方式实现:

import numpy

xRadius = 10
yRadius = 5
skew = 0.48

t = numpy.linspace(0, 2 * numpy.pi, 100)
theta = t + skew * numpy.sin(2*t)
x = xRadius * numpy.cos(theta)
y = yRadius * numpy.sin(theta)

显然,C++ 中相应的代码更冗长,但实现起来很简单。