#include <iostream>
#include <cmath>
#include <functional>
struct Point {
double x, y;
};
// 计算给定里程s的曲率
double curvature(double s, double k0, double k1, double L) {
return k0 + (k1 - k0) * s / L;
}
// 计算任意里程s的坐标
Point calculateCoordinates(double s, double k0, double k1, double L, double delta) {
int turnValue = 1.0;//左正右负
Point point = {0, 0}; // 假设起点坐标为(0, 0)
double theta = 0; // 起始角度为0
for (double currentS = 0; currentS <= s; currentS += delta) {
double currentCurvature = curvature(currentS, k0, k1, L);
theta += currentCurvature * delta * turnValue; // 更新转向角
point.x += delta * cos(theta); // 更新x坐标
point.y += delta * sin(theta); // 更新y坐标
}
return point;
}
int main() {
// 示例参数
double k0 = 0; // 起始曲率
double k1 = 0.01; // 结束曲率
double L = 100; // 缓和曲线总长度
double s = 50; // 计算里程为50的坐标
double delta = 0.01; // 计算精度
Point point = calculateCoordinates(s, k0, k1, L, delta);
std::cout << "Coordinates at s = " << s << ": (" << point.x << ", " << point.y << ")" << std::endl;
return 0;
}
不等长缓和曲线要素计算
已知两点坐标反算方位角
double calculateBearing(double x1, double y1, double x2, double y2)
{
double delta_x = x2 - x1;
double delta_y = y2 - y1;
//计算方位角,返回值-pi到pi
double theta_rad = atan2(delta_y, delta_x);
double theta_deg = theta_rad * (180.0 / M_PI);
double bearing;
if (theta_deg< 0)
bearing = theta_deg + 360;
return bearing;
}
竖曲线要素计算: