如何改变椭圆周围的速度

时间:2018-03-19 14:36:37

标签: c++ math trigonometry

我有一个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;

我尝试过根据之前角度的cos来改变速度,但我还没有让它成功运作。

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

1 个答案:

答案 0 :(得分:1)

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

如果您想要的是椭圆周围的点的可调间距,那么您可以通过一种方式实现这一点,只需让您的“角度”参数非线性变化,但仍然可以保证单调覆盖范围[0,2 * pi]。假设您有一个覆盖[0,2 * pi]范围的“时间”坐标,但您的“角度”由以下关系定义:

enter image description here

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

enter image description here

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

然后可以通过常规配方生成椭圆:

enter image description here

假设我们在t中生成均匀间隔的100个点的序列,并以a=0开头,然后我们得到这样的个人资料:

enter image description here

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

enter image description here

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

enter image description here

在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 ++中相应的代码更详细,但实现起来很简单。