设R1为内径,n为圈数,d为圈距。
- 参数方程式如下:
- 极坐标方程如下:
- 计算长度可近似为:
- 举例证明
如果内半径为R1 = 5,并且每转弯处半径增加为d=0.81,圈数n = 7.5。
利用计算得:
而使用极坐标中曲线的弧长的公式来计算计算得:
两者近似相等。
- qt作图如下
- 源码
// create empty curve objects:
QCPCurve *fermatSpiral1 = new QCPCurve(m_customPlot->xAxis, m_customPlot->yAxis);
// set the same step between xAxis and yAxis
QCPAxisTickerFixed *ticker = new QCPAxisTickerFixed;
ticker->setTickStep(1);
m_customPlot->xAxis->setTicker(QSharedPointer<QCPAxisTicker>(ticker));
m_customPlot->yAxis->setTicker(QSharedPointer<QCPAxisTicker>(ticker));
// generate the curve data points:
const int pointCount = 500;
QVector<QCPCurveData> dataSpiral1(pointCount);
for (int i=0; i<pointCount; ++i)
{
double phi = i/(double)(pointCount-1);
double N = 7.5;//圈数
double d_Inner = 5;//内径
double d = 0.81;//圈距
double Dis =N*d*phi;//外径 - 内径
dataSpiral1[i] = QCPCurveData(i, (d_Inner + Dis)*qCos(N*phi*2*M_PI), (d_Inner + Dis)*qSin(N*phi*2*M_PI));
}
// pass the data to the curves; we know t (i in loop above) is ascending, so set alreadySorted=true (saves an extra internal sort):
fermatSpiral1->data()->set(dataSpiral1, true);
// color the curves:
fermatSpiral1->setPen(QPen(Qt::blue));