feat:add speedL interface
@ -108,7 +108,6 @@ target_link_libraries(cmvr_es PRIVATE
|
|||||||
cmvr_es::proto
|
cmvr_es::proto
|
||||||
service
|
service
|
||||||
${GLOG_LIBRARIES}
|
${GLOG_LIBRARIES}
|
||||||
gflags
|
|
||||||
jsoncpp
|
jsoncpp
|
||||||
cmvr_es::utils
|
cmvr_es::utils
|
||||||
cmvr_es::service
|
cmvr_es::service
|
||||||
|
|||||||
@ -43,4 +43,9 @@ sudo apt-get install -y libx11-dev liblapack-dev libzbar-dev libpthread-stubs0-d
|
|||||||
sudo apt-get install -y \
|
sudo apt-get install -y \
|
||||||
libusb-1.0-0-dev libudev-dev \
|
libusb-1.0-0-dev libudev-dev \
|
||||||
libglu1-mesa-dev
|
libglu1-mesa-dev
|
||||||
|
|
||||||
|
# Matplot++
|
||||||
|
sudo apt install gnuplot-qt
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,6 @@ file(GLOB SRC
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/utils/ffmpeg/src/CameraCapture.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/utils/ffmpeg/src/CameraCapture.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/utils/ffmpeg/src/VideoFrameEncoder.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/utils/ffmpeg/src/VideoFrameEncoder.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/utils/ffmpeg/src/VideoWriter.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/utils/ffmpeg/src/VideoWriter.cpp
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/curve/src/s_curve.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/curve/src/s_curve.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -18,6 +17,7 @@ target_include_directories(common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
|||||||
|
|
||||||
target_link_libraries(common PUBLIC
|
target_link_libraries(common PUBLIC
|
||||||
cmvr_es::proto
|
cmvr_es::proto
|
||||||
|
glog
|
||||||
opencv_core
|
opencv_core
|
||||||
opencv_imgproc
|
opencv_imgproc
|
||||||
opencv_highgui
|
opencv_highgui
|
||||||
@ -31,18 +31,33 @@ target_link_libraries(common PUBLIC
|
|||||||
add_library(cmvr_es::common ALIAS common)
|
add_library(cmvr_es::common ALIAS common)
|
||||||
install(TARGETS common LIBRARY DESTINATION lib)
|
install(TARGETS common LIBRARY DESTINATION lib)
|
||||||
|
|
||||||
add_executable(image_display_test
|
#add_executable(image_display_test
|
||||||
utils/visualization/image_display_test.cpp
|
# utils/visualization/image_display_test.cpp
|
||||||
)
|
#)
|
||||||
|
#
|
||||||
target_link_libraries(image_display_test
|
#target_link_libraries(image_display_test
|
||||||
PRIVATE
|
# PRIVATE
|
||||||
cmvr_es::common
|
# cmvr_es::common
|
||||||
cmvr_es::perception
|
# cmvr_es::perception
|
||||||
cmvr_es::device::realsense_camera
|
# cmvr_es::device::realsense_camera
|
||||||
cmvr_es::proto
|
# cmvr_es::proto
|
||||||
glog
|
# glog
|
||||||
gtest
|
# gtest
|
||||||
gtest_main
|
# gtest_main
|
||||||
pthread
|
# pthread
|
||||||
)
|
#)
|
||||||
|
#
|
||||||
|
#add_executable(s_curve_test
|
||||||
|
# curve/src/s_curve_test.cpp
|
||||||
|
#)
|
||||||
|
#
|
||||||
|
#target_link_libraries(s_curve_test
|
||||||
|
# PRIVATE
|
||||||
|
# cmvr_es::common
|
||||||
|
# cmvr_es::proto
|
||||||
|
# glog
|
||||||
|
# gtest
|
||||||
|
# gtest_main
|
||||||
|
# pthread
|
||||||
|
# Matplot++::matplot
|
||||||
|
#)
|
||||||
|
|||||||
@ -3,9 +3,9 @@
|
|||||||
//
|
//
|
||||||
/**
|
/**
|
||||||
* @file s_curve.h
|
* @file s_curve.h
|
||||||
* @brief 标准 7 段式 S 曲线轨迹生成器(用于平滑运动控制)
|
* @brief 严格点到点位置 S 曲线轨迹生成器
|
||||||
*
|
*
|
||||||
* 实现标准 7 段式 S 曲线速度剖面:
|
* 实现标准 7 段式位置 S 曲线速度剖面:
|
||||||
* 1. 加加速度上升段(加速度逐渐增大)
|
* 1. 加加速度上升段(加速度逐渐增大)
|
||||||
* 2. 匀加速段
|
* 2. 匀加速段
|
||||||
* 3. 加加速度下降段(加速度逐渐降到 0)
|
* 3. 加加速度下降段(加速度逐渐降到 0)
|
||||||
@ -14,16 +14,13 @@
|
|||||||
* 6. 匀减速段
|
* 6. 匀减速段
|
||||||
* 7. 加加速度上升段(减速度逐渐降到 0)
|
* 7. 加加速度上升段(减速度逐渐降到 0)
|
||||||
*
|
*
|
||||||
* 特性:
|
* 本类只负责严格点到点 profile 规划与采样,不负责实时目标跟踪。
|
||||||
* - 支持摇杆等实时增量更新
|
|
||||||
* - 支持生成完整轨迹(用于 MoveIt 路径再参数化)
|
|
||||||
* - 支持配置 max_velocity / max_acceleration / max_jerk
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
@ -61,42 +58,19 @@ struct SCurveProfile
|
|||||||
double p0; // 初始位置
|
double p0; // 初始位置
|
||||||
double v0; // 初始速度
|
double v0; // 初始速度
|
||||||
double a0; // 初始加速度
|
double a0; // 初始加速度
|
||||||
|
double vf; // 终止速度
|
||||||
|
|
||||||
SCurveProfile()
|
SCurveProfile()
|
||||||
: t1(0), t2(0), t3(0), t4(0), t5(0), t6(0), t7(0)
|
: t1(0), t2(0), t3(0), t4(0), t5(0), t6(0), t7(0)
|
||||||
, total_time(0)
|
, total_time(0)
|
||||||
, j_max(50.0), a_max(10.0), v_max(3.0)
|
, j_max(50.0), a_max(10.0), v_max(3.0)
|
||||||
, distance(0), direction(1.0), v_cruise(0), a_limit(0)
|
, distance(0), direction(1.0), v_cruise(0), a_limit(0)
|
||||||
, p0(0), v0(0), a0(0)
|
, p0(0), v0(0), a0(0), vf(0)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 实时增量 S 曲线控制的状态量
|
* @brief 严格点到点位置 S 曲线规划器
|
||||||
*/
|
|
||||||
struct SCurveState
|
|
||||||
{
|
|
||||||
double position;
|
|
||||||
double velocity;
|
|
||||||
double acceleration;
|
|
||||||
double jerk;
|
|
||||||
|
|
||||||
// 目标跟踪
|
|
||||||
double target_position;
|
|
||||||
bool is_moving;
|
|
||||||
|
|
||||||
SCurveState()
|
|
||||||
: position(0), velocity(0), acceleration(0), jerk(0)
|
|
||||||
, target_position(0), is_moving(false)
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief S 曲线轨迹生成器
|
|
||||||
*
|
|
||||||
* 提供两种工作模式:
|
|
||||||
* 1. 实时模式:根据目标变化持续更新位置
|
|
||||||
* 2. 轨迹模式:针对给定位移生成完整轨迹
|
|
||||||
*/
|
*/
|
||||||
class SCurve
|
class SCurve
|
||||||
{
|
{
|
||||||
@ -121,68 +95,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
void getConstraints(double& max_velocity, double& max_acceleration, double& max_jerk) const;
|
void getConstraints(double& max_velocity, double& max_acceleration, double& max_jerk) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 使用当前状态初始化生成器
|
|
||||||
* @param position 当前位置
|
|
||||||
* @param velocity 当前速度(默认 0)
|
|
||||||
* @param acceleration 当前加速度(默认 0)
|
|
||||||
*/
|
|
||||||
void initialize(double position, double velocity = 0.0, double acceleration = 0.0);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 重置为初始状态
|
|
||||||
*/
|
|
||||||
void reset();
|
|
||||||
|
|
||||||
// ==================== 实时模式 ====================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 更新目标位置(实时模式)
|
|
||||||
* @param target_position 新目标位置
|
|
||||||
*/
|
|
||||||
void setTarget(double target_position);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 使用 S 曲线剖面计算下一步位置(实时模式)
|
|
||||||
* @param dt 时间步长(秒)
|
|
||||||
* @return 更新后的位置
|
|
||||||
*
|
|
||||||
* 本方法通过以下步骤实现实时 S 曲线控制:
|
|
||||||
* 1. 根据位置误差计算期望速度
|
|
||||||
* 2. 限制加速度变化(加加速度限制)
|
|
||||||
* 3. 限制加速度
|
|
||||||
* 4. 限制速度
|
|
||||||
* 5. 积分得到新的位置
|
|
||||||
*/
|
|
||||||
double update(double dt);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 获取当前状态
|
|
||||||
*/
|
|
||||||
const SCurveState& getState() const { return state_; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 获取当前位置
|
|
||||||
*/
|
|
||||||
double getPosition() const { return state_.position; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 获取当前速度
|
|
||||||
*/
|
|
||||||
double getVelocity() const { return state_.velocity; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 获取当前加速度
|
|
||||||
*/
|
|
||||||
double getAcceleration() const { return state_.acceleration; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 是否处于运动状态
|
|
||||||
*/
|
|
||||||
bool isMoving() const { return state_.is_moving; }
|
|
||||||
|
|
||||||
// ==================== 轨迹模式 ====================
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 计算点到点运动的完整 S 曲线剖面
|
* @brief 计算点到点运动的完整 S 曲线剖面
|
||||||
* @param start_position 起始位置
|
* @param start_position 起始位置
|
||||||
@ -218,6 +130,14 @@ public:
|
|||||||
*/
|
*/
|
||||||
double getAccelerationAtTime(const SCurveProfile& profile, double t) const;
|
double getAccelerationAtTime(const SCurveProfile& profile, double t) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 给定剖面下,获取时刻 t 的加加速度
|
||||||
|
* @param profile S 曲线剖面
|
||||||
|
* @param t 从起点开始的时间
|
||||||
|
* @return 时刻 t 的加加速度
|
||||||
|
*/
|
||||||
|
double getJerkAtTime(const SCurveProfile& profile, double t) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 按固定时间间隔生成轨迹点
|
* @brief 按固定时间间隔生成轨迹点
|
||||||
* @param profile S 曲线剖面
|
* @param profile S 曲线剖面
|
||||||
@ -232,71 +152,16 @@ public:
|
|||||||
std::vector<double>& accelerations) const;
|
std::vector<double>& accelerations) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// 运动约束
|
|
||||||
double max_velocity_;
|
double max_velocity_;
|
||||||
double max_acceleration_;
|
double max_acceleration_;
|
||||||
double max_jerk_;
|
double max_jerk_;
|
||||||
|
|
||||||
// 实时状态
|
|
||||||
SCurveState state_;
|
|
||||||
|
|
||||||
// 实时模式的位置跟踪增益
|
|
||||||
double position_gain_;
|
|
||||||
|
|
||||||
// 小量阈值
|
|
||||||
static constexpr double EPSILON = 1e-9;
|
static constexpr double EPSILON = 1e-9;
|
||||||
static constexpr double VELOCITY_THRESHOLD = 1e-6;
|
static constexpr double VELOCITY_THRESHOLD = 1e-6;
|
||||||
static constexpr double POSITION_THRESHOLD = 1e-7;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 在最大减速度约束下,计算减速到 0 的时间
|
|
||||||
*/
|
|
||||||
double calculateStoppingTime(double velocity, double acceleration) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 按 S 曲线减速剖面计算制动距离
|
|
||||||
*/
|
|
||||||
double calculateStoppingDistance(double velocity, double acceleration) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 计算带加加速度限制的加速度更新
|
|
||||||
*/
|
|
||||||
double computeJerkLimitedAcceleration(double current_acc, double desired_acc, double dt) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 判断所处的段并计算对应加加速度
|
|
||||||
*/
|
|
||||||
double computeSegmentJerk(const SCurveProfile& profile, double t) const;
|
double computeSegmentJerk(const SCurveProfile& profile, double t) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 计算短距离剖面(可能达不到最大速度)
|
|
||||||
*/
|
|
||||||
void calculateShortProfile(SCurveProfile& profile) const;
|
void calculateShortProfile(SCurveProfile& profile) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 计算长距离剖面(可达到最大速度)
|
|
||||||
*/
|
|
||||||
void calculateLongProfile(SCurveProfile& profile) const;
|
void calculateLongProfile(SCurveProfile& profile) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 将数值夹紧到指定范围
|
|
||||||
*/
|
|
||||||
static double clamp(double value, double min_val, double max_val)
|
|
||||||
{
|
|
||||||
return std::max(min_val, std::min(max_val, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 符号函数
|
|
||||||
*/
|
|
||||||
static double sign(double value)
|
|
||||||
{
|
|
||||||
if (value > EPSILON) return 1.0;
|
|
||||||
if (value < -EPSILON) return -1.0;
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace cmvr
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -15,15 +15,11 @@
|
|||||||
|
|
||||||
namespace cmvr
|
namespace cmvr
|
||||||
{
|
{
|
||||||
|
|
||||||
SCurve::SCurve(double max_velocity, double max_acceleration, double max_jerk)
|
SCurve::SCurve(double max_velocity, double max_acceleration, double max_jerk)
|
||||||
: max_velocity_(max_velocity)
|
: max_velocity_(std::abs(max_velocity))
|
||||||
, max_acceleration_(max_acceleration)
|
, max_acceleration_(std::abs(max_acceleration))
|
||||||
, max_jerk_(max_jerk)
|
, max_jerk_(std::abs(max_jerk))
|
||||||
, position_gain_(10.0) // 位置跟踪增益
|
{}
|
||||||
{
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SCurve::setConstraints(double max_velocity, double max_acceleration, double max_jerk)
|
void SCurve::setConstraints(double max_velocity, double max_acceleration, double max_jerk)
|
||||||
{
|
{
|
||||||
@ -39,201 +35,8 @@ void SCurve::getConstraints(double& max_velocity, double& max_acceleration, doub
|
|||||||
max_jerk = max_jerk_;
|
max_jerk = max_jerk_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SCurve::initialize(double position, double velocity, double acceleration)
|
|
||||||
{
|
|
||||||
state_.position = position;
|
|
||||||
state_.velocity = velocity;
|
|
||||||
state_.acceleration = acceleration;
|
|
||||||
state_.jerk = 0.0;
|
|
||||||
state_.target_position = position;
|
|
||||||
state_.is_moving = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SCurve::reset()
|
|
||||||
{
|
|
||||||
state_ = SCurveState();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SCurve::setTarget(double target_position)
|
|
||||||
{
|
|
||||||
state_.target_position = target_position;
|
|
||||||
}
|
|
||||||
|
|
||||||
double SCurve::update(double dt)
|
|
||||||
{
|
|
||||||
if (dt <= 0.0 || dt > 0.1) {
|
|
||||||
return state_.position;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 计算位置误差
|
|
||||||
double position_error = state_.target_position - state_.position;
|
|
||||||
|
|
||||||
// 判断是否已足够接近目标
|
|
||||||
if (std::abs(position_error) < POSITION_THRESHOLD &&
|
|
||||||
std::abs(state_.velocity) < VELOCITY_THRESHOLD) {
|
|
||||||
state_.velocity = 0.0;
|
|
||||||
state_.acceleration = 0.0;
|
|
||||||
state_.jerk = 0.0;
|
|
||||||
state_.is_moving = false;
|
|
||||||
state_.position = state_.target_position;
|
|
||||||
return state_.position;
|
|
||||||
}
|
|
||||||
|
|
||||||
state_.is_moving = true;
|
|
||||||
|
|
||||||
// ==================== S 曲线实时算法 ====================
|
|
||||||
// 通过加加速度限制实现实时 S 曲线控制
|
|
||||||
|
|
||||||
// Step 1:根据位置误差计算期望速度
|
|
||||||
// 使用比例控制并施加速度上限
|
|
||||||
double desired_velocity = position_gain_ * position_error;
|
|
||||||
desired_velocity = clamp(desired_velocity, -max_velocity_, max_velocity_);
|
|
||||||
|
|
||||||
// Step 2:根据当前速度估算制动距离(考虑 S 曲线减速剖面)
|
|
||||||
double stopping_distance = calculateStoppingDistance(state_.velocity, state_.acceleration);
|
|
||||||
|
|
||||||
// Step 3:判断是否需要开始减速
|
|
||||||
double direction = sign(position_error);
|
|
||||||
double velocity_direction = sign(state_.velocity);
|
|
||||||
|
|
||||||
// 如果正在远离目标,或距离不足以刹停,则需要减速
|
|
||||||
bool need_decelerate = false;
|
|
||||||
if (velocity_direction != 0 && velocity_direction != direction) {
|
|
||||||
// 运动方向错误:必须减速
|
|
||||||
need_decelerate = true;
|
|
||||||
} else if (std::abs(position_error) <= std::abs(stopping_distance) * 1.1) {
|
|
||||||
// 接近目标:提前开始减速(留 10% 裕量)
|
|
||||||
need_decelerate = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Step 4:计算期望加速度
|
|
||||||
double desired_acceleration;
|
|
||||||
if (need_decelerate) {
|
|
||||||
// 减速:加速度方向应与速度相反
|
|
||||||
if (std::abs(state_.velocity) < VELOCITY_THRESHOLD) {
|
|
||||||
desired_acceleration = 0.0;
|
|
||||||
} else {
|
|
||||||
desired_acceleration = -sign(state_.velocity) * max_acceleration_;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// 朝目标方向加速
|
|
||||||
double velocity_error = desired_velocity - state_.velocity;
|
|
||||||
desired_acceleration = clamp(velocity_error / dt, -max_acceleration_, max_acceleration_);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Step 5:施加加加速度限制(S 曲线平滑性的关键)
|
|
||||||
double new_acceleration = computeJerkLimitedAcceleration(
|
|
||||||
state_.acceleration, desired_acceleration, dt);
|
|
||||||
|
|
||||||
// Step 6:更新加加速度
|
|
||||||
state_.jerk = (new_acceleration - state_.acceleration) / dt;
|
|
||||||
|
|
||||||
// Step 7:更新加速度
|
|
||||||
state_.acceleration = new_acceleration;
|
|
||||||
|
|
||||||
// Step 8:在加速度限制下更新速度
|
|
||||||
double new_velocity = state_.velocity + state_.acceleration * dt;
|
|
||||||
new_velocity = clamp(new_velocity, -max_velocity_, max_velocity_);
|
|
||||||
state_.velocity = new_velocity;
|
|
||||||
|
|
||||||
// Step 9:更新位置
|
|
||||||
// 使用梯形积分提高精度
|
|
||||||
double avg_velocity = (state_.velocity + new_velocity) * 0.5;
|
|
||||||
state_.position += avg_velocity * dt;
|
|
||||||
|
|
||||||
// Step 10:非常接近目标且速度很小则直接夹紧到目标
|
|
||||||
if (std::abs(state_.target_position - state_.position) < POSITION_THRESHOLD * 10 &&
|
|
||||||
std::abs(state_.velocity) < VELOCITY_THRESHOLD * 10) {
|
|
||||||
state_.position = state_.target_position;
|
|
||||||
}
|
|
||||||
|
|
||||||
return state_.position;
|
|
||||||
}
|
|
||||||
|
|
||||||
double SCurve::calculateStoppingTime(double velocity, double acceleration) const
|
|
||||||
{
|
|
||||||
// 将加速度减到 0 所需时间
|
|
||||||
double t_jerk = std::abs(acceleration) / max_jerk_;
|
|
||||||
|
|
||||||
// 加加速度阶段的速度变化量
|
|
||||||
double v_change_jerk = 0.5 * std::abs(acceleration) * t_jerk;
|
|
||||||
|
|
||||||
// 加加速度阶段结束后的剩余速度
|
|
||||||
double v_remaining = std::abs(velocity) - v_change_jerk;
|
|
||||||
|
|
||||||
if (v_remaining <= 0) {
|
|
||||||
// 仅靠加加速度阶段即可停止
|
|
||||||
return std::sqrt(2.0 * std::abs(velocity) / max_jerk_);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 需要进入匀减速阶段
|
|
||||||
// 匀减速阶段持续时间
|
|
||||||
double t_const = v_remaining / max_acceleration_;
|
|
||||||
|
|
||||||
// 最后一个加加速度阶段:将加速度带回到 0
|
|
||||||
double t_jerk_final = max_acceleration_ / max_jerk_;
|
|
||||||
|
|
||||||
return t_jerk + t_const + t_jerk_final;
|
|
||||||
}
|
|
||||||
|
|
||||||
double SCurve::calculateStoppingDistance(double velocity, double acceleration) const
|
|
||||||
{
|
|
||||||
double v = std::abs(velocity);
|
|
||||||
double a = std::abs(acceleration);
|
|
||||||
|
|
||||||
if (v < VELOCITY_THRESHOLD) {
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 简化版 S 曲线制动距离估算
|
|
||||||
// 完整推导需要考虑 7 个阶段;实时控制中使用近似即可获得平滑减速效果
|
|
||||||
|
|
||||||
// 将加速度减到 0 的时间(加加速度阶段 1)
|
|
||||||
double t1 = a / max_jerk_;
|
|
||||||
double d1 = v * t1 + 0.5 * a * t1 * t1 - (1.0/6.0) * max_jerk_ * t1 * t1 * t1;
|
|
||||||
double v1 = v + a * t1 - 0.5 * max_jerk_ * t1 * t1;
|
|
||||||
|
|
||||||
if (v1 <= 0) {
|
|
||||||
// 在第一段加加速度阶段内停止
|
|
||||||
return std::abs(d1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 匀减速阶段
|
|
||||||
double t2 = (v1 - max_acceleration_ * max_acceleration_ / (2.0 * max_jerk_)) / max_acceleration_;
|
|
||||||
if (t2 < 0) t2 = 0;
|
|
||||||
double d2 = v1 * t2 - 0.5 * max_acceleration_ * t2 * t2;
|
|
||||||
double v2 = v1 - max_acceleration_ * t2;
|
|
||||||
|
|
||||||
// 最后一个加加速度阶段
|
|
||||||
double t3 = max_acceleration_ / max_jerk_;
|
|
||||||
double d3 = v2 * t3 - 0.5 * max_acceleration_ * t3 * t3 + (1.0/6.0) * max_jerk_ * t3 * t3 * t3;
|
|
||||||
|
|
||||||
double total_distance = d1 + d2 + d3;
|
|
||||||
|
|
||||||
// 增加安全裕量
|
|
||||||
return std::abs(total_distance) * 1.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
double SCurve::computeJerkLimitedAcceleration(double current_acc, double desired_acc, double dt) const
|
|
||||||
{
|
|
||||||
double acc_change = desired_acc - current_acc;
|
|
||||||
double max_acc_change = max_jerk_ * dt;
|
|
||||||
|
|
||||||
// 按加加速度上限夹紧加速度变化量
|
|
||||||
acc_change = clamp(acc_change, -max_acc_change, max_acc_change);
|
|
||||||
|
|
||||||
double new_acc = current_acc + acc_change;
|
|
||||||
|
|
||||||
// 同时夹紧加速度本身
|
|
||||||
new_acc = clamp(new_acc, -max_acceleration_, max_acceleration_);
|
|
||||||
|
|
||||||
return new_acc;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================== 轨迹模式实现 ====================
|
|
||||||
|
|
||||||
SCurveProfile SCurve::calculateProfile(double start_position, double end_position,
|
SCurveProfile SCurve::calculateProfile(double start_position, double end_position,
|
||||||
double start_velocity, double end_velocity [[maybe_unused]])
|
double start_velocity, double end_velocity)
|
||||||
{
|
{
|
||||||
SCurveProfile profile;
|
SCurveProfile profile;
|
||||||
profile.j_max = max_jerk_;
|
profile.j_max = max_jerk_;
|
||||||
@ -242,6 +45,7 @@ SCurveProfile SCurve::calculateProfile(double start_position, double end_positio
|
|||||||
profile.p0 = start_position;
|
profile.p0 = start_position;
|
||||||
profile.v0 = start_velocity;
|
profile.v0 = start_velocity;
|
||||||
profile.a0 = 0.0; // Assume starting from zero acceleration
|
profile.a0 = 0.0; // Assume starting from zero acceleration
|
||||||
|
profile.vf = end_velocity;
|
||||||
|
|
||||||
double displacement = end_position - start_position;
|
double displacement = end_position - start_position;
|
||||||
profile.distance = std::abs(displacement);
|
profile.distance = std::abs(displacement);
|
||||||
@ -253,32 +57,128 @@ SCurveProfile SCurve::calculateProfile(double start_position, double end_positio
|
|||||||
return profile;
|
return profile;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 达到最大加速度所需时间(加加速度阶段)
|
const double start_speed = profile.direction * start_velocity;
|
||||||
double t_j = profile.a_max / profile.j_max;
|
const double end_speed = profile.direction * end_velocity;
|
||||||
|
if (start_speed < -VELOCITY_THRESHOLD || end_speed < -VELOCITY_THRESHOLD) {
|
||||||
|
profile.total_time = 0.0;
|
||||||
|
return profile;
|
||||||
|
}
|
||||||
|
|
||||||
// 单个加加速度阶段获得的速度增量
|
if (std::abs(start_speed) > VELOCITY_THRESHOLD ||
|
||||||
double v_j = 0.5 * profile.j_max * t_j * t_j;
|
std::abs(end_speed) > VELOCITY_THRESHOLD) {
|
||||||
|
auto calc_transition = [&](double v_from, double v_to,
|
||||||
|
double& t_j, double& t_a,
|
||||||
|
double& duration, double& distance) {
|
||||||
|
t_j = 0.0;
|
||||||
|
t_a = 0.0;
|
||||||
|
duration = 0.0;
|
||||||
|
distance = 0.0;
|
||||||
|
|
||||||
// 加速阶段(含两个加加速度段)的位移
|
const double dv = std::abs(v_to - v_from);
|
||||||
// 假设能够达到最大加速度
|
if (dv <= 1e-12 || profile.a_max <= 1e-12 || profile.j_max <= 1e-12) {
|
||||||
double d_acc = v_j * t_j + profile.a_max * t_j * t_j + v_j;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 判断是否能达到最大速度
|
const double dv_switch = profile.a_max * profile.a_max / profile.j_max;
|
||||||
double v_acc = 2 * v_j; // Velocity gained during full acceleration phase
|
if (dv < dv_switch) {
|
||||||
|
t_j = std::sqrt(dv / profile.j_max);
|
||||||
if (v_acc >= profile.v_max) {
|
t_a = 0.0;
|
||||||
// 达不到最大加速度:三角形剖面
|
|
||||||
calculateShortProfile(profile);
|
|
||||||
} else {
|
} else {
|
||||||
// 判断是否能在半程之前达到最大速度
|
t_j = profile.a_max / profile.j_max;
|
||||||
double d_to_vmax = d_acc + (profile.v_max - v_acc) * (profile.v_max - v_acc) / (2.0 * profile.a_max);
|
t_a = dv / profile.a_max - t_j;
|
||||||
|
}
|
||||||
|
|
||||||
if (2.0 * d_to_vmax > profile.distance) {
|
duration = 2.0 * t_j + t_a;
|
||||||
// 达不到最大速度:梯形加速度剖面
|
distance = 0.5 * (v_from + v_to) * duration;
|
||||||
calculateShortProfile(profile);
|
};
|
||||||
|
|
||||||
|
const double v_cap = std::max({profile.v_max, start_speed, end_speed});
|
||||||
|
const double v_peak_min = std::max(start_speed, end_speed);
|
||||||
|
|
||||||
|
double acc_tj = 0.0, acc_ta = 0.0, acc_duration = 0.0, acc_distance = 0.0;
|
||||||
|
double dec_tj = 0.0, dec_ta = 0.0, dec_duration = 0.0, dec_distance = 0.0;
|
||||||
|
calc_transition(start_speed, v_peak_min,
|
||||||
|
acc_tj, acc_ta, acc_duration, acc_distance);
|
||||||
|
calc_transition(v_peak_min, end_speed,
|
||||||
|
dec_tj, dec_ta, dec_duration, dec_distance);
|
||||||
|
const double d_min = acc_distance + dec_distance;
|
||||||
|
if (profile.distance + EPSILON < d_min) {
|
||||||
|
profile.total_time = 0.0;
|
||||||
|
return profile;
|
||||||
|
}
|
||||||
|
|
||||||
|
calc_transition(start_speed, v_cap,
|
||||||
|
acc_tj, acc_ta, acc_duration, acc_distance);
|
||||||
|
calc_transition(v_cap, end_speed,
|
||||||
|
dec_tj, dec_ta, dec_duration, dec_distance);
|
||||||
|
const double d_cap = acc_distance + dec_distance;
|
||||||
|
|
||||||
|
double v_peak = v_cap;
|
||||||
|
double t4 = 0.0;
|
||||||
|
|
||||||
|
if (profile.distance > d_cap + EPSILON) {
|
||||||
|
t4 = (profile.distance - d_cap) / std::max(v_peak, EPSILON);
|
||||||
} else {
|
} else {
|
||||||
// 可达到最大速度:完整 S 曲线
|
double lo = v_peak_min;
|
||||||
|
double hi = v_cap;
|
||||||
|
for (int iter = 0; iter < 80; ++iter) {
|
||||||
|
const double mid = 0.5 * (lo + hi);
|
||||||
|
double mid_acc_tj = 0.0, mid_acc_ta = 0.0, mid_acc_duration = 0.0, mid_acc_distance = 0.0;
|
||||||
|
double mid_dec_tj = 0.0, mid_dec_ta = 0.0, mid_dec_duration = 0.0, mid_dec_distance = 0.0;
|
||||||
|
calc_transition(start_speed, mid,
|
||||||
|
mid_acc_tj, mid_acc_ta, mid_acc_duration, mid_acc_distance);
|
||||||
|
calc_transition(mid, end_speed,
|
||||||
|
mid_dec_tj, mid_dec_ta, mid_dec_duration, mid_dec_distance);
|
||||||
|
const double d_mid = mid_acc_distance + mid_dec_distance;
|
||||||
|
if (d_mid < profile.distance) {
|
||||||
|
lo = mid;
|
||||||
|
} else {
|
||||||
|
hi = mid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
v_peak = hi;
|
||||||
|
calc_transition(start_speed, v_peak,
|
||||||
|
acc_tj, acc_ta, acc_duration, acc_distance);
|
||||||
|
calc_transition(v_peak, end_speed,
|
||||||
|
dec_tj, dec_ta, dec_duration, dec_distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
profile.t1 = acc_tj;
|
||||||
|
profile.t2 = acc_ta;
|
||||||
|
profile.t3 = acc_tj;
|
||||||
|
profile.t4 = t4;
|
||||||
|
profile.t5 = dec_tj;
|
||||||
|
profile.t6 = dec_ta;
|
||||||
|
profile.t7 = dec_tj;
|
||||||
|
profile.v_cruise = v_peak;
|
||||||
|
profile.a_limit = std::max(profile.j_max * profile.t1, profile.j_max * profile.t5);
|
||||||
|
profile.total_time = profile.t1 + profile.t2 + profile.t3 + profile.t4 +
|
||||||
|
profile.t5 + profile.t6 + profile.t7;
|
||||||
|
return profile;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double j = profile.j_max;
|
||||||
|
const double a = profile.a_max;
|
||||||
|
const double v = profile.v_max;
|
||||||
|
const double t_j_a = a / j;
|
||||||
|
|
||||||
|
if (v < a * t_j_a) {
|
||||||
|
const double t_j_v = std::sqrt(v / j);
|
||||||
|
const double s_min = 2.0 * j * t_j_v * t_j_v * t_j_v;
|
||||||
|
if (profile.distance > s_min + EPSILON) {
|
||||||
calculateLongProfile(profile);
|
calculateLongProfile(profile);
|
||||||
|
} else {
|
||||||
|
calculateShortProfile(profile);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const double t_a_v = v / a - t_j_a;
|
||||||
|
const double s_half_v =
|
||||||
|
a * (t_j_a * t_j_a + 1.5 * t_j_a * t_a_v + 0.5 * t_a_v * t_a_v);
|
||||||
|
const double s_min = 2.0 * s_half_v;
|
||||||
|
if (profile.distance > s_min + EPSILON) {
|
||||||
|
calculateLongProfile(profile);
|
||||||
|
} else {
|
||||||
|
calculateShortProfile(profile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -287,24 +187,16 @@ SCurveProfile SCurve::calculateProfile(double start_position, double end_positio
|
|||||||
|
|
||||||
void SCurve::calculateShortProfile(SCurveProfile& profile) const
|
void SCurve::calculateShortProfile(SCurveProfile& profile) const
|
||||||
{
|
{
|
||||||
// 短距离情况下,可能达不到最大速度,甚至达不到最大加速度
|
// 短距离:无巡航段(t4 = 0),与 moveL_SCurveLocal 中的 SCurveProfile1D 保持一致。
|
||||||
// 使用对称剖面:t1=t3=t5=t7,t2=t6,t4=0
|
const double j = profile.j_max;
|
||||||
|
const double a = profile.a_max;
|
||||||
|
const double v = profile.v_max;
|
||||||
|
const double d = profile.distance;
|
||||||
|
const double t_j_a = a / j;
|
||||||
|
|
||||||
double j = profile.j_max;
|
if (v < a * t_j_a) {
|
||||||
double a = profile.a_max;
|
// 达不到 a_max:极短距离时只有 4 个 jerk 段。
|
||||||
// double v = profile.v_max; // 短剖面不会达到最大速度,因此不使用
|
const double t1 = std::cbrt(d / (2.0 * j));
|
||||||
double d = profile.distance;
|
|
||||||
|
|
||||||
// 达到最大加速度所需时间
|
|
||||||
double t_j = a / j;
|
|
||||||
|
|
||||||
// 判断是否能达到最大加速度
|
|
||||||
// 纯加加速度剖面(t1=t3,无匀加速)的位移
|
|
||||||
double d_jerk_only = j * t_j * t_j * t_j / 3.0;
|
|
||||||
|
|
||||||
if (d < 2.0 * d_jerk_only) {
|
|
||||||
// 极短距离:纯加加速度剖面
|
|
||||||
double t1 = std::cbrt(d * 1.5 / j);
|
|
||||||
profile.t1 = t1;
|
profile.t1 = t1;
|
||||||
profile.t2 = 0.0;
|
profile.t2 = 0.0;
|
||||||
profile.t3 = t1;
|
profile.t3 = t1;
|
||||||
@ -312,46 +204,36 @@ void SCurve::calculateShortProfile(SCurveProfile& profile) const
|
|||||||
profile.t5 = t1;
|
profile.t5 = t1;
|
||||||
profile.t6 = 0.0;
|
profile.t6 = 0.0;
|
||||||
profile.t7 = t1;
|
profile.t7 = t1;
|
||||||
profile.v_cruise = j * t1 * t1; // 峰值速度
|
profile.v_cruise = j * t1 * t1;
|
||||||
profile.a_limit = j * t1; // 峰值加速度
|
profile.a_limit = j * t1;
|
||||||
} else {
|
} else {
|
||||||
// 需要匀加速阶段
|
// 能达到 a_max,但达不到 v_max:求无巡航的匀加速持续时间。
|
||||||
// 在位移约束下求解 t1 与 t2
|
const double D = t_j_a * t_j_a + 4.0 * (d / a);
|
||||||
// d = 2 * (v_j * t_j + 0.5 * a * t_j^2 + a * t_a * t_j + 0.5 * a * t_a^2)
|
double t2 = (-3.0 * t_j_a + std::sqrt(std::max(0.0, D))) * 0.5;
|
||||||
|
|
||||||
profile.t1 = t_j;
|
|
||||||
profile.t3 = t_j;
|
|
||||||
profile.t5 = t_j;
|
|
||||||
profile.t7 = t_j;
|
|
||||||
|
|
||||||
// t1 结束时速度
|
|
||||||
double v1 = 0.5 * j * t_j * t_j;
|
|
||||||
|
|
||||||
// 4 个加加速度段覆盖的位移
|
|
||||||
double d_jerk = 4.0 * (v1 * t_j / 2.0 + j * t_j * t_j * t_j / 6.0);
|
|
||||||
|
|
||||||
// 匀加速/匀减速阶段的剩余位移
|
|
||||||
double d_const = d - d_jerk;
|
|
||||||
|
|
||||||
// 求解 t2(匀加速时间)
|
|
||||||
// 使用一元二次方程
|
|
||||||
double A = a;
|
|
||||||
double B = 2.0 * v1 + a * t_j;
|
|
||||||
double C = -d_const / 2.0;
|
|
||||||
|
|
||||||
double discriminant = B * B - 4.0 * A * C;
|
|
||||||
if (discriminant < 0) discriminant = 0;
|
|
||||||
|
|
||||||
double t2 = (-B + std::sqrt(discriminant)) / (2.0 * A);
|
|
||||||
if (t2 < 0) t2 = 0;
|
|
||||||
|
|
||||||
|
if (t2 < 0.0) {
|
||||||
|
const double t1 = std::cbrt(d / (2.0 * j));
|
||||||
|
profile.t1 = t1;
|
||||||
|
profile.t2 = 0.0;
|
||||||
|
profile.t3 = t1;
|
||||||
|
profile.t4 = 0.0;
|
||||||
|
profile.t5 = t1;
|
||||||
|
profile.t6 = 0.0;
|
||||||
|
profile.t7 = t1;
|
||||||
|
profile.v_cruise = j * t1 * t1;
|
||||||
|
profile.a_limit = j * t1;
|
||||||
|
} else {
|
||||||
|
profile.t1 = t_j_a;
|
||||||
profile.t2 = t2;
|
profile.t2 = t2;
|
||||||
|
profile.t3 = t_j_a;
|
||||||
|
profile.t4 = 0.0;
|
||||||
|
profile.t5 = t_j_a;
|
||||||
profile.t6 = t2;
|
profile.t6 = t2;
|
||||||
profile.t4 = 0.0; // No cruise phase
|
profile.t7 = t_j_a;
|
||||||
|
profile.v_cruise = a * (t2 + t_j_a);
|
||||||
profile.v_cruise = v1 + a * (t_j + t2);
|
|
||||||
profile.a_limit = a;
|
profile.a_limit = a;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
profile.total_time = profile.t1 + profile.t2 + profile.t3 + profile.t4 +
|
profile.total_time = profile.t1 + profile.t2 + profile.t3 + profile.t4 +
|
||||||
profile.t5 + profile.t6 + profile.t7;
|
profile.t5 + profile.t6 + profile.t7;
|
||||||
@ -359,46 +241,43 @@ void SCurve::calculateShortProfile(SCurveProfile& profile) const
|
|||||||
|
|
||||||
void SCurve::calculateLongProfile(SCurveProfile& profile) const
|
void SCurve::calculateLongProfile(SCurveProfile& profile) const
|
||||||
{
|
{
|
||||||
// 含巡航段的完整 7 段式 S 曲线
|
// 含巡航段的完整 7 段式 S 曲线;与 SCurveProfile1D 的 full-profile 公式一致。
|
||||||
double j = profile.j_max;
|
const double j = profile.j_max;
|
||||||
double a = profile.a_max;
|
const double a = profile.a_max;
|
||||||
double v = profile.v_max;
|
const double v = profile.v_max;
|
||||||
double d = profile.distance;
|
const double d = profile.distance;
|
||||||
|
const double t_j_a = a / j;
|
||||||
|
|
||||||
// 加加速度段持续时间
|
if (v < a * t_j_a) {
|
||||||
double t_j = a / j;
|
// 达不到 a_max,但可以达到 v_max 并进入巡航。
|
||||||
|
const double t_j_v = std::sqrt(v / j);
|
||||||
|
const double s_min = 2.0 * j * t_j_v * t_j_v * t_j_v;
|
||||||
|
profile.t1 = t_j_v;
|
||||||
|
profile.t2 = 0.0;
|
||||||
|
profile.t3 = t_j_v;
|
||||||
|
profile.t4 = std::max(0.0, (d - s_min) / v);
|
||||||
|
profile.t5 = t_j_v;
|
||||||
|
profile.t6 = 0.0;
|
||||||
|
profile.t7 = t_j_v;
|
||||||
|
profile.v_cruise = v;
|
||||||
|
profile.a_limit = j * t_j_v;
|
||||||
|
} else {
|
||||||
|
// 能达到 a_max 和 v_max。
|
||||||
|
const double t_a = v / a - t_j_a;
|
||||||
|
const double s_half =
|
||||||
|
a * (t_j_a * t_j_a + 1.5 * t_j_a * t_a + 0.5 * t_a * t_a);
|
||||||
|
const double s_min = 2.0 * s_half;
|
||||||
|
|
||||||
// 加速阶段加加速度段获得的速度增量
|
profile.t1 = t_j_a;
|
||||||
double v_j = 0.5 * j * t_j * t_j;
|
|
||||||
|
|
||||||
// 匀加速达到最大速度所需时间
|
|
||||||
double t_a = (v - 2.0 * v_j) / a;
|
|
||||||
if (t_a < 0) t_a = 0;
|
|
||||||
|
|
||||||
profile.t1 = t_j;
|
|
||||||
profile.t2 = t_a;
|
profile.t2 = t_a;
|
||||||
profile.t3 = t_j;
|
profile.t3 = t_j_a;
|
||||||
profile.t5 = t_j;
|
profile.t4 = std::max(0.0, (d - s_min) / v);
|
||||||
|
profile.t5 = t_j_a;
|
||||||
profile.t6 = t_a;
|
profile.t6 = t_a;
|
||||||
profile.t7 = t_j;
|
profile.t7 = t_j_a;
|
||||||
|
|
||||||
// 加速阶段(t1+t2+t3)覆盖的位移
|
|
||||||
double d_acc = v_j * t_j + 0.5 * a * t_j * t_j + // t1
|
|
||||||
(v_j + 0.5 * a * t_j) * t_a + 0.5 * a * t_a * t_a + // t2
|
|
||||||
(v_j + a * t_j + a * t_a) * t_j + 0.5 * a * t_j * t_j - j * t_j * t_j * t_j / 6.0; // t3
|
|
||||||
|
|
||||||
// 减速阶段对称
|
|
||||||
double d_dec = d_acc;
|
|
||||||
|
|
||||||
// 巡航段位移
|
|
||||||
double d_cruise = d - d_acc - d_dec;
|
|
||||||
if (d_cruise < 0) d_cruise = 0;
|
|
||||||
|
|
||||||
// 巡航段时间
|
|
||||||
profile.t4 = d_cruise / v;
|
|
||||||
|
|
||||||
profile.v_cruise = v;
|
profile.v_cruise = v;
|
||||||
profile.a_limit = a;
|
profile.a_limit = a;
|
||||||
|
}
|
||||||
|
|
||||||
profile.total_time = profile.t1 + profile.t2 + profile.t3 + profile.t4 +
|
profile.total_time = profile.t1 + profile.t2 + profile.t3 + profile.t4 +
|
||||||
profile.t5 + profile.t6 + profile.t7;
|
profile.t5 + profile.t6 + profile.t7;
|
||||||
@ -509,7 +388,7 @@ double SCurve::getPositionAtTime(const SCurveProfile& profile, double t) const
|
|||||||
double SCurve::getVelocityAtTime(const SCurveProfile& profile, double t) const
|
double SCurve::getVelocityAtTime(const SCurveProfile& profile, double t) const
|
||||||
{
|
{
|
||||||
if (t <= 0) return profile.v0;
|
if (t <= 0) return profile.v0;
|
||||||
if (t >= profile.total_time) return 0.0; // 假设末端静止
|
if (t >= profile.total_time) return profile.vf;
|
||||||
|
|
||||||
double j = profile.j_max * profile.direction;
|
double j = profile.j_max * profile.direction;
|
||||||
double v = profile.v0;
|
double v = profile.v0;
|
||||||
@ -616,6 +495,14 @@ double SCurve::getAccelerationAtTime(const SCurveProfile& profile, double t) con
|
|||||||
return a + j * (t - t_end6);
|
return a + j * (t - t_end6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double SCurve::getJerkAtTime(const SCurveProfile& profile, double t) const
|
||||||
|
{
|
||||||
|
if (t <= 0.0 || t >= profile.total_time) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
return computeSegmentJerk(profile, t);
|
||||||
|
}
|
||||||
|
|
||||||
void SCurve::generateTrajectory(const SCurveProfile& profile, double dt,
|
void SCurve::generateTrajectory(const SCurveProfile& profile, double dt,
|
||||||
std::vector<double>& positions,
|
std::vector<double>& positions,
|
||||||
std::vector<double>& velocities,
|
std::vector<double>& velocities,
|
||||||
@ -647,9 +534,9 @@ void SCurve::generateTrajectory(const SCurveProfile& profile, double dt,
|
|||||||
if (positions.empty() ||
|
if (positions.empty() ||
|
||||||
std::abs(positions.back() - (profile.p0 + profile.distance * profile.direction)) > EPSILON) {
|
std::abs(positions.back() - (profile.p0 + profile.distance * profile.direction)) > EPSILON) {
|
||||||
positions.push_back(profile.p0 + profile.distance * profile.direction);
|
positions.push_back(profile.p0 + profile.distance * profile.direction);
|
||||||
velocities.push_back(0.0);
|
velocities.push_back(profile.vf);
|
||||||
accelerations.push_back(0.0);
|
accelerations.push_back(0.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace el_a3_hardware
|
}
|
||||||
|
|||||||
@ -1,373 +0,0 @@
|
|||||||
#include "common/utils/visualization/image_display.h"
|
|
||||||
#include "common/utils/image/image_process.h"
|
|
||||||
#include "devices/camera/realsense_camera/include/realsense_camera.h"
|
|
||||||
#include "perception/include/tag_relative_target_3d.h"
|
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
#include <iostream>
|
|
||||||
#include <opencv2/imgproc.hpp>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
cv::Mat makeBlankImage(int width = 160, int height = 120) {
|
|
||||||
return cv::Mat(height, width, CV_8UC3, cv::Scalar(0, 0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr const char* kRsSerial = "243122074587";
|
|
||||||
constexpr double kTagSizeM = 0.01975;
|
|
||||||
constexpr int kRsWidth = 1280;
|
|
||||||
constexpr int kRsHeight = 720;
|
|
||||||
constexpr int kRsFps = 30;
|
|
||||||
constexpr int kTargetU = -1; // negative means image center
|
|
||||||
constexpr int kTargetV = -1; // negative means image center
|
|
||||||
constexpr int kDisplayFrames = 1200;
|
|
||||||
constexpr const char* kTrackingWindowName = "ImageDisplayTagTrackingTest";
|
|
||||||
|
|
||||||
int countNonZeroPixelsInRoi(const cv::Mat& image, const cv::Rect& roi) {
|
|
||||||
const cv::Rect image_rect(0, 0, image.cols, image.rows);
|
|
||||||
const cv::Rect clipped = roi & image_rect;
|
|
||||||
if (clipped.width <= 0 || clipped.height <= 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
cv::Mat gray;
|
|
||||||
cv::cvtColor(image(clipped), gray, cv::COLOR_BGR2GRAY);
|
|
||||||
return cv::countNonZero(gray);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool projectTargetToPixel(const Eigen::Vector3d& p_c,
|
|
||||||
const cmvr::device::Rs2Intrinsics& intrinsics,
|
|
||||||
cmvr::common::Pixel& pixel_out) {
|
|
||||||
Eigen::Vector2d uv = Eigen::Vector2d::Zero();
|
|
||||||
if (!cmvr::ImageProcess::projectCameraPointToPixel(intrinsics, p_c, uv)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
pixel_out.u = static_cast<int>(std::lround(uv.x()));
|
|
||||||
pixel_out.v = static_cast<int>(std::lround(uv.y()));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
TEST(OpenCvImageCvDisplayTest, RenderFailsWithoutImage) {
|
|
||||||
cmvr::common::OpenCvImageCvDisplay display;
|
|
||||||
|
|
||||||
cv::Mat rendered;
|
|
||||||
EXPECT_FALSE(display.render(rendered));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(OpenCvImageCvDisplayTest, RenderPointChangesCenterRegion) {
|
|
||||||
cmvr::common::OpenCvImageCvDisplay display;
|
|
||||||
display.setImage(makeBlankImage());
|
|
||||||
display.showPoint(cmvr::common::Pixel{60, 40},
|
|
||||||
cmvr::common::Color::red(),
|
|
||||||
5,
|
|
||||||
-1,
|
|
||||||
"target");
|
|
||||||
|
|
||||||
cv::Mat rendered;
|
|
||||||
ASSERT_TRUE(display.render(rendered));
|
|
||||||
ASSERT_FALSE(rendered.empty());
|
|
||||||
|
|
||||||
const cv::Vec3b center = rendered.at<cv::Vec3b>(40, 60);
|
|
||||||
EXPECT_GT(static_cast<int>(center[2]), 150);
|
|
||||||
EXPECT_LT(static_cast<int>(center[1]), 80);
|
|
||||||
EXPECT_LT(static_cast<int>(center[0]), 80);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(OpenCvImageCvDisplayTest, RenderCircleChangesExpectedArcRegion) {
|
|
||||||
cmvr::common::OpenCvImageCvDisplay display;
|
|
||||||
display.setImage(makeBlankImage());
|
|
||||||
display.showCircle(cmvr::common::Pixel{60, 40},
|
|
||||||
12,
|
|
||||||
cmvr::common::Color::yellow(),
|
|
||||||
2);
|
|
||||||
|
|
||||||
cv::Mat rendered;
|
|
||||||
ASSERT_TRUE(display.render(rendered));
|
|
||||||
ASSERT_FALSE(rendered.empty());
|
|
||||||
|
|
||||||
EXPECT_GT(countNonZeroPixelsInRoi(rendered, cv::Rect(58, 26, 5, 5)), 0);
|
|
||||||
EXPECT_EQ(countNonZeroPixelsInRoi(rendered, cv::Rect(59, 39, 3, 3)), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(OpenCvImageCvDisplayTest, RenderCrossChangesHorizontalAndVerticalArms) {
|
|
||||||
cmvr::common::OpenCvImageCvDisplay display;
|
|
||||||
display.setImage(makeBlankImage());
|
|
||||||
display.showCross(cmvr::common::Pixel{60, 40},
|
|
||||||
10,
|
|
||||||
cmvr::common::Color::blue(),
|
|
||||||
2);
|
|
||||||
|
|
||||||
cv::Mat rendered;
|
|
||||||
ASSERT_TRUE(display.render(rendered));
|
|
||||||
ASSERT_FALSE(rendered.empty());
|
|
||||||
|
|
||||||
EXPECT_GT(countNonZeroPixelsInRoi(rendered, cv::Rect(49, 39, 5, 3)), 0);
|
|
||||||
EXPECT_GT(countNonZeroPixelsInRoi(rendered, cv::Rect(59, 29, 3, 5)), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(OpenCvImageCvDisplayTest, RenderTextChangesRequestedRegion) {
|
|
||||||
cmvr::common::OpenCvImageCvDisplay display;
|
|
||||||
display.setImage(makeBlankImage());
|
|
||||||
|
|
||||||
cmvr::common::TextOverlay overlay;
|
|
||||||
overlay.text = "tracked tag: 7";
|
|
||||||
overlay.position_px = cmvr::common::Pixel{10, 30};
|
|
||||||
overlay.color = cmvr::common::Color::white();
|
|
||||||
overlay.draw_background = true;
|
|
||||||
|
|
||||||
display.showText(overlay);
|
|
||||||
|
|
||||||
cv::Mat rendered;
|
|
||||||
ASSERT_TRUE(display.render(rendered));
|
|
||||||
ASSERT_FALSE(rendered.empty());
|
|
||||||
|
|
||||||
EXPECT_GT(countNonZeroPixelsInRoi(rendered, cv::Rect(5, 5, 120, 35)), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(OpenCvImageCvDisplayTest, ClearOverlaysRemovesAllRenderedGeometry) {
|
|
||||||
cmvr::common::OpenCvImageCvDisplay display;
|
|
||||||
display.setImage(makeBlankImage());
|
|
||||||
display.showPoint(cmvr::common::Pixel{60, 40},
|
|
||||||
cmvr::common::Color::red(),
|
|
||||||
5,
|
|
||||||
-1,
|
|
||||||
"target");
|
|
||||||
display.showCircle(cmvr::common::Pixel{60, 40},
|
|
||||||
12,
|
|
||||||
cmvr::common::Color::yellow(),
|
|
||||||
2);
|
|
||||||
display.showCross(cmvr::common::Pixel{60, 40},
|
|
||||||
10,
|
|
||||||
cmvr::common::Color::blue(),
|
|
||||||
2);
|
|
||||||
display.showText("tracked tag: 7",
|
|
||||||
cmvr::common::Pixel{10, 30},
|
|
||||||
cmvr::common::Color::white(),
|
|
||||||
0.7,
|
|
||||||
2);
|
|
||||||
|
|
||||||
display.clearOverlays();
|
|
||||||
|
|
||||||
cv::Mat rendered;
|
|
||||||
ASSERT_TRUE(display.render(rendered));
|
|
||||||
ASSERT_FALSE(rendered.empty());
|
|
||||||
EXPECT_EQ(countNonZeroPixelsInRoi(rendered, cv::Rect(0, 0, rendered.cols, rendered.rows)), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(OpenCvImageCvDisplayTest, ShowDisplaysWindowIfHighGuiIsAvailable) {
|
|
||||||
constexpr const char* kWindowName = "OpenCvImageCvDisplayTest";
|
|
||||||
cmvr::common::OpenCvImageCvDisplay display(kWindowName);
|
|
||||||
|
|
||||||
bool window_enabled = true;
|
|
||||||
try {
|
|
||||||
cv::namedWindow(kWindowName, cv::WINDOW_NORMAL);
|
|
||||||
cv::imshow(kWindowName, cv::Mat(120, 160, CV_8UC3, cv::Scalar(20, 20, 20)));
|
|
||||||
cv::waitKey(1);
|
|
||||||
} catch (const cv::Exception& e) {
|
|
||||||
window_enabled = false;
|
|
||||||
std::cout << "[OpenCvImageCvDisplayTest] window disabled: " << e.what() << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!window_enabled) {
|
|
||||||
GTEST_SKIP() << "OpenCV highgui is not available, skip windowed test.";
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int frame = 0; frame < 1200; ++frame) {
|
|
||||||
cv::Mat image(240, 320, CV_8UC3, cv::Scalar(20, 20, 20));
|
|
||||||
display.setImage(image);
|
|
||||||
display.clearOverlays();
|
|
||||||
|
|
||||||
const int center_u = 80 + frame;
|
|
||||||
const int center_v = 120;
|
|
||||||
|
|
||||||
display.showPoint(cmvr::common::Pixel{center_u, center_v},
|
|
||||||
cmvr::common::Color::red(),
|
|
||||||
5,
|
|
||||||
-1,
|
|
||||||
"target");
|
|
||||||
display.showCircle(cmvr::common::Pixel{center_u, center_v},
|
|
||||||
18,
|
|
||||||
cmvr::common::Color::yellow(),
|
|
||||||
2);
|
|
||||||
display.showCross(cmvr::common::Pixel{center_u, center_v},
|
|
||||||
10,
|
|
||||||
cmvr::common::Color::blue(),
|
|
||||||
2);
|
|
||||||
display.showText("tracked tag: 7",
|
|
||||||
cmvr::common::Pixel{20, 30},
|
|
||||||
cmvr::common::Color::white(),
|
|
||||||
0.8,
|
|
||||||
2);
|
|
||||||
|
|
||||||
const int key = display.show(30);
|
|
||||||
if (key == 27 || key == 'q' || key == 'Q') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
display.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(OpenCvImageCvDisplayTest, ShowTrackingImageWithActiveTagAndTargetPoint) {
|
|
||||||
const std::string serial = kRsSerial;
|
|
||||||
if (serial.empty()) {
|
|
||||||
GTEST_SKIP() << "kRsSerial is empty, please set it in image_display_test.cpp";
|
|
||||||
}
|
|
||||||
|
|
||||||
cmvr::config::RealSenseCameraConfig cam_cfg;
|
|
||||||
cam_cfg.set_id("image_display_test");
|
|
||||||
cam_cfg.set_serialnumber(serial);
|
|
||||||
cam_cfg.set_width(kRsWidth);
|
|
||||||
cam_cfg.set_height(kRsHeight);
|
|
||||||
cam_cfg.set_fps(kRsFps);
|
|
||||||
cam_cfg.set_codec("H265");
|
|
||||||
cam_cfg.set_camera_mode(cmvr::config::CAMERA_MODE_PHOTO);
|
|
||||||
cam_cfg.set_stream_mode(cmvr::config::STREAM_MODE_RGBD);
|
|
||||||
cam_cfg.set_align_mode(cmvr::config::ALIGN_MODE_COLOR);
|
|
||||||
cam_cfg.set_buffer_size(30);
|
|
||||||
cam_cfg.set_sync(true);
|
|
||||||
cam_cfg.set_enable(true);
|
|
||||||
|
|
||||||
auto camera = std::make_shared<cmvr::device::RealsenseCamera>(cam_cfg);
|
|
||||||
auto perception = std::make_shared<cmvr::perception::AprilTagPerception>(camera);
|
|
||||||
perception->setTagSize(kTagSizeM);
|
|
||||||
|
|
||||||
cmvr::perception::TagRelativeTarget3D tracker(perception);
|
|
||||||
tracker.setTargetPointMethod(cmvr::perception::TagRelativeTarget3D::TargetPointMethod::TAG_PLANE);
|
|
||||||
tracker.setActiveTagSwitchPolicy(4, 1.2);
|
|
||||||
tracker.setTrackingCandidateScoreWeights(1.0, 2.0, 0.08);
|
|
||||||
|
|
||||||
cmvr::perception::AprilTagPerception::Options opt;
|
|
||||||
opt.depth_policy = cmvr::perception::AprilTagPerception::DepthPolicy::NONE;
|
|
||||||
opt.detect_tags = true;
|
|
||||||
|
|
||||||
ASSERT_NO_THROW(camera->init());
|
|
||||||
ASSERT_NO_THROW(camera->start());
|
|
||||||
struct CameraStopGuard {
|
|
||||||
std::shared_ptr<cmvr::device::RealsenseCamera> cam;
|
|
||||||
~CameraStopGuard() {
|
|
||||||
if (!cam) return;
|
|
||||||
try {
|
|
||||||
cam->stop();
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} stop_guard{camera};
|
|
||||||
|
|
||||||
cmvr::common::OpenCvImageCvDisplay display(kTrackingWindowName);
|
|
||||||
bool window_enabled = true;
|
|
||||||
try {
|
|
||||||
cv::namedWindow(kTrackingWindowName, cv::WINDOW_NORMAL);
|
|
||||||
cv::resizeWindow(kTrackingWindowName, kRsWidth, kRsHeight);
|
|
||||||
cv::imshow(kTrackingWindowName,
|
|
||||||
cv::Mat(kRsHeight, kRsWidth, CV_8UC3, cv::Scalar(20, 20, 20)));
|
|
||||||
cv::waitKey(1);
|
|
||||||
} catch (const cv::Exception& e) {
|
|
||||||
window_enabled = false;
|
|
||||||
std::cout << "[OpenCvImageCvDisplayTest] window disabled: " << e.what() << "\n";
|
|
||||||
}
|
|
||||||
if (!window_enabled) {
|
|
||||||
GTEST_SKIP() << "OpenCV highgui is not available, skip windowed test.";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool target_uv_initialized = false;
|
|
||||||
int target_u = kTargetU;
|
|
||||||
int target_v = kTargetV;
|
|
||||||
bool target_locked = false;
|
|
||||||
|
|
||||||
for (int frame = 0; frame < kDisplayFrames; ++frame) {
|
|
||||||
const bool update_ok = perception->update(opt);
|
|
||||||
const cv::Mat& color = perception->color();
|
|
||||||
|
|
||||||
cv::Mat display_image = color.empty()
|
|
||||||
? cv::Mat(kRsHeight, kRsWidth, CV_8UC3, cv::Scalar(20, 20, 20))
|
|
||||||
: color;
|
|
||||||
display.setImage(display_image);
|
|
||||||
display.clearOverlays();
|
|
||||||
|
|
||||||
if (!target_uv_initialized && !display_image.empty()) {
|
|
||||||
target_u = (kTargetU >= 0) ? kTargetU : (display_image.cols / 2);
|
|
||||||
target_v = (kTargetV >= 0) ? kTargetV : (display_image.rows / 2);
|
|
||||||
target_uv_initialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target_uv_initialized) {
|
|
||||||
const cmvr::common::Pixel selected_px{target_u, target_v};
|
|
||||||
display.showCross(selected_px, 10, cmvr::common::Color::yellow(), 2);
|
|
||||||
display.showCircle(selected_px, 14, cmvr::common::Color::yellow(), 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool tracker_ok = false;
|
|
||||||
if (target_uv_initialized && !color.empty()) {
|
|
||||||
if (!target_locked) {
|
|
||||||
tracker_ok = tracker.startTrackingFromPixel(target_u, target_v);
|
|
||||||
target_locked = tracker_ok;
|
|
||||||
} else {
|
|
||||||
tracker_ok = tracker.track();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tracker_ok) {
|
|
||||||
cmvr::common::Pixel target_px{};
|
|
||||||
if (projectTargetToPixel(tracker.lastTargetInCamera(), perception->intrinsics(), target_px)) {
|
|
||||||
display.showPoint(target_px,
|
|
||||||
cmvr::common::Color::red(),
|
|
||||||
5,
|
|
||||||
-1,
|
|
||||||
"target");
|
|
||||||
display.showCircle(target_px, 18, cmvr::common::Color::red(), 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
display.showText("active tag: " + std::to_string(tracker.activeTagId()),
|
|
||||||
cmvr::common::Pixel{20, 30},
|
|
||||||
cmvr::common::Color::white(),
|
|
||||||
0.8,
|
|
||||||
2);
|
|
||||||
display.showText("perception: " +
|
|
||||||
std::string(cmvr::perception::AprilTagPerception::statusToString(
|
|
||||||
perception->lastStatus())),
|
|
||||||
cmvr::common::Pixel{20, 60},
|
|
||||||
cmvr::common::Color::white(),
|
|
||||||
0.7,
|
|
||||||
2);
|
|
||||||
display.showText("tracker: " +
|
|
||||||
std::string(cmvr::perception::TagRelativeTarget3D::statusToString(
|
|
||||||
tracker.lastStatus())),
|
|
||||||
cmvr::common::Pixel{20, 90},
|
|
||||||
cmvr::common::Color::white(),
|
|
||||||
0.7,
|
|
||||||
2);
|
|
||||||
display.showText("tags: " + std::to_string(perception->tags().size()) +
|
|
||||||
" frame_ok: " + std::string(update_ok ? "true" : "false"),
|
|
||||||
cmvr::common::Pixel{20, 120},
|
|
||||||
cmvr::common::Color::white(),
|
|
||||||
0.7,
|
|
||||||
2);
|
|
||||||
|
|
||||||
if (tracker_ok) {
|
|
||||||
const Eigen::Vector3d& p_c_target = tracker.lastTargetInCamera();
|
|
||||||
display.showText("target_c: [" +
|
|
||||||
std::to_string(p_c_target.x()) + ", " +
|
|
||||||
std::to_string(p_c_target.y()) + ", " +
|
|
||||||
std::to_string(p_c_target.z()) + "]",
|
|
||||||
cmvr::common::Pixel{20, 150},
|
|
||||||
cmvr::common::Color::white(),
|
|
||||||
0.6,
|
|
||||||
2);
|
|
||||||
}
|
|
||||||
|
|
||||||
const int key = display.show(1);
|
|
||||||
if (key == 27 || key == 'q' || key == 'Q') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
display.close();
|
|
||||||
}
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
#include "controller/include/ibvs_controller.h"
|
#include "controller/include/ibvs_controller.h"
|
||||||
|
|
||||||
#include "common/utils/image/image_process.h"
|
#include "common/utils/image/image_process.h"
|
||||||
#include "common/utils/math/support_functions.h"
|
#include "common/math/include/support_functions.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
#include "motor/ti5_motor/ti5_motor.h"
|
#include "motor/ti5_motor/ti5_motor.h"
|
||||||
#include "../../../../utils/base/include/abstract_interpolation.h"
|
#include "../../../../utils/base/include/abstract_interpolation.h"
|
||||||
#include "data_center/include/motors_info.h"
|
#include "data_center/include/motors_info.h"
|
||||||
#include "common/utils/math/support_functions.h"
|
#include "common/math/include/support_functions.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace cmvr::device;
|
using namespace cmvr::device;
|
||||||
|
|||||||
@ -20,6 +20,7 @@ target_link_libraries(ik_solver PUBLIC
|
|||||||
pinocchio_default
|
pinocchio_default
|
||||||
pinocchio_parsers
|
pinocchio_parsers
|
||||||
pinocchio_collision
|
pinocchio_collision
|
||||||
|
cmvr_es::planner
|
||||||
cmvr_es::common
|
cmvr_es::common
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -46,6 +47,7 @@ target_link_libraries(srs_ik_test
|
|||||||
gtest_main
|
gtest_main
|
||||||
pthread
|
pthread
|
||||||
glog
|
glog
|
||||||
|
matplot
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <Eigen/Core>
|
#include <Eigen/Core>
|
||||||
#include "common/utils/math/support_functions.h"
|
#include "common/math/include/support_functions.h"
|
||||||
|
|
||||||
namespace cmvr {
|
namespace cmvr {
|
||||||
class JointsLimitAnalyzer {
|
class JointsLimitAnalyzer {
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "common/utils/math/support_functions.h"
|
#include "common/math/include/support_functions.h"
|
||||||
|
|
||||||
namespace cmvr {
|
namespace cmvr {
|
||||||
class OptPsiSelector {
|
class OptPsiSelector {
|
||||||
|
|||||||
@ -1,14 +1,16 @@
|
|||||||
// Created by lgv on 11/28/25.
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "ik_solver/include/pinocchio_ik_base.h"
|
#include "ik_solver/include/pinocchio_ik_base.h"
|
||||||
|
|
||||||
|
|
||||||
#include <Eigen/Core>
|
#include <Eigen/Core>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "cartesian_space_planner/include/cartesian_twist_limiter.h"
|
||||||
|
|
||||||
namespace cmvr {
|
namespace cmvr {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -16,26 +18,35 @@ namespace cmvr {
|
|||||||
*
|
*
|
||||||
* 提供以下能力:
|
* 提供以下能力:
|
||||||
* - 位姿 IK(`ik`)
|
* - 位姿 IK(`ik`)
|
||||||
* - 正运动学 FK(`fk`)
|
* - 正运动学 FK(`fk`,继承自基类)
|
||||||
* - 末端 twist 到关节速度的微分 IK(`ik` 重载)
|
* - 末端 twist 到关节速度的微分 IK(`ik` 重载)
|
||||||
* - 直线 MoveL(S 曲线标量规划 + 局部系微分 IK)
|
* - 直线 MoveL(S 曲线标量规划 + 局部系微分 IK)
|
||||||
|
* - speedL(基于 CartesianTwistLimiter + DLS 微分 IK)
|
||||||
*
|
*
|
||||||
* 求解链路由 URDF 中 `base_frame_name -> flange_frame_name` 自动提取,
|
* 求解链路由 URDF 中 `base_frame_name -> flange_frame_name` 自动提取,
|
||||||
* 并支持可选 TCP frame。
|
* 并支持可选 TCP frame。
|
||||||
*/
|
*/
|
||||||
class PinocchioDlsIKSolver : public PinocchioIKBase {
|
class PinocchioDlsIKSolver : public PinocchioIKBase {
|
||||||
public:
|
public:
|
||||||
/**
|
struct SpeedLConfig {
|
||||||
* @brief 构造 `PinocchioDlsIKSolver`。
|
double linear_velocity_max{0.25};
|
||||||
* @param urdf_path URDF 文件路径。
|
double linear_acceleration_max{0.8};
|
||||||
* @param base_frame_name 机械臂基座 frame 名称。
|
double linear_jerk_max{4.0};
|
||||||
* @param flange_frame_name 机械臂法兰 frame 名称。
|
|
||||||
* @param tcp_frame_name TCP frame 名称;为空表示不使用 TCP。
|
double angular_velocity_max{1.0};
|
||||||
* @param max_iters IK 最大迭代次数。
|
double angular_acceleration_max{3.0};
|
||||||
* @param pos_eps 平移收敛阈值(m)。
|
double angular_jerk_max{15.0};
|
||||||
* @param rot_eps 旋转收敛阈值(rad)。
|
|
||||||
* @param damping DLS 阻尼系数,建议默认值大于 `1e-6` 以提升稳定性。
|
std::vector<double> joint_velocity_max; ///< size=chain_v_dof_,为空则仅用 URDF limit
|
||||||
*/
|
std::vector<double> joint_acceleration_max; ///< size=chain_v_dof_,为空则不做 joint accel 限制
|
||||||
|
|
||||||
|
double linear_target_replan_threshold{1e-4};
|
||||||
|
double angular_target_replan_threshold{1e-4};
|
||||||
|
|
||||||
|
double linear_reverse_cos_threshold{-0.8660254037844386}; // cos(150deg)
|
||||||
|
double linear_reverse_switch_speed_threshold{1e-3};
|
||||||
|
};
|
||||||
|
|
||||||
PinocchioDlsIKSolver(const std::string &urdf_path,
|
PinocchioDlsIKSolver(const std::string &urdf_path,
|
||||||
const std::string &base_frame_name,
|
const std::string &base_frame_name,
|
||||||
const std::string &flange_frame_name,
|
const std::string &flange_frame_name,
|
||||||
@ -43,85 +54,32 @@ public:
|
|||||||
int max_iters = 100,
|
int max_iters = 100,
|
||||||
double pos_eps = 1e-6,
|
double pos_eps = 1e-6,
|
||||||
double rot_eps = 1e-6,
|
double rot_eps = 1e-6,
|
||||||
double damping = 1e-4); // 建议默认比 1e-6 大点更稳
|
double damping = 1e-4);
|
||||||
|
|
||||||
~PinocchioDlsIKSolver() override = default;
|
~PinocchioDlsIKSolver() override = default;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 初始化求解器(加载 URDF、提取链路、缓存限位与基座位姿)。
|
|
||||||
* @return 成功返回 `true`,失败返回 `false`。
|
|
||||||
*/
|
|
||||||
bool init() override;
|
bool init() override;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 位姿 IK 求解。
|
|
||||||
* @param target_pose base 坐标系下目标位姿。
|
|
||||||
* @param joints_angle 输出关节角(链空间)。
|
|
||||||
* @param is_tcp 为 `true` 时以 TCP 为末端,否则以 flange 为末端。
|
|
||||||
* @return 成功返回 `true`,失败返回 `false`。
|
|
||||||
*/
|
|
||||||
bool ik(const Eigen::Matrix4d &target_pose,
|
bool ik(const Eigen::Matrix4d &target_pose,
|
||||||
std::vector<double> &joints_angle,
|
std::vector<double> &joints_angle,
|
||||||
bool is_tcp = true) override;
|
bool is_tcp = true) override;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 位姿 IK 求解(显式指定 base_link 与 ee_link)。
|
|
||||||
*
|
|
||||||
* 约束:`base_link` 与 `ee_link` 必须位于初始化单一链(base->tip)
|
|
||||||
* 对应分支内,且 `base_link` 需是 `ee_link` 的祖先(或同一 link)。
|
|
||||||
*
|
|
||||||
* @param base_link 基座 frame 名称(目标位姿参考系)。
|
|
||||||
* @param ee_link 末端 frame 名称。
|
|
||||||
* @param target_pose `ee_link` 在 `base_link` 下的目标位姿。
|
|
||||||
* @param joints_angle 输出关节角(链空间)。
|
|
||||||
* @return 成功返回 `true`,失败返回 `false`。
|
|
||||||
*/
|
|
||||||
bool ik(const std::string& base_link,
|
bool ik(const std::string& base_link,
|
||||||
const std::string& ee_link,
|
const std::string& ee_link,
|
||||||
const Eigen::Matrix4d& target_pose,
|
const Eigen::Matrix4d& target_pose,
|
||||||
std::vector<double>& joints_angle);
|
std::vector<double>& joints_angle);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 生成 MoveL 关节轨迹(局部系微分 IK + S 曲线标量规划)。
|
|
||||||
*
|
|
||||||
* 该接口仅跟踪平移直线,姿态保持起点姿态。
|
|
||||||
*
|
|
||||||
* @param target_pose_base base 坐标系下目标位姿(平移有效,姿态仅用于接口一致性)。
|
|
||||||
* @param q_start 起始关节角(链空间)。
|
|
||||||
* @param q_traj 输出关节轨迹序列。
|
|
||||||
* @param t_traj 输出时间戳序列(秒)。
|
|
||||||
* @param dt 控制周期(秒)。
|
|
||||||
* @param v_tcp_max TCP 线速度上限(m/s)。
|
|
||||||
* @param a_tcp_max TCP 线加速度上限(m/s^2)。
|
|
||||||
* @param j_tcp_max TCP 线加加速度上限(m/s^3)。
|
|
||||||
* @param qd_max 关节速度上限(rad/s),长度应等于 `chain_dof_`。
|
|
||||||
* @param is_tcp 为 `true` 时以 TCP 为末端,否则以 flange 为末端。
|
|
||||||
* @return 成功返回 `true`,失败返回 `false`。
|
|
||||||
*/
|
|
||||||
bool moveL_SCurveLocal(const Eigen::Matrix4d& target_pose_base,
|
bool moveL_SCurveLocal(const Eigen::Matrix4d& target_pose_base,
|
||||||
const std::vector<double>& q_start,
|
const std::vector<double>& q_start,
|
||||||
std::vector<std::vector<double>>& q_traj,
|
std::vector<std::vector<double>>& q_traj,
|
||||||
std::vector<double>& t_traj,
|
std::vector<double>& t_traj,
|
||||||
double dt,
|
double dt,
|
||||||
double v_tcp_max, // m/s
|
double v_tcp_max,
|
||||||
double a_tcp_max, // m/s^2
|
double a_tcp_max,
|
||||||
double j_tcp_max, // m/s^3
|
double j_tcp_max,
|
||||||
const std::vector<double>& qd_max, // rad/s, size=chain_dof
|
const std::vector<double>& qd_max,
|
||||||
bool is_tcp = true);
|
bool is_tcp = true);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 用 DLS 微分逆解将末端局部坐标系 twist 映射为关节速度。
|
|
||||||
*
|
|
||||||
* 当前关节状态取自内部 `cur_joints_angle_`(调用前需先 `update_joints_state`)。
|
|
||||||
*
|
|
||||||
* @param base_link 基坐标系 frame 名称。
|
|
||||||
* @param ee_link 末端 frame 名称。
|
|
||||||
* @param target_vel 末端期望速度 [vx vy vz wx wy wz]^T,单位 m/s 与 rad/s,坐标系为 `ee_link` 局部系。
|
|
||||||
* @param joints_vel 输出的关节速度,size=chain_v_dof_,单位 rad/s。
|
|
||||||
* @param damping DLS 阻尼系数,<=0 时使用成员 damping_。
|
|
||||||
* @param qdot_abs_max 关节速度绝对值限幅;同时会叠加 URDF velocityLimit。
|
|
||||||
* @return 成功返回 `true`,失败返回 `false`。
|
|
||||||
*/
|
|
||||||
bool ik(const std::string& base_link,
|
bool ik(const std::string& base_link,
|
||||||
const std::string& ee_link,
|
const std::string& ee_link,
|
||||||
const Eigen::Matrix<double,6,1>& target_vel,
|
const Eigen::Matrix<double,6,1>& target_vel,
|
||||||
@ -129,118 +87,192 @@ public:
|
|||||||
double damping = -1.0,
|
double damping = -1.0,
|
||||||
double qdot_abs_max = std::numeric_limits<double>::infinity());
|
double qdot_abs_max = std::numeric_limits<double>::infinity());
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 配置关节限位避障 null-space 项。
|
|
||||||
*
|
|
||||||
* @param enable 是否启用。
|
|
||||||
* @param gain 避障增益(rad/s 量纲)。
|
|
||||||
* @param margin_ratio 在上下限附近触发的边界带占总行程比例 (0, 0.5)。
|
|
||||||
* @param max_push 每关节最大推回速度(rad/s),<=0 表示不额外限幅。
|
|
||||||
*/
|
|
||||||
void setJointLimitAvoidance(bool enable,
|
void setJointLimitAvoidance(bool enable,
|
||||||
double gain = 0.2,
|
double gain = 0.2,
|
||||||
double margin_ratio = 0.15,
|
double margin_ratio = 0.15,
|
||||||
double max_push = 0.25);
|
double max_push = 0.25);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 设置 IK 最大迭代次数。
|
|
||||||
* @param iters 最大迭代次数。
|
|
||||||
*/
|
|
||||||
void setMaxIters(int iters) { max_iters_ = iters; }
|
void setMaxIters(int iters) { max_iters_ = iters; }
|
||||||
/**
|
|
||||||
* @brief 设置 DLS 阻尼系数。
|
|
||||||
* @param d 阻尼系数。
|
|
||||||
*/
|
|
||||||
void setDamping(double d) { damping_ = d; }
|
void setDamping(double d) { damping_ = d; }
|
||||||
/**
|
|
||||||
* @brief 设置 IK 收敛阈值。
|
|
||||||
* @param pos_eps 平移阈值(m)。
|
|
||||||
* @param rot_eps 旋转阈值(rad)。
|
|
||||||
*/
|
|
||||||
void setEps(double pos_eps, double rot_eps) { pos_eps_ = pos_eps; rot_eps_ = rot_eps; }
|
void setEps(double pos_eps, double rot_eps) { pos_eps_ = pos_eps; rot_eps_ = rot_eps; }
|
||||||
|
|
||||||
private:
|
// ==================== speedL ====================
|
||||||
/**
|
|
||||||
* @brief 计算阻尼伪逆。
|
|
||||||
* @param J 输入雅可比矩阵。
|
|
||||||
* @param lambda 阻尼系数。
|
|
||||||
* @return 阻尼伪逆矩阵。
|
|
||||||
*/
|
|
||||||
Eigen::MatrixXd dampedPseudoInverse(const Eigen::MatrixXd &J, double lambda);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 将链关节向量组装为 full-model `q`。
|
* @brief 配置 speedL task-space / joint-space 限幅参数。
|
||||||
* @param q_chain 输入链关节向量。
|
*
|
||||||
* @param q_full 输出 full-model 关节向量。
|
* 调用后会重置 speedL 内部运行态,但保留本次配置。
|
||||||
* @param context 调用上下文(用于日志)。
|
|
||||||
* @return 组装成功返回 `true`。
|
|
||||||
*/
|
*/
|
||||||
|
bool configureSpeedL(const SpeedLConfig& config);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 重置 speedL 运行状态(不清除配置)。
|
||||||
|
*/
|
||||||
|
void resetSpeedL();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief speedL 单步(推荐:真机/仿真闭环版本)
|
||||||
|
*
|
||||||
|
* 输入为测得关节状态与目标末端 twist,输出关节速度命令。
|
||||||
|
* 使用注意:
|
||||||
|
* 1) 这是 speedL 的首选接口,真机和 MuJoCo 闭环都应优先使用这个版本。
|
||||||
|
* 2) q_measured / qdot_measured 必须与本次控制周期对齐;如果时间戳漂移,task-space limiter
|
||||||
|
* 的 synchronize 会基于错误状态工作。
|
||||||
|
* 3) 返回的 qdot_cmd 仍然是 solver 侧命令值,不等于驱动器最终实际执行速度。
|
||||||
|
*
|
||||||
|
* 流程:
|
||||||
|
* 1) 用 q_measured / qdot_measured 计算当前 measured twist(base)
|
||||||
|
* 2) 同步到 CartesianTwistLimiter
|
||||||
|
* 3) task-space 限幅得到 command twist(base)
|
||||||
|
* 4) 用 DLS 微分 IK 解出 qdot
|
||||||
|
* 5) 做 joint velocity / joint acceleration 限幅
|
||||||
|
* 6) 回算 executed twist(base)
|
||||||
|
*
|
||||||
|
* @param target_twist 目标末端 twist(Base 或 Tool 系)
|
||||||
|
* @param dt 控制周期
|
||||||
|
* @param q_measured 当前测得关节位置,size=chain_dof_
|
||||||
|
* @param qdot_measured 当前测得关节速度,size=chain_v_dof_
|
||||||
|
* @param qdot_cmd 输出关节速度命令,size=chain_v_dof_
|
||||||
|
* @param input_frame target_twist 的输入坐标系
|
||||||
|
* @param is_tcp true: TCP;false: flange
|
||||||
|
*/
|
||||||
|
bool speedLStep(const Eigen::Matrix<double,6,1>& target_twist,
|
||||||
|
double dt,
|
||||||
|
const std::vector<double>& q_measured,
|
||||||
|
const std::vector<double>& qdot_measured,
|
||||||
|
std::vector<double>& qdot_cmd,
|
||||||
|
CartesianFrame input_frame = CartesianFrame::Tool,
|
||||||
|
bool is_tcp = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief speedL 单步(半闭环版本:有 q,无 qd)
|
||||||
|
*
|
||||||
|
* 使用测得 q_measured 更新当前姿态,
|
||||||
|
* 并用上一拍命令速度作为 qdot_measured 的近似反馈。
|
||||||
|
*
|
||||||
|
* 使用注意:
|
||||||
|
* 1) 只有在能拿到真实 q、但暂时拿不到真实 qd 时再用这个版本。
|
||||||
|
* 2) 这里的 qdot_measured 是 speedl_prev_qdot_cmd_ 的近似值;下游存在饱和、延迟或丢包时,
|
||||||
|
* 这个近似会偏乐观。
|
||||||
|
* 3) 一旦能拿到真实 qdot,应切回带 q_measured/qdot_measured 的闭环版本。
|
||||||
|
*/
|
||||||
|
bool speedLStep(const Eigen::Matrix<double,6,1>& target_twist,
|
||||||
|
double dt,
|
||||||
|
const std::vector<double>& q_measured,
|
||||||
|
std::vector<double>& qdot_cmd,
|
||||||
|
CartesianFrame input_frame = CartesianFrame::Tool,
|
||||||
|
bool is_tcp = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief speedL 单步(开环退化版本:无 q,无 qd)
|
||||||
|
*
|
||||||
|
* 使用内部 cur_joints_angle_ 与上一拍命令速度作为近似反馈,
|
||||||
|
* 并在每拍后用本次 qdot_cmd 做一次内部姿态推进。
|
||||||
|
*
|
||||||
|
* 使用注意:
|
||||||
|
* 1) 只有在当前周期既拿不到真实 q、也拿不到真实 qd 时,才应使用这个版本。
|
||||||
|
* 2) 该版本依赖内部预测状态,会随时间累计漂移;不适合长时间连续运行。
|
||||||
|
* 3) 仅当 chain_dof_ == chain_v_dof_ 时才允许使用,因为内部使用简单的 q += qdot * dt
|
||||||
|
* 欧拉推进。
|
||||||
|
* 4) 一旦恢复真实 q 或 qd,请立即切回上面两个 overload。
|
||||||
|
*/
|
||||||
|
bool speedLStep(const Eigen::Matrix<double,6,1>& target_twist,
|
||||||
|
double dt,
|
||||||
|
std::vector<double>& qdot_cmd,
|
||||||
|
CartesianFrame input_frame = CartesianFrame::Tool,
|
||||||
|
bool is_tcp = true);
|
||||||
|
|
||||||
|
const Eigen::Matrix<double,6,1>& getSpeedLMeasuredTwistBase() const {
|
||||||
|
return speedl_twist_measured_base_;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Eigen::Matrix<double,6,1>& getSpeedLCommandTwistBase() const {
|
||||||
|
return speedl_twist_command_base_;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Eigen::Matrix<double,6,1>& getSpeedLExecutedTwistBase() const {
|
||||||
|
return speedl_twist_executed_base_;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::vector<double>& getSpeedLPrevQdotCmd() const {
|
||||||
|
return speedl_prev_qdot_cmd_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isSpeedLConfigured() const { return speedl_configured_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
Eigen::MatrixXd dampedPseudoInverse(const Eigen::MatrixXd &J, double lambda);
|
||||||
|
|
||||||
bool buildFullQFromChain(const Eigen::VectorXd& q_chain,
|
bool buildFullQFromChain(const Eigen::VectorXd& q_chain,
|
||||||
Eigen::VectorXd& q_full,
|
Eigen::VectorXd& q_full,
|
||||||
const char* context) const;
|
const char* context) const;
|
||||||
/**
|
|
||||||
* @brief 从 full Jacobian 中提取当前链对应列。
|
|
||||||
* @param J_full full-model Jacobian。
|
|
||||||
* @return 链空间 Jacobian。
|
|
||||||
*/
|
|
||||||
Eigen::MatrixXd extractChainJacobian(const Eigen::Matrix<double,6,Eigen::Dynamic>& J_full) const;
|
Eigen::MatrixXd extractChainJacobian(const Eigen::Matrix<double,6,Eigen::Dynamic>& J_full) const;
|
||||||
/**
|
|
||||||
* @brief 获取 base 在 world 下位姿(固定基座时优先使用缓存)。
|
|
||||||
* @return base 在 world 下的位姿。
|
|
||||||
*/
|
|
||||||
const pinocchio::SE3& getBasePoseWorld() const;
|
const pinocchio::SE3& getBasePoseWorld() const;
|
||||||
/**
|
|
||||||
* @brief 计算关节限位避障的二级速度项(未投影)。
|
|
||||||
* @param q_chain 当前链关节位置。
|
|
||||||
* @return 二级目标速度向量。
|
|
||||||
*/
|
|
||||||
Eigen::VectorXd computeJointLimitAvoidanceVelocity(const Eigen::VectorXd& q_chain) const;
|
Eigen::VectorXd computeJointLimitAvoidanceVelocity(const Eigen::VectorXd& q_chain) const;
|
||||||
/**
|
|
||||||
* @brief 将二级目标速度投影到任务零空间。
|
|
||||||
* @param J_pinv 任务雅可比伪逆。
|
|
||||||
* @param J 任务雅可比。
|
|
||||||
* @param secondary 二级目标速度。
|
|
||||||
* @return 零空间投影结果 `N * secondary`,其中 `N = I - J_pinv * J`。
|
|
||||||
*/
|
|
||||||
Eigen::VectorXd projectToNullspace(const Eigen::MatrixXd& J_pinv,
|
Eigen::VectorXd projectToNullspace(const Eigen::MatrixXd& J_pinv,
|
||||||
const Eigen::MatrixXd& J,
|
const Eigen::MatrixXd& J,
|
||||||
const Eigen::VectorXd& secondary) const;
|
const Eigen::VectorXd& secondary) const;
|
||||||
|
|
||||||
|
// ==================== speedL helpers ====================
|
||||||
|
bool resolveSpeedLEeFrame(bool is_tcp, pinocchio::FrameIndex& ee_id) const;
|
||||||
|
|
||||||
|
bool buildJacobianBaseAtQ(const std::vector<double>& q_chain,
|
||||||
|
pinocchio::FrameIndex ee_id,
|
||||||
|
Eigen::MatrixXd& J_base,
|
||||||
|
Eigen::Matrix3d& base_R_ee,
|
||||||
|
Eigen::VectorXd* q_full_out = nullptr);
|
||||||
|
|
||||||
|
bool computeMeasuredTwistBase(const std::vector<double>& q_chain,
|
||||||
|
const std::vector<double>& qdot_chain,
|
||||||
|
pinocchio::FrameIndex ee_id,
|
||||||
|
Eigen::Matrix<double,6,1>& twist_base,
|
||||||
|
Eigen::MatrixXd* J_base_out = nullptr,
|
||||||
|
Eigen::Matrix3d* base_R_ee_out = nullptr,
|
||||||
|
Eigen::VectorXd* q_full_out = nullptr);
|
||||||
|
|
||||||
|
Eigen::VectorXd applyJointVelocityLimits(const Eigen::VectorXd& qdot_des) const;
|
||||||
|
|
||||||
|
Eigen::VectorXd applyJointAccelerationLimits(const Eigen::VectorXd& qdot_des,
|
||||||
|
const Eigen::VectorXd& qdot_reference,
|
||||||
|
double dt) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** @brief 当前链在 full-model `q` 中的起始索引。 */
|
|
||||||
int chain_q_start_{0};
|
int chain_q_start_{0};
|
||||||
/** @brief 当前链关节位置自由度数量。 */
|
|
||||||
int chain_dof_{0};
|
int chain_dof_{0};
|
||||||
/** @brief 当前链在 full-model `v` 中的起始索引。 */
|
|
||||||
int chain_v_start_{0};
|
int chain_v_start_{0};
|
||||||
/** @brief 当前链关节速度自由度数量。 */
|
|
||||||
int chain_v_dof_{0};
|
int chain_v_dof_{0};
|
||||||
|
|
||||||
/** @brief 是否启用 null-space 关节限位避障。 */
|
|
||||||
bool limit_avoidance_enabled_{false};
|
bool limit_avoidance_enabled_{false};
|
||||||
/** @brief 限位避障增益。 */
|
|
||||||
double limit_avoidance_gain_{0.2};
|
double limit_avoidance_gain_{0.2};
|
||||||
/** @brief 限位触发边界比例(占关节行程比例)。 */
|
|
||||||
double limit_avoidance_margin_ratio_{0.15};
|
double limit_avoidance_margin_ratio_{0.15};
|
||||||
/** @brief 每关节最大推回速度(rad/s),<=0 表示不额外限幅。 */
|
|
||||||
double limit_avoidance_max_push_{0.25};
|
double limit_avoidance_max_push_{0.25};
|
||||||
|
|
||||||
/** @brief 是否启用基座位姿缓存。 */
|
|
||||||
bool base_pose_cached_{false};
|
bool base_pose_cached_{false};
|
||||||
/** @brief 缓存的 base 在 world 下位姿。 */
|
|
||||||
pinocchio::SE3 oM_base_cached_;
|
pinocchio::SE3 oM_base_cached_;
|
||||||
|
|
||||||
/** @brief 求解器是否已完成初始化。 */
|
|
||||||
bool initialized_{false};
|
bool initialized_{false};
|
||||||
|
|
||||||
/** @brief IK 最大迭代次数。 */
|
|
||||||
int max_iters_;
|
int max_iters_;
|
||||||
/** @brief IK 平移收敛阈值(m)。 */
|
|
||||||
double pos_eps_;
|
double pos_eps_;
|
||||||
/** @brief IK 旋转收敛阈值(rad)。 */
|
|
||||||
double rot_eps_;
|
double rot_eps_;
|
||||||
/** @brief DLS 阻尼系数。 */
|
|
||||||
double damping_;
|
double damping_;
|
||||||
|
|
||||||
|
// ==================== speedL state ====================
|
||||||
|
bool speedl_configured_{false};
|
||||||
|
bool speedl_last_is_tcp_{true};
|
||||||
|
|
||||||
|
SpeedLConfig speedl_config_;
|
||||||
|
CartesianTwistLimiter speedl_twist_limiter_;
|
||||||
|
|
||||||
|
std::vector<double> speedl_prev_qdot_cmd_; ///< size=chain_v_dof_
|
||||||
|
|
||||||
|
Eigen::Matrix<double,6,1> speedl_twist_measured_base_{Eigen::Matrix<double,6,1>::Zero()};
|
||||||
|
Eigen::Matrix<double,6,1> speedl_twist_command_base_{Eigen::Matrix<double,6,1>::Zero()};
|
||||||
|
Eigen::Matrix<double,6,1> speedl_twist_executed_base_{Eigen::Matrix<double,6,1>::Zero()};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace cmvr
|
} // namespace cmvr
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "ik_solver/include/pinocchio_ik_base.h"
|
#include "ik_solver/include/pinocchio_ik_base.h"
|
||||||
#include "common/utils/math/qp_solver.h"
|
#include "common/math/include/qp_solver.h"
|
||||||
|
|
||||||
#include <Eigen/Core>
|
#include <Eigen/Core>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#include "ik_solver/include/bias_srs_ik_slover.h"
|
#include "ik_solver/include/bias_srs_ik_slover.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "common/utils/math/support_functions.h"
|
#include "common/math/include/support_functions.h"
|
||||||
#include "common/consts/constant.h"
|
#include "common/consts/constant.h"
|
||||||
using namespace cmvr;
|
using namespace cmvr;
|
||||||
using namespace Eigen;
|
using namespace Eigen;
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
//
|
//
|
||||||
#include "ik_solver/include/lawba_ik_solver.h"
|
#include "ik_solver/include/lawba_ik_solver.h"
|
||||||
|
|
||||||
#include "common/utils/math/support_functions.h"
|
#include "common/math/include/support_functions.h"
|
||||||
|
|
||||||
using namespace cmvr;
|
using namespace cmvr;
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,13 @@
|
|||||||
|
|
||||||
|
|
||||||
add_library(planner STATIC
|
add_library(planner STATIC
|
||||||
joint_space_planner/src/joint_space_planner.cpp
|
joint_space_planner/src/joint_space_planner.cpp
|
||||||
joint_space_planner/src/joint_space_planner_creator.cpp
|
joint_space_planner/src/joint_space_planner_creator.cpp
|
||||||
joint_space_planner/src/toppra_bspline.cpp
|
joint_space_planner/src/toppra_bspline.cpp
|
||||||
|
|
||||||
|
s_curve_planner/src/s_curve_position_planner.cpp
|
||||||
|
s_curve_planner/src/s_curve_velocity_planner.cpp
|
||||||
|
cartesian_space_planner/src/cartesian_twist_limiter.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(planner PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(planner PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
@ -12,6 +17,7 @@ target_link_libraries(planner PUBLIC
|
|||||||
tinyxml2
|
tinyxml2
|
||||||
fcl
|
fcl
|
||||||
toppra
|
toppra
|
||||||
|
cmvr_es::common
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(cmvr_es::planner ALIAS planner)
|
add_library(cmvr_es::planner ALIAS planner)
|
||||||
@ -46,4 +52,17 @@ target_link_libraries(joint_space_planner_test
|
|||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_executable(cartesian_twist_limiter_test
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/cartesian_space_planner/src/cartesian_twist_limiter_test.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(cartesian_twist_limiter_test
|
||||||
|
PRIVATE
|
||||||
|
cmvr_es::planner
|
||||||
|
gtest
|
||||||
|
gtest_main
|
||||||
|
pthread
|
||||||
|
glog
|
||||||
|
cmvr_es::proto
|
||||||
|
matplot
|
||||||
|
)
|
||||||
|
|||||||
@ -0,0 +1,242 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Eigen/Core>
|
||||||
|
#include <Eigen/Geometry>
|
||||||
|
#include "planner/s_curve_planner/include/s_curve_velocity_planner.h"
|
||||||
|
namespace cmvr
|
||||||
|
{
|
||||||
|
|
||||||
|
enum class CartesianFrame
|
||||||
|
{
|
||||||
|
Base = 0,
|
||||||
|
Tool = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 6维末端 twist 在线限幅器(基于 SCurveVelocityPlanner1D)
|
||||||
|
*
|
||||||
|
* 线速度部分:
|
||||||
|
* - 模长使用 SCurveVelocityPlanner1D 做 jerk-limited 速度规划
|
||||||
|
* - 运动中锁定当前方向,不做方向插值
|
||||||
|
* - 若目标方向与当前方向不共线,则采用“先减速到0,再切方向”的 switch policy
|
||||||
|
*
|
||||||
|
* 角速度部分:
|
||||||
|
* - 与线速度独立
|
||||||
|
* - 模长使用 SCurveVelocityPlanner1D 做 jerk-limited 速度规划
|
||||||
|
* - 运动中锁定当前旋转轴,不做方向插值
|
||||||
|
*
|
||||||
|
* 接口语义:
|
||||||
|
* - setTargetTwist(...):设置目标 twist
|
||||||
|
* - synchronizeToMeasuredTwistBase(...):用测量 twist 同步当前状态
|
||||||
|
* - update(dt, base_R_tool):根据当前目标与当前状态生成下一拍命令 twist
|
||||||
|
*/
|
||||||
|
class CartesianTwistLimiter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using Twist = Eigen::Matrix<double, 6, 1>;
|
||||||
|
|
||||||
|
CartesianTwistLimiter();
|
||||||
|
|
||||||
|
void setLinearConstraints(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk);
|
||||||
|
|
||||||
|
void setAngularConstraints(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk);
|
||||||
|
|
||||||
|
void setLinearTargetReplanThreshold(double threshold);
|
||||||
|
void setAngularTargetReplanThreshold(double threshold);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 设置线速度方向最大转动角速度(rad/s)
|
||||||
|
*/
|
||||||
|
void setLinearDirectionRateLimit(double max_rate_rad_s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 设置角速度方向最大转动角速度(rad/s)
|
||||||
|
*/
|
||||||
|
void setAngularDirectionRateLimit(double max_rate_rad_s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 设置线速度反向切换策略
|
||||||
|
*
|
||||||
|
* @param cos_threshold 近反向判定阈值,范围 [-1, 1]
|
||||||
|
* @param switch_speed_threshold 线速度模长低于该阈值后,允许切到目标方向
|
||||||
|
*/
|
||||||
|
void setLinearReverseSwitchPolicy(double cos_threshold,
|
||||||
|
double switch_speed_threshold);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 初始化当前 twist 状态
|
||||||
|
*
|
||||||
|
* 注意:
|
||||||
|
* - 初始 twist 视为 base 坐标系下
|
||||||
|
*/
|
||||||
|
void initialize(const Twist& initial_twist = Twist::Zero());
|
||||||
|
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 设置目标 twist
|
||||||
|
*
|
||||||
|
* @param target_twist 目标 twist
|
||||||
|
* @param frame 输入目标的坐标系(Base 或 Tool)
|
||||||
|
*/
|
||||||
|
void setTargetTwist(const Twist& target_twist, CartesianFrame frame);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 平滑停下
|
||||||
|
*/
|
||||||
|
void stop();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 急停
|
||||||
|
*
|
||||||
|
* 使用更大的减速度/jerk 约束把当前线速度/角速度平滑拉回 0。
|
||||||
|
* 当前运动停止后,会自动恢复到常规约束。
|
||||||
|
*
|
||||||
|
* @param emergency_acceleration 急停减速度幅值
|
||||||
|
* @param emergency_jerk 急停 jerk 幅值
|
||||||
|
*/
|
||||||
|
void emergencyStop(double emergency_acceleration,
|
||||||
|
double emergency_jerk);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 急停(分别指定线速度/角速度减速度与 jerk)
|
||||||
|
*
|
||||||
|
* @param emergency_linear_acceleration 线速度急停减速度幅值
|
||||||
|
* @param emergency_linear_jerk 线速度急停 jerk 幅值
|
||||||
|
* @param emergency_angular_acceleration 角速度急停减速度幅值
|
||||||
|
* @param emergency_angular_jerk 角速度急停 jerk 幅值
|
||||||
|
*/
|
||||||
|
void emergencyStop(double emergency_linear_acceleration,
|
||||||
|
double emergency_linear_jerk,
|
||||||
|
double emergency_angular_acceleration,
|
||||||
|
double emergency_angular_jerk);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 用测得的 base-frame twist 同步当前状态
|
||||||
|
*
|
||||||
|
* 作用:
|
||||||
|
* - 更新当前执行方向
|
||||||
|
* - 用测得模长与模长加速度同步两个 planner
|
||||||
|
* - keep_target=true 时:
|
||||||
|
* - 若测量状态仍贴着当前 profile,则保持当前 profile
|
||||||
|
* - 否则由 planner 内部从测量状态重规划到当前目标
|
||||||
|
* - keep_target=false 时:
|
||||||
|
* - 清掉旧 profile,仅覆盖状态
|
||||||
|
*
|
||||||
|
* @param measured_twist_base 当前测得实际 twist(base 系)
|
||||||
|
* @param dt 与上一次测量同步的时间间隔
|
||||||
|
* @param keep_target 是否保留当前目标模长
|
||||||
|
*/
|
||||||
|
void synchronize(const Twist& measured_twist_base,
|
||||||
|
double dt,
|
||||||
|
bool keep_target = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 更新一步,返回 base 坐标系下的执行 twist 命令
|
||||||
|
*/
|
||||||
|
Twist update(double dt, const Eigen::Matrix3d& base_R_tool);
|
||||||
|
|
||||||
|
const Twist& getTwistBase() const { return twist_base_; }
|
||||||
|
const Twist& getCommandedTwistBase() const { return twist_base_; }
|
||||||
|
const Twist& getTargetTwistBase() const { return target_twist_base_; }
|
||||||
|
const Twist& getAccelerationBase() const { return acceleration_base_; }
|
||||||
|
const Twist& getJerkBase() const { return jerk_base_; }
|
||||||
|
|
||||||
|
bool isMoving() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static constexpr double EPSILON = 1e-12;
|
||||||
|
static constexpr double DEFAULT_LINEAR_DIR_RATE_LIMIT = 3.14159265358979323846; // 180 deg/s
|
||||||
|
static constexpr double DEFAULT_ANGULAR_DIR_RATE_LIMIT = 3.14159265358979323846; // 180 deg/s
|
||||||
|
static constexpr double DEFAULT_LINEAR_REVERSE_COS_THRESHOLD = -0.8660254037844386; // cos(150 deg)
|
||||||
|
static constexpr double DEFAULT_LINEAR_REVERSE_SWITCH_SPEED_THRESHOLD = 1e-3;
|
||||||
|
static constexpr double AXIS_LOCK_COS_THRESHOLD = 0.999;
|
||||||
|
static constexpr double DEFAULT_ANGULAR_SWITCH_SPEED_THRESHOLD = 1e-3;
|
||||||
|
|
||||||
|
// 模长 planner
|
||||||
|
SCurveVelocityPlanner1D linear_norm_planner_;
|
||||||
|
SCurveVelocityPlanner1D angular_norm_planner_;
|
||||||
|
|
||||||
|
// 常规约束缓存。急停结束后恢复到这里。
|
||||||
|
double linear_max_velocity_;
|
||||||
|
double linear_max_acceleration_;
|
||||||
|
double linear_max_jerk_;
|
||||||
|
double angular_max_velocity_;
|
||||||
|
double angular_max_acceleration_;
|
||||||
|
double angular_max_jerk_;
|
||||||
|
|
||||||
|
// 方向变化率限制(rad/s)
|
||||||
|
double linear_direction_rate_limit_;
|
||||||
|
double angular_direction_rate_limit_;
|
||||||
|
|
||||||
|
// 线速度 reverse policy
|
||||||
|
double linear_reverse_cos_threshold_;
|
||||||
|
double linear_reverse_switch_speed_threshold_;
|
||||||
|
double angular_switch_speed_threshold_;
|
||||||
|
bool emergency_stop_active_;
|
||||||
|
|
||||||
|
// 目标/当前状态
|
||||||
|
Twist target_twist_input_;
|
||||||
|
Twist target_twist_base_;
|
||||||
|
|
||||||
|
Twist twist_base_;
|
||||||
|
Twist acceleration_base_;
|
||||||
|
Twist jerk_base_;
|
||||||
|
|
||||||
|
Twist prev_twist_base_;
|
||||||
|
Twist prev_acceleration_base_;
|
||||||
|
|
||||||
|
CartesianFrame input_frame_;
|
||||||
|
|
||||||
|
// 当前执行方向
|
||||||
|
Eigen::Vector3d current_linear_dir_base_;
|
||||||
|
Eigen::Vector3d current_angular_dir_base_;
|
||||||
|
|
||||||
|
// 最近一次非零目标方向(目标变0时用于平滑停下)
|
||||||
|
Eigen::Vector3d last_target_linear_dir_base_;
|
||||||
|
Eigen::Vector3d last_target_angular_dir_base_;
|
||||||
|
|
||||||
|
// 测量同步用缓存
|
||||||
|
bool has_measured_sync_;
|
||||||
|
Twist last_measured_twist_base_;
|
||||||
|
Twist last_measured_acceleration_base_;
|
||||||
|
double prev_measured_linear_norm_;
|
||||||
|
double prev_measured_angular_norm_;
|
||||||
|
|
||||||
|
static Twist transformTwistToolToBase(const Twist& twist_tool,
|
||||||
|
const Eigen::Matrix3d& base_R_tool);
|
||||||
|
|
||||||
|
static Eigen::Vector3d chooseDirection(const Eigen::Vector3d& target_vec,
|
||||||
|
const Eigen::Vector3d& fallback);
|
||||||
|
|
||||||
|
static Eigen::Vector3d rotateDirectionToward(const Eigen::Vector3d& current_dir,
|
||||||
|
const Eigen::Vector3d& target_dir,
|
||||||
|
double max_rate_rad_s,
|
||||||
|
double dt);
|
||||||
|
|
||||||
|
static Eigen::Vector3d rotateAroundAxis(const Eigen::Vector3d& v,
|
||||||
|
const Eigen::Vector3d& axis_unit,
|
||||||
|
double angle_rad);
|
||||||
|
|
||||||
|
static Eigen::Vector3d chooseOrthogonalUnit(const Eigen::Vector3d& v);
|
||||||
|
|
||||||
|
void applyLinearConstraints(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk);
|
||||||
|
void applyAngularConstraints(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk);
|
||||||
|
void restoreNominalConstraints();
|
||||||
|
static bool isZeroTwist(const Twist& twist);
|
||||||
|
|
||||||
|
static double clamp(double value, double lo, double hi)
|
||||||
|
{
|
||||||
|
return std::max(lo, std::min(hi, value));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace cmvr
|
||||||
@ -0,0 +1,537 @@
|
|||||||
|
#include "../include/cartesian_twist_limiter.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace cmvr
|
||||||
|
{
|
||||||
|
|
||||||
|
CartesianTwistLimiter::CartesianTwistLimiter()
|
||||||
|
: linear_norm_planner_(1.0, 1.0, 5.0)
|
||||||
|
, angular_norm_planner_(1.0, 1.0, 5.0)
|
||||||
|
, linear_max_velocity_(1.0)
|
||||||
|
, linear_max_acceleration_(1.0)
|
||||||
|
, linear_max_jerk_(5.0)
|
||||||
|
, angular_max_velocity_(1.0)
|
||||||
|
, angular_max_acceleration_(1.0)
|
||||||
|
, angular_max_jerk_(5.0)
|
||||||
|
, linear_direction_rate_limit_(DEFAULT_LINEAR_DIR_RATE_LIMIT)
|
||||||
|
, angular_direction_rate_limit_(DEFAULT_ANGULAR_DIR_RATE_LIMIT)
|
||||||
|
, linear_reverse_cos_threshold_(DEFAULT_LINEAR_REVERSE_COS_THRESHOLD)
|
||||||
|
, linear_reverse_switch_speed_threshold_(DEFAULT_LINEAR_REVERSE_SWITCH_SPEED_THRESHOLD)
|
||||||
|
, angular_switch_speed_threshold_(DEFAULT_ANGULAR_SWITCH_SPEED_THRESHOLD)
|
||||||
|
, emergency_stop_active_(false)
|
||||||
|
, target_twist_input_(Twist::Zero())
|
||||||
|
, target_twist_base_(Twist::Zero())
|
||||||
|
, twist_base_(Twist::Zero())
|
||||||
|
, acceleration_base_(Twist::Zero())
|
||||||
|
, jerk_base_(Twist::Zero())
|
||||||
|
, prev_twist_base_(Twist::Zero())
|
||||||
|
, prev_acceleration_base_(Twist::Zero())
|
||||||
|
, input_frame_(CartesianFrame::Base)
|
||||||
|
, current_linear_dir_base_(Eigen::Vector3d::Zero())
|
||||||
|
, current_angular_dir_base_(Eigen::Vector3d::Zero())
|
||||||
|
, last_target_linear_dir_base_(Eigen::Vector3d::Zero())
|
||||||
|
, last_target_angular_dir_base_(Eigen::Vector3d::Zero())
|
||||||
|
, has_measured_sync_(false)
|
||||||
|
, last_measured_twist_base_(Twist::Zero())
|
||||||
|
, last_measured_acceleration_base_(Twist::Zero())
|
||||||
|
, prev_measured_linear_norm_(0.0)
|
||||||
|
, prev_measured_angular_norm_(0.0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::applyLinearConstraints(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk)
|
||||||
|
{
|
||||||
|
linear_norm_planner_.setConstraints(max_velocity, max_acceleration, max_jerk);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::applyAngularConstraints(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk)
|
||||||
|
{
|
||||||
|
angular_norm_planner_.setConstraints(max_velocity, max_acceleration, max_jerk);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::setLinearConstraints(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk)
|
||||||
|
{
|
||||||
|
linear_max_velocity_ = std::abs(max_velocity);
|
||||||
|
linear_max_acceleration_ = std::abs(max_acceleration);
|
||||||
|
linear_max_jerk_ = std::abs(max_jerk);
|
||||||
|
|
||||||
|
if (!emergency_stop_active_) {
|
||||||
|
applyLinearConstraints(linear_max_velocity_, linear_max_acceleration_, linear_max_jerk_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::setAngularConstraints(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk)
|
||||||
|
{
|
||||||
|
angular_max_velocity_ = std::abs(max_velocity);
|
||||||
|
angular_max_acceleration_ = std::abs(max_acceleration);
|
||||||
|
angular_max_jerk_ = std::abs(max_jerk);
|
||||||
|
|
||||||
|
if (!emergency_stop_active_) {
|
||||||
|
applyAngularConstraints(angular_max_velocity_, angular_max_acceleration_, angular_max_jerk_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::setLinearTargetReplanThreshold(double threshold)
|
||||||
|
{
|
||||||
|
linear_norm_planner_.setTargetReplanThreshold(threshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::setAngularTargetReplanThreshold(double threshold)
|
||||||
|
{
|
||||||
|
angular_norm_planner_.setTargetReplanThreshold(threshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::setLinearDirectionRateLimit(double max_rate_rad_s)
|
||||||
|
{
|
||||||
|
linear_direction_rate_limit_ = std::max(0.0, max_rate_rad_s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::setAngularDirectionRateLimit(double max_rate_rad_s)
|
||||||
|
{
|
||||||
|
angular_direction_rate_limit_ = std::max(0.0, max_rate_rad_s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::setLinearReverseSwitchPolicy(double cos_threshold,
|
||||||
|
double switch_speed_threshold)
|
||||||
|
{
|
||||||
|
linear_reverse_cos_threshold_ = clamp(cos_threshold, -1.0, 1.0);
|
||||||
|
linear_reverse_switch_speed_threshold_ = std::max(0.0, switch_speed_threshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::initialize(const Twist& initial_twist)
|
||||||
|
{
|
||||||
|
restoreNominalConstraints();
|
||||||
|
emergency_stop_active_ = false;
|
||||||
|
|
||||||
|
const Eigen::Vector3d v0 = initial_twist.head<3>();
|
||||||
|
const Eigen::Vector3d w0 = initial_twist.tail<3>();
|
||||||
|
|
||||||
|
const double v0_norm = v0.norm();
|
||||||
|
const double w0_norm = w0.norm();
|
||||||
|
|
||||||
|
linear_norm_planner_.initialize(v0_norm, 0.0);
|
||||||
|
angular_norm_planner_.initialize(w0_norm, 0.0);
|
||||||
|
|
||||||
|
target_twist_input_ = initial_twist;
|
||||||
|
target_twist_base_ = initial_twist;
|
||||||
|
twist_base_ = initial_twist;
|
||||||
|
acceleration_base_.setZero();
|
||||||
|
jerk_base_.setZero();
|
||||||
|
prev_twist_base_ = initial_twist;
|
||||||
|
prev_acceleration_base_.setZero();
|
||||||
|
|
||||||
|
// current_linear_dir_base_ =
|
||||||
|
// (v0_norm > EPSILON) ? (v0 / v0_norm) : Eigen::Vector3d::Zero();
|
||||||
|
// current_angular_dir_base_ =
|
||||||
|
// (w0_norm > EPSILON) ? (w0 / w0_norm) : Eigen::Vector3d::Zero();
|
||||||
|
current_linear_dir_base_.setZero();
|
||||||
|
current_angular_dir_base_.setZero();
|
||||||
|
if (v0_norm > EPSILON) {
|
||||||
|
current_linear_dir_base_ = v0 / v0_norm;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (w0_norm > EPSILON) {
|
||||||
|
current_angular_dir_base_ = w0 / w0_norm;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
last_target_linear_dir_base_ = current_linear_dir_base_;
|
||||||
|
last_target_angular_dir_base_ = current_angular_dir_base_;
|
||||||
|
|
||||||
|
has_measured_sync_ = false;
|
||||||
|
last_measured_twist_base_ = initial_twist;
|
||||||
|
last_measured_acceleration_base_.setZero();
|
||||||
|
prev_measured_linear_norm_ = v0_norm;
|
||||||
|
prev_measured_angular_norm_ = w0_norm;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::reset()
|
||||||
|
{
|
||||||
|
restoreNominalConstraints();
|
||||||
|
emergency_stop_active_ = false;
|
||||||
|
|
||||||
|
linear_norm_planner_.reset();
|
||||||
|
angular_norm_planner_.reset();
|
||||||
|
|
||||||
|
target_twist_input_.setZero();
|
||||||
|
target_twist_base_.setZero();
|
||||||
|
twist_base_.setZero();
|
||||||
|
acceleration_base_.setZero();
|
||||||
|
jerk_base_.setZero();
|
||||||
|
prev_twist_base_.setZero();
|
||||||
|
prev_acceleration_base_.setZero();
|
||||||
|
|
||||||
|
input_frame_ = CartesianFrame::Base;
|
||||||
|
|
||||||
|
current_linear_dir_base_.setZero();
|
||||||
|
current_angular_dir_base_.setZero();
|
||||||
|
last_target_linear_dir_base_.setZero();
|
||||||
|
last_target_angular_dir_base_.setZero();
|
||||||
|
|
||||||
|
has_measured_sync_ = false;
|
||||||
|
last_measured_twist_base_.setZero();
|
||||||
|
last_measured_acceleration_base_.setZero();
|
||||||
|
prev_measured_linear_norm_ = 0.0;
|
||||||
|
prev_measured_angular_norm_ = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::setTargetTwist(const Twist& target_twist, CartesianFrame frame)
|
||||||
|
{
|
||||||
|
if (emergency_stop_active_ && !isZeroTwist(target_twist)) {
|
||||||
|
restoreNominalConstraints();
|
||||||
|
emergency_stop_active_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
target_twist_input_ = target_twist;
|
||||||
|
input_frame_ = frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::stop()
|
||||||
|
{
|
||||||
|
target_twist_input_.setZero();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::emergencyStop(double emergency_acceleration,
|
||||||
|
double emergency_jerk)
|
||||||
|
{
|
||||||
|
emergencyStop(emergency_acceleration,
|
||||||
|
emergency_jerk,
|
||||||
|
emergency_acceleration,
|
||||||
|
emergency_jerk);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::emergencyStop(double emergency_linear_acceleration,
|
||||||
|
double emergency_linear_jerk,
|
||||||
|
double emergency_angular_acceleration,
|
||||||
|
double emergency_angular_jerk)
|
||||||
|
{
|
||||||
|
const double linear_stop_acceleration =
|
||||||
|
std::max(std::abs(emergency_linear_acceleration), linear_max_acceleration_);
|
||||||
|
const double linear_stop_jerk =
|
||||||
|
std::max(std::abs(emergency_linear_jerk), linear_max_jerk_);
|
||||||
|
const double angular_stop_acceleration =
|
||||||
|
std::max(std::abs(emergency_angular_acceleration), angular_max_acceleration_);
|
||||||
|
const double angular_stop_jerk =
|
||||||
|
std::max(std::abs(emergency_angular_jerk), angular_max_jerk_);
|
||||||
|
|
||||||
|
applyLinearConstraints(linear_max_velocity_, linear_stop_acceleration, linear_stop_jerk);
|
||||||
|
applyAngularConstraints(angular_max_velocity_, angular_stop_acceleration, angular_stop_jerk);
|
||||||
|
|
||||||
|
emergency_stop_active_ = true;
|
||||||
|
target_twist_input_.setZero();
|
||||||
|
target_twist_base_.setZero();
|
||||||
|
linear_norm_planner_.setTargetVelocity(0.0);
|
||||||
|
angular_norm_planner_.setTargetVelocity(0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::synchronize(const Twist& measured_twist_base,
|
||||||
|
double dt,
|
||||||
|
bool keep_target)
|
||||||
|
{
|
||||||
|
const Eigen::Vector3d v_meas = measured_twist_base.head<3>();
|
||||||
|
const Eigen::Vector3d w_meas = measured_twist_base.tail<3>();
|
||||||
|
|
||||||
|
const double v_norm = v_meas.norm();
|
||||||
|
const double w_norm = w_meas.norm();
|
||||||
|
|
||||||
|
double v_acc = 0.0;
|
||||||
|
double w_acc = 0.0;
|
||||||
|
|
||||||
|
if (dt > EPSILON && has_measured_sync_) {
|
||||||
|
v_acc = (v_norm - prev_measured_linear_norm_) / dt;
|
||||||
|
w_acc = (w_norm - prev_measured_angular_norm_) / dt;
|
||||||
|
|
||||||
|
acceleration_base_ = (measured_twist_base - last_measured_twist_base_) / dt;
|
||||||
|
jerk_base_ = (acceleration_base_ - last_measured_acceleration_base_) / dt;
|
||||||
|
last_measured_acceleration_base_ = acceleration_base_;
|
||||||
|
} else {
|
||||||
|
acceleration_base_.setZero();
|
||||||
|
jerk_base_.setZero();
|
||||||
|
last_measured_acceleration_base_.setZero();
|
||||||
|
}
|
||||||
|
|
||||||
|
prev_measured_linear_norm_ = v_norm;
|
||||||
|
prev_measured_angular_norm_ = w_norm;
|
||||||
|
last_measured_twist_base_ = measured_twist_base;
|
||||||
|
has_measured_sync_ = true;
|
||||||
|
|
||||||
|
// 用测得模长/模长加速度同步 planner 当前状态。
|
||||||
|
// keep_target=true:
|
||||||
|
// - 若测量值仍贴着当前 profile,则继续沿旧 profile 走
|
||||||
|
// - 否则从测量状态重规划到当前目标
|
||||||
|
// keep_target=false:
|
||||||
|
// - 仅覆盖状态并清掉旧 profile,不保留当前目标
|
||||||
|
if (keep_target) {
|
||||||
|
linear_norm_planner_.synchronizeAndReplan(v_norm, v_acc);
|
||||||
|
angular_norm_planner_.synchronizeAndReplan(w_norm, w_acc);
|
||||||
|
} else {
|
||||||
|
linear_norm_planner_.overwriteState(v_norm, v_acc, false);
|
||||||
|
angular_norm_planner_.overwriteState(w_norm, w_acc, false);
|
||||||
|
target_twist_input_.setZero();
|
||||||
|
target_twist_base_.setZero();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (v_norm > EPSILON) {
|
||||||
|
current_linear_dir_base_ = v_meas / v_norm;
|
||||||
|
last_target_linear_dir_base_ = current_linear_dir_base_;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (w_norm > EPSILON) {
|
||||||
|
current_angular_dir_base_ = w_meas / w_norm;
|
||||||
|
last_target_angular_dir_base_ = current_angular_dir_base_;
|
||||||
|
}
|
||||||
|
|
||||||
|
twist_base_ = measured_twist_base;
|
||||||
|
prev_twist_base_ = measured_twist_base;
|
||||||
|
prev_acceleration_base_ = acceleration_base_;
|
||||||
|
}
|
||||||
|
|
||||||
|
CartesianTwistLimiter::Twist
|
||||||
|
CartesianTwistLimiter::transformTwistToolToBase(const Twist& twist_tool,
|
||||||
|
const Eigen::Matrix3d& base_R_tool)
|
||||||
|
{
|
||||||
|
Twist twist_base;
|
||||||
|
twist_base.head<3>() = base_R_tool * twist_tool.head<3>();
|
||||||
|
twist_base.tail<3>() = base_R_tool * twist_tool.tail<3>();
|
||||||
|
return twist_base;
|
||||||
|
}
|
||||||
|
|
||||||
|
Eigen::Vector3d CartesianTwistLimiter::chooseDirection(const Eigen::Vector3d& target_vec,
|
||||||
|
const Eigen::Vector3d& fallback)
|
||||||
|
{
|
||||||
|
const double n = target_vec.norm();
|
||||||
|
if (n > EPSILON) {
|
||||||
|
return target_vec / n;
|
||||||
|
}
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
Eigen::Vector3d CartesianTwistLimiter::rotateAroundAxis(const Eigen::Vector3d& v,
|
||||||
|
const Eigen::Vector3d& axis_unit,
|
||||||
|
double angle_rad)
|
||||||
|
{
|
||||||
|
const double c = std::cos(angle_rad);
|
||||||
|
const double s = std::sin(angle_rad);
|
||||||
|
return c * v + s * (axis_unit.cross(v)) + (1.0 - c) * axis_unit.dot(v) * axis_unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Eigen::Vector3d CartesianTwistLimiter::chooseOrthogonalUnit(const Eigen::Vector3d& v)
|
||||||
|
{
|
||||||
|
Eigen::Vector3d ref;
|
||||||
|
if (std::abs(v.x()) < 0.8) {
|
||||||
|
ref = Eigen::Vector3d::UnitX();
|
||||||
|
} else if (std::abs(v.y()) < 0.8) {
|
||||||
|
ref = Eigen::Vector3d::UnitY();
|
||||||
|
} else {
|
||||||
|
ref = Eigen::Vector3d::UnitZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
Eigen::Vector3d ortho = ref - ref.dot(v) * v;
|
||||||
|
const double n = ortho.norm();
|
||||||
|
if (n > EPSILON) {
|
||||||
|
return ortho / n;
|
||||||
|
}
|
||||||
|
return Eigen::Vector3d::UnitX();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartesianTwistLimiter::restoreNominalConstraints()
|
||||||
|
{
|
||||||
|
applyLinearConstraints(linear_max_velocity_, linear_max_acceleration_, linear_max_jerk_);
|
||||||
|
applyAngularConstraints(angular_max_velocity_, angular_max_acceleration_, angular_max_jerk_);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CartesianTwistLimiter::isZeroTwist(const Twist& twist)
|
||||||
|
{
|
||||||
|
return twist.head<3>().squaredNorm() <= EPSILON && twist.tail<3>().squaredNorm() <= EPSILON;
|
||||||
|
}
|
||||||
|
|
||||||
|
Eigen::Vector3d CartesianTwistLimiter::rotateDirectionToward(const Eigen::Vector3d& current_dir,
|
||||||
|
const Eigen::Vector3d& target_dir,
|
||||||
|
double max_rate_rad_s,
|
||||||
|
double dt)
|
||||||
|
{
|
||||||
|
if (dt <= 0.0) {
|
||||||
|
return current_dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double cur_n = current_dir.norm();
|
||||||
|
const double tgt_n = target_dir.norm();
|
||||||
|
|
||||||
|
if (tgt_n <= EPSILON) {
|
||||||
|
return current_dir;
|
||||||
|
}
|
||||||
|
if (cur_n <= EPSILON) {
|
||||||
|
return target_dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Eigen::Vector3d u = current_dir / cur_n;
|
||||||
|
const Eigen::Vector3d v = target_dir / tgt_n;
|
||||||
|
|
||||||
|
const double dot_uv = clamp(u.dot(v), -1.0, 1.0);
|
||||||
|
const double angle = std::acos(dot_uv);
|
||||||
|
|
||||||
|
if (angle <= 1e-9) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double max_step = std::max(0.0, max_rate_rad_s) * dt;
|
||||||
|
if (max_step <= 0.0) {
|
||||||
|
return u;
|
||||||
|
}
|
||||||
|
if (angle <= max_step) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
Eigen::Vector3d axis = u.cross(v);
|
||||||
|
const double axis_n = axis.norm();
|
||||||
|
|
||||||
|
if (axis_n > EPSILON) {
|
||||||
|
axis /= axis_n;
|
||||||
|
return rotateAroundAxis(u, axis, max_step).normalized();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dot_uv > 0.0) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Eigen::Vector3d ortho_axis = chooseOrthogonalUnit(u);
|
||||||
|
return rotateAroundAxis(u, ortho_axis, max_step).normalized();
|
||||||
|
}
|
||||||
|
|
||||||
|
CartesianTwistLimiter::Twist
|
||||||
|
CartesianTwistLimiter::update(double dt, const Eigen::Matrix3d& base_R_tool)
|
||||||
|
{
|
||||||
|
if (emergency_stop_active_ && isZeroTwist(target_twist_input_) &&
|
||||||
|
!linear_norm_planner_.isMoving() && !angular_norm_planner_.isMoving()) {
|
||||||
|
restoreNominalConstraints();
|
||||||
|
emergency_stop_active_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input_frame_ == CartesianFrame::Base) {
|
||||||
|
target_twist_base_ = target_twist_input_;
|
||||||
|
} else {
|
||||||
|
target_twist_base_ = transformTwistToolToBase(target_twist_input_, base_R_tool);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 线速度:方向锁定 + 标量 planner ====================
|
||||||
|
const Eigen::Vector3d v_des = target_twist_base_.head<3>();
|
||||||
|
const double v_des_norm = v_des.norm();
|
||||||
|
const Eigen::Vector3d v_target_dir =
|
||||||
|
chooseDirection(v_des,
|
||||||
|
current_linear_dir_base_.norm() > EPSILON
|
||||||
|
? current_linear_dir_base_
|
||||||
|
: last_target_linear_dir_base_);
|
||||||
|
|
||||||
|
if (v_des_norm > EPSILON) {
|
||||||
|
last_target_linear_dir_base_ = v_target_dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double v_cur_norm = linear_norm_planner_.getVelocity();
|
||||||
|
const bool has_current_linear_dir = current_linear_dir_base_.norm() > EPSILON;
|
||||||
|
if (!has_current_linear_dir) {
|
||||||
|
if (v_des_norm > EPSILON) {
|
||||||
|
current_linear_dir_base_ = v_target_dir;
|
||||||
|
linear_norm_planner_.setTargetVelocity(v_des_norm);
|
||||||
|
} else {
|
||||||
|
linear_norm_planner_.setTargetVelocity(0.0);
|
||||||
|
}
|
||||||
|
} else if (v_des_norm <= EPSILON) {
|
||||||
|
linear_norm_planner_.setTargetVelocity(0.0);
|
||||||
|
} else {
|
||||||
|
const double dir_dot =
|
||||||
|
clamp(current_linear_dir_base_.dot(v_target_dir), -1.0, 1.0);
|
||||||
|
const bool axis_aligned = dir_dot >= AXIS_LOCK_COS_THRESHOLD;
|
||||||
|
const bool reverse_aligned = dir_dot <= -AXIS_LOCK_COS_THRESHOLD;
|
||||||
|
const bool same_axis = axis_aligned || reverse_aligned;
|
||||||
|
const bool must_switch_axis =
|
||||||
|
!same_axis || dir_dot < linear_reverse_cos_threshold_;
|
||||||
|
|
||||||
|
if (must_switch_axis && v_cur_norm > linear_reverse_switch_speed_threshold_) {
|
||||||
|
linear_norm_planner_.setTargetVelocity(0.0);
|
||||||
|
} else {
|
||||||
|
current_linear_dir_base_ = v_target_dir;
|
||||||
|
linear_norm_planner_.setTargetVelocity(v_des_norm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const double v_exec_norm = linear_norm_planner_.update(dt);
|
||||||
|
twist_base_.head<3>() = current_linear_dir_base_ * v_exec_norm;
|
||||||
|
|
||||||
|
// ==================== 角速度:方向锁定 + 标量 planner ====================
|
||||||
|
const Eigen::Vector3d w_des = target_twist_base_.tail<3>();
|
||||||
|
const double w_des_norm = w_des.norm();
|
||||||
|
const Eigen::Vector3d w_target_dir =
|
||||||
|
chooseDirection(w_des,
|
||||||
|
current_angular_dir_base_.norm() > EPSILON
|
||||||
|
? current_angular_dir_base_
|
||||||
|
: last_target_angular_dir_base_);
|
||||||
|
|
||||||
|
if (w_des_norm > EPSILON) {
|
||||||
|
last_target_angular_dir_base_ = w_target_dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double w_cur_norm = angular_norm_planner_.getVelocity();
|
||||||
|
const bool has_current_angular_dir = current_angular_dir_base_.norm() > EPSILON;
|
||||||
|
if (!has_current_angular_dir) {
|
||||||
|
if (w_des_norm > EPSILON) {
|
||||||
|
current_angular_dir_base_ = w_target_dir;
|
||||||
|
angular_norm_planner_.setTargetVelocity(w_des_norm);
|
||||||
|
} else {
|
||||||
|
angular_norm_planner_.setTargetVelocity(0.0);
|
||||||
|
}
|
||||||
|
} else if (w_des_norm <= EPSILON) {
|
||||||
|
angular_norm_planner_.setTargetVelocity(0.0);
|
||||||
|
} else {
|
||||||
|
const double dir_dot =
|
||||||
|
clamp(current_angular_dir_base_.dot(w_target_dir), -1.0, 1.0);
|
||||||
|
const bool axis_aligned = dir_dot >= AXIS_LOCK_COS_THRESHOLD;
|
||||||
|
const bool reverse_aligned = dir_dot <= -AXIS_LOCK_COS_THRESHOLD;
|
||||||
|
const bool same_axis = axis_aligned || reverse_aligned;
|
||||||
|
// 角速度与线速度一致:反向同轴也必须先减速到 0,再切方向。
|
||||||
|
const bool must_switch_axis = !same_axis || reverse_aligned;
|
||||||
|
|
||||||
|
if (must_switch_axis && w_cur_norm > angular_switch_speed_threshold_) {
|
||||||
|
angular_norm_planner_.setTargetVelocity(0.0);
|
||||||
|
} else {
|
||||||
|
current_angular_dir_base_ = w_target_dir;
|
||||||
|
angular_norm_planner_.setTargetVelocity(w_des_norm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const double w_exec_norm = angular_norm_planner_.update(dt);
|
||||||
|
twist_base_.tail<3>() = current_angular_dir_base_ * w_exec_norm;
|
||||||
|
|
||||||
|
// ==================== 对最终 twist 做差分得到 acc / jerk ====================
|
||||||
|
if (dt > EPSILON) {
|
||||||
|
acceleration_base_ = (twist_base_ - prev_twist_base_) / dt;
|
||||||
|
jerk_base_ = (acceleration_base_ - prev_acceleration_base_) / dt;
|
||||||
|
} else {
|
||||||
|
acceleration_base_.setZero();
|
||||||
|
jerk_base_.setZero();
|
||||||
|
}
|
||||||
|
|
||||||
|
prev_twist_base_ = twist_base_;
|
||||||
|
prev_acceleration_base_ = acceleration_base_;
|
||||||
|
|
||||||
|
return twist_base_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CartesianTwistLimiter::isMoving() const
|
||||||
|
{
|
||||||
|
return linear_norm_planner_.isMoving() || angular_norm_planner_.isMoving();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace cmvr
|
||||||
@ -0,0 +1,732 @@
|
|||||||
|
//
|
||||||
|
// Created by lgv on 2026/3/10.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
#include <Eigen/Core>
|
||||||
|
#include <matplot/matplot.h>
|
||||||
|
|
||||||
|
#include "planner/cartesian_space_planner/include/cartesian_twist_limiter.h"
|
||||||
|
|
||||||
|
namespace cmvr
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
|
using Twist = CartesianTwistLimiter::Twist;
|
||||||
|
|
||||||
|
constexpr double kDt = 0.01;
|
||||||
|
constexpr double kComponentEps = 1e-8;
|
||||||
|
constexpr double kDirectionEps = 1e-6;
|
||||||
|
constexpr double kSwitchSpeedUpperBound = 0.05;
|
||||||
|
|
||||||
|
Twist makeTwist(double vx, double vy, double vz, double wx, double wy, double wz)
|
||||||
|
{
|
||||||
|
Twist twist = Twist::Zero();
|
||||||
|
twist << vx, vy, vz, wx, wy, wz;
|
||||||
|
return twist;
|
||||||
|
}
|
||||||
|
|
||||||
|
Eigen::Vector3d normalizedOrZero(const Eigen::Vector3d& value)
|
||||||
|
{
|
||||||
|
const double norm = value.norm();
|
||||||
|
if (norm <= kComponentEps) {
|
||||||
|
return Eigen::Vector3d::Zero();
|
||||||
|
}
|
||||||
|
return value / norm;
|
||||||
|
}
|
||||||
|
|
||||||
|
CartesianTwistLimiter makeLimiter()
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter limiter;
|
||||||
|
limiter.setLinearConstraints(1.0, 1.0, 5.0);
|
||||||
|
limiter.setAngularConstraints(1.0, 1.0, 5.0);
|
||||||
|
limiter.initialize();
|
||||||
|
return limiter;
|
||||||
|
}
|
||||||
|
|
||||||
|
Twist linearTargetAtTime(double t)
|
||||||
|
{
|
||||||
|
if (t < 1.0) {
|
||||||
|
return makeTwist(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
if (t < 3.5) {
|
||||||
|
return makeTwist(0.8, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
if (t < 6.0) {
|
||||||
|
return makeTwist(-0.8, 0.6, 0.2, 0.0, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
if (t < 8.5) {
|
||||||
|
return makeTwist(-0.7, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
return makeTwist(-0.7, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Twist angularTargetAtTime(double t)
|
||||||
|
{
|
||||||
|
if (t < 1.0) {
|
||||||
|
return makeTwist(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
if (t < 3.5) {
|
||||||
|
return makeTwist(0.0, 0.0, 0.0, 0.8, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
if (t < 6.0) {
|
||||||
|
return makeTwist(0.0, 0.0, 0.0, -0.8, 0, 0);
|
||||||
|
}
|
||||||
|
if (t < 8.5) {
|
||||||
|
return makeTwist(0.0, 0.0, 0.0, -0.6, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
return makeTwist(0.0, 0.0, 0.0, -0.6, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Twist synchronizeTargetAtTime(double t)
|
||||||
|
{
|
||||||
|
if (t < 1.0) {
|
||||||
|
return makeTwist(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
if (t < 3.5) {
|
||||||
|
return makeTwist(0.8, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
if (t < 6.0) {
|
||||||
|
return makeTwist(0.0, 0.7, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
if (t < 8.0) {
|
||||||
|
return makeTwist(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
return makeTwist(-0.6, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
TEST(CARTESIAN_TWIST_LIMITER_TEST, LinearDirectionRemainsLockedForFixedTarget)
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter limiter = makeLimiter();
|
||||||
|
const Eigen::Matrix3d base_R_tool = Eigen::Matrix3d::Identity();
|
||||||
|
|
||||||
|
const Eigen::Vector3d expected_dir = normalizedOrZero(Eigen::Vector3d(0.8, 0.6, 0.0));
|
||||||
|
limiter.setTargetTwist(makeTwist(0.8, 0.6, 0.0, 0.0, 0.0, 0.0), CartesianFrame::Base);
|
||||||
|
|
||||||
|
double max_speed = 0.0;
|
||||||
|
for (int i = 0; i < 400; ++i) {
|
||||||
|
const Twist twist = limiter.update(kDt, base_R_tool);
|
||||||
|
const Eigen::Vector3d linear = twist.head<3>();
|
||||||
|
max_speed = std::max(max_speed, linear.norm());
|
||||||
|
|
||||||
|
if (linear.norm() > kComponentEps) {
|
||||||
|
const Eigen::Vector3d dir = linear.normalized();
|
||||||
|
EXPECT_LT(dir.cross(expected_dir).norm(), kDirectionEps) << "step=" << i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_GT(max_speed, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CARTESIAN_TWIST_LIMITER_TEST, LinearReverseStopsBeforeSwitchingDirection)
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter limiter = makeLimiter();
|
||||||
|
const Eigen::Matrix3d base_R_tool = Eigen::Matrix3d::Identity();
|
||||||
|
|
||||||
|
limiter.setTargetTwist(makeTwist(0.8, 0.0, 0.0, 0.0, 0.0, 0.0), CartesianFrame::Base);
|
||||||
|
|
||||||
|
double speed_before_switch = 0.0;
|
||||||
|
for (int i = 0; i < 200; ++i) {
|
||||||
|
const Twist twist = limiter.update(kDt, base_R_tool);
|
||||||
|
if (twist.head<3>().norm() > 0.2) {
|
||||||
|
speed_before_switch = twist.head<3>().norm();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_GT(speed_before_switch, 0.2);
|
||||||
|
|
||||||
|
limiter.setTargetTwist(makeTwist(-0.8, 0.0, 0.0, 0.0, 0.0, 0.0), CartesianFrame::Base);
|
||||||
|
|
||||||
|
bool negative_x_seen = false;
|
||||||
|
double speed_when_negative_x_appears = 0.0;
|
||||||
|
for (int i = 0; i < 500; ++i) {
|
||||||
|
const Twist twist = limiter.update(kDt, base_R_tool);
|
||||||
|
EXPECT_NEAR(twist.y(), 0.0, kComponentEps);
|
||||||
|
EXPECT_NEAR(twist.z(), 0.0, kComponentEps);
|
||||||
|
|
||||||
|
if (!negative_x_seen && twist.x() < -kComponentEps) {
|
||||||
|
negative_x_seen = true;
|
||||||
|
speed_when_negative_x_appears = twist.head<3>().norm();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!negative_x_seen) {
|
||||||
|
EXPECT_GE(twist.x(), -kComponentEps);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_TRUE(negative_x_seen);
|
||||||
|
EXPECT_LT(speed_when_negative_x_appears, kSwitchSpeedUpperBound);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CARTESIAN_TWIST_LIMITER_TEST, LinearNonCollinearSwitchStopsBeforeChangingAxis)
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter limiter = makeLimiter();
|
||||||
|
const Eigen::Matrix3d base_R_tool = Eigen::Matrix3d::Identity();
|
||||||
|
|
||||||
|
limiter.setTargetTwist(makeTwist(0.8, 0.0, 0.0, 0.0, 0.0, 0.0), CartesianFrame::Base);
|
||||||
|
|
||||||
|
for (int i = 0; i < 200; ++i) {
|
||||||
|
if (limiter.update(kDt, base_R_tool).head<3>().norm() > 0.2) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
limiter.setTargetTwist(makeTwist(0.0, 0.8, 0.0, 0.0, 0.0, 0.0), CartesianFrame::Base);
|
||||||
|
|
||||||
|
bool y_seen = false;
|
||||||
|
double speed_when_y_appears = 0.0;
|
||||||
|
for (int i = 0; i < 500; ++i) {
|
||||||
|
const Twist twist = limiter.update(kDt, base_R_tool);
|
||||||
|
EXPECT_NEAR(twist.z(), 0.0, kComponentEps);
|
||||||
|
|
||||||
|
if (!y_seen && std::abs(twist.y()) > kComponentEps) {
|
||||||
|
y_seen = true;
|
||||||
|
speed_when_y_appears = twist.head<3>().norm();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!y_seen) {
|
||||||
|
EXPECT_NEAR(twist.y(), 0.0, kComponentEps);
|
||||||
|
EXPECT_GE(twist.x(), -kComponentEps);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_TRUE(y_seen);
|
||||||
|
EXPECT_LT(speed_when_y_appears, kSwitchSpeedUpperBound);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CARTESIAN_TWIST_LIMITER_TEST, AngularNonCollinearSwitchStopsBeforeChangingAxis)
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter limiter = makeLimiter();
|
||||||
|
const Eigen::Matrix3d base_R_tool = Eigen::Matrix3d::Identity();
|
||||||
|
|
||||||
|
limiter.setTargetTwist(makeTwist(0.0, 0.0, 0.0, 0.8, 0.0, 0.0), CartesianFrame::Base);
|
||||||
|
|
||||||
|
for (int i = 0; i < 200; ++i) {
|
||||||
|
if (limiter.update(kDt, base_R_tool).tail<3>().norm() > 0.2) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
limiter.setTargetTwist(makeTwist(0.0, 0.0, 0.0, 0.0, 0.0, 0.8), CartesianFrame::Base);
|
||||||
|
|
||||||
|
bool z_seen = false;
|
||||||
|
double speed_when_z_appears = 0.0;
|
||||||
|
for (int i = 0; i < 500; ++i) {
|
||||||
|
const Twist twist = limiter.update(kDt, base_R_tool);
|
||||||
|
EXPECT_NEAR(twist(4), 0.0, kComponentEps);
|
||||||
|
|
||||||
|
if (!z_seen && std::abs(twist(5)) > kComponentEps) {
|
||||||
|
z_seen = true;
|
||||||
|
speed_when_z_appears = twist.tail<3>().norm();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!z_seen) {
|
||||||
|
EXPECT_NEAR(twist(5), 0.0, kComponentEps);
|
||||||
|
EXPECT_GE(twist(3), -kComponentEps);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_TRUE(z_seen);
|
||||||
|
EXPECT_LT(speed_when_z_appears, kSwitchSpeedUpperBound);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CARTESIAN_TWIST_LIMITER_TEST, StopKeepsCurrentLinearDirection)
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter limiter = makeLimiter();
|
||||||
|
const Eigen::Matrix3d base_R_tool = Eigen::Matrix3d::Identity();
|
||||||
|
|
||||||
|
limiter.setTargetTwist(makeTwist(0.8, 0.6, 0.0, 0.0, 0.0, 0.0), CartesianFrame::Base);
|
||||||
|
|
||||||
|
Eigen::Vector3d moving_dir = Eigen::Vector3d::Zero();
|
||||||
|
for (int i = 0; i < 300; ++i) {
|
||||||
|
const Twist twist = limiter.update(kDt, base_R_tool);
|
||||||
|
if (twist.head<3>().norm() > 0.2) {
|
||||||
|
moving_dir = twist.head<3>().normalized();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_GT(moving_dir.norm(), 0.5);
|
||||||
|
|
||||||
|
limiter.stop();
|
||||||
|
|
||||||
|
double final_speed = 0.0;
|
||||||
|
for (int i = 0; i < 400; ++i) {
|
||||||
|
const Twist twist = limiter.update(kDt, base_R_tool);
|
||||||
|
final_speed = twist.head<3>().norm();
|
||||||
|
if (final_speed > kComponentEps) {
|
||||||
|
EXPECT_LT(twist.head<3>().normalized().cross(moving_dir).norm(), kDirectionEps)
|
||||||
|
<< "step=" << i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_LT(final_speed, 1e-4);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CARTESIAN_TWIST_LIMITER_TEST, SynchronizeWithoutKeepingTargetClearsOldCommand)
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter limiter = makeLimiter();
|
||||||
|
const Eigen::Matrix3d base_R_tool = Eigen::Matrix3d::Identity();
|
||||||
|
|
||||||
|
limiter.setTargetTwist(makeTwist(0.8, 0.0, 0.0, 0.0, 0.0, 0.0), CartesianFrame::Base);
|
||||||
|
for (int i = 0; i < 80; ++i) {
|
||||||
|
limiter.update(kDt, base_R_tool);
|
||||||
|
}
|
||||||
|
|
||||||
|
limiter.synchronize(Twist::Zero(), kDt, false);
|
||||||
|
|
||||||
|
EXPECT_NEAR(limiter.getTargetTwistBase().norm(), 0.0, kComponentEps);
|
||||||
|
|
||||||
|
for (int i = 0; i < 50; ++i) {
|
||||||
|
const Twist twist = limiter.update(kDt, base_R_tool);
|
||||||
|
EXPECT_NEAR(twist.norm(), 0.0, kComponentEps) << "step=" << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_FALSE(limiter.isMoving());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CARTESIAN_TWIST_LIMITER_TEST, SynchronizeKeepingTargetContinuesTowardExistingCommand)
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter limiter = makeLimiter();
|
||||||
|
const Eigen::Matrix3d base_R_tool = Eigen::Matrix3d::Identity();
|
||||||
|
|
||||||
|
limiter.setTargetTwist(makeTwist(0.8, 0.0, 0.0, 0.0, 0.0, 0.0), CartesianFrame::Base);
|
||||||
|
for (int i = 0; i < 120; ++i) {
|
||||||
|
limiter.update(kDt, base_R_tool);
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_GT(limiter.getTwistBase().x(), 0.2);
|
||||||
|
|
||||||
|
const Twist measured_twist = makeTwist(0.15, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
limiter.synchronize(measured_twist, kDt, true);
|
||||||
|
|
||||||
|
EXPECT_NEAR(limiter.getTwistBase().x(), 0.15, kComponentEps);
|
||||||
|
EXPECT_NEAR(limiter.getTwistBase().y(), 0.0, kComponentEps);
|
||||||
|
EXPECT_NEAR(limiter.getTwistBase().z(), 0.0, kComponentEps);
|
||||||
|
|
||||||
|
double max_resumed_speed = measured_twist.x();
|
||||||
|
for (int i = 0; i < 200; ++i) {
|
||||||
|
const Twist twist = limiter.update(kDt, base_R_tool);
|
||||||
|
EXPECT_NEAR(twist.y(), 0.0, kComponentEps);
|
||||||
|
EXPECT_NEAR(twist.z(), 0.0, kComponentEps);
|
||||||
|
max_resumed_speed = std::max(max_resumed_speed, twist.head<3>().norm());
|
||||||
|
if (max_resumed_speed > 0.4) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_GT(max_resumed_speed, 0.4);
|
||||||
|
EXPECT_GT(limiter.getTargetTwistBase().x(), 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CARTESIAN_TWIST_LIMITER_TEST, EmergencyStopStopsFasterThanNormalStopAndAcceptsNewTarget)
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter normal_limiter = makeLimiter();
|
||||||
|
CartesianTwistLimiter emergency_limiter = makeLimiter();
|
||||||
|
const Eigen::Matrix3d base_R_tool = Eigen::Matrix3d::Identity();
|
||||||
|
|
||||||
|
const Twist forward_twist = makeTwist(0.8, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
normal_limiter.setTargetTwist(forward_twist, CartesianFrame::Base);
|
||||||
|
emergency_limiter.setTargetTwist(forward_twist, CartesianFrame::Base);
|
||||||
|
|
||||||
|
for (int i = 0; i < 250; ++i) {
|
||||||
|
normal_limiter.update(kDt, base_R_tool);
|
||||||
|
emergency_limiter.update(kDt, base_R_tool);
|
||||||
|
}
|
||||||
|
|
||||||
|
const double start_speed = normal_limiter.getTwistBase().head<3>().norm();
|
||||||
|
ASSERT_GT(start_speed, 0.2);
|
||||||
|
ASSERT_NEAR(emergency_limiter.getTwistBase().head<3>().norm(), start_speed, 1e-3);
|
||||||
|
|
||||||
|
normal_limiter.stop();
|
||||||
|
emergency_limiter.emergencyStop(3.0, 20.0);
|
||||||
|
|
||||||
|
int normal_stop_steps = -1;
|
||||||
|
int emergency_stop_steps = -1;
|
||||||
|
for (int i = 0; i < 500; ++i) {
|
||||||
|
const double normal_speed = normal_limiter.update(kDt, base_R_tool).head<3>().norm();
|
||||||
|
const double emergency_speed = emergency_limiter.update(kDt, base_R_tool).head<3>().norm();
|
||||||
|
|
||||||
|
if (normal_stop_steps < 0 && normal_speed < 1e-3) {
|
||||||
|
normal_stop_steps = i;
|
||||||
|
}
|
||||||
|
if (emergency_stop_steps < 0 && emergency_speed < 1e-3) {
|
||||||
|
emergency_stop_steps = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (normal_stop_steps >= 0 && emergency_stop_steps >= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_GE(normal_stop_steps, 0);
|
||||||
|
ASSERT_GE(emergency_stop_steps, 0);
|
||||||
|
EXPECT_LT(emergency_stop_steps, normal_stop_steps);
|
||||||
|
|
||||||
|
const Twist restart_twist = makeTwist(-0.4, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
emergency_limiter.setTargetTwist(restart_twist, CartesianFrame::Base);
|
||||||
|
|
||||||
|
double restarted_speed = 0.0;
|
||||||
|
double restarted_x = 0.0;
|
||||||
|
for (int i = 0; i < 300; ++i) {
|
||||||
|
const Twist twist = emergency_limiter.update(kDt, base_R_tool);
|
||||||
|
restarted_speed = twist.head<3>().norm();
|
||||||
|
restarted_x = twist.x();
|
||||||
|
if (restarted_speed > 0.2) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_GT(restarted_speed, 0.2);
|
||||||
|
EXPECT_LT(restarted_x, -0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CARTESIAN_TWIST_LIMITER_TEST, PlotLinearVelocityComponentsAndNorm)
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter limiter = makeLimiter();
|
||||||
|
const Eigen::Matrix3d base_R_tool = Eigen::Matrix3d::Identity();
|
||||||
|
|
||||||
|
std::vector<double> time;
|
||||||
|
std::vector<double> vx;
|
||||||
|
std::vector<double> vy;
|
||||||
|
std::vector<double> vz;
|
||||||
|
std::vector<double> speed;
|
||||||
|
std::vector<double> target_speed;
|
||||||
|
std::vector<double> ax;
|
||||||
|
std::vector<double> ay;
|
||||||
|
std::vector<double> az;
|
||||||
|
std::vector<double> accel;
|
||||||
|
std::vector<double> jx;
|
||||||
|
std::vector<double> jy;
|
||||||
|
std::vector<double> jz;
|
||||||
|
std::vector<double> jerk;
|
||||||
|
|
||||||
|
constexpr double kEmergencyTime = 8.5;
|
||||||
|
constexpr double kRestartTime = 10.0;
|
||||||
|
constexpr double kTotalTime = 14.0;
|
||||||
|
const int steps = static_cast<int>(kTotalTime / kDt);
|
||||||
|
|
||||||
|
time.reserve(steps + 1);
|
||||||
|
vx.reserve(steps + 1);
|
||||||
|
vy.reserve(steps + 1);
|
||||||
|
vz.reserve(steps + 1);
|
||||||
|
speed.reserve(steps + 1);
|
||||||
|
target_speed.reserve(steps + 1);
|
||||||
|
ax.reserve(steps + 1);
|
||||||
|
ay.reserve(steps + 1);
|
||||||
|
az.reserve(steps + 1);
|
||||||
|
accel.reserve(steps + 1);
|
||||||
|
jx.reserve(steps + 1);
|
||||||
|
jy.reserve(steps + 1);
|
||||||
|
jz.reserve(steps + 1);
|
||||||
|
jerk.reserve(steps + 1);
|
||||||
|
|
||||||
|
bool emergency_stop_called = false;
|
||||||
|
bool restart_called = false;
|
||||||
|
for (int i = 0; i <= steps; ++i) {
|
||||||
|
const double t = i * kDt;
|
||||||
|
if (t < kEmergencyTime) {
|
||||||
|
limiter.setTargetTwist(linearTargetAtTime(t), CartesianFrame::Base);
|
||||||
|
} else if (!emergency_stop_called) {
|
||||||
|
limiter.emergencyStop(10.0, 50.0);
|
||||||
|
emergency_stop_called = true;
|
||||||
|
} else if (t >= kRestartTime && !restart_called) {
|
||||||
|
limiter.setTargetTwist(makeTwist(0.0, -0.6, 0.0, 0.0, 0.0, 0.0), CartesianFrame::Base);
|
||||||
|
restart_called = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Twist twist = limiter.update(kDt, base_R_tool);
|
||||||
|
const Twist target = limiter.getTargetTwistBase();
|
||||||
|
const Twist acceleration = limiter.getAccelerationBase();
|
||||||
|
const Twist current_jerk = limiter.getJerkBase();
|
||||||
|
|
||||||
|
time.push_back(t);
|
||||||
|
vx.push_back(twist.x());
|
||||||
|
vy.push_back(twist.y());
|
||||||
|
vz.push_back(twist.z());
|
||||||
|
speed.push_back(twist.head<3>().norm());
|
||||||
|
target_speed.push_back(target.head<3>().norm());
|
||||||
|
ax.push_back(acceleration.x());
|
||||||
|
ay.push_back(acceleration.y());
|
||||||
|
az.push_back(acceleration.z());
|
||||||
|
accel.push_back(acceleration.head<3>().norm());
|
||||||
|
jx.push_back(current_jerk.x());
|
||||||
|
jy.push_back(current_jerk.y());
|
||||||
|
jz.push_back(current_jerk.z());
|
||||||
|
jerk.push_back(current_jerk.head<3>().norm());
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace matplot;
|
||||||
|
|
||||||
|
auto configure_axes = [](const axes_handle& axes) {
|
||||||
|
axes->line_width(1.5f);
|
||||||
|
grid(axes, on);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto style_line = [](const auto& line, std::initializer_list<float> color, double width) {
|
||||||
|
line->line_width(width);
|
||||||
|
line->color(color);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto fig = figure(true);
|
||||||
|
fig->size(1600, 1200);
|
||||||
|
fig->font_size(16);
|
||||||
|
|
||||||
|
auto ax_v = subplot(fig, std::array<float, 4>{0.07f, 0.69f, 0.88f, 0.24f});
|
||||||
|
hold(ax_v, on);
|
||||||
|
style_line(plot(ax_v, time, vx), {0.86f, 0.16f, 0.16f}, 3.0);
|
||||||
|
style_line(plot(ax_v, time, vy), {0.16f, 0.47f, 0.80f}, 3.0);
|
||||||
|
style_line(plot(ax_v, time, vz), {0.12f, 0.62f, 0.42f}, 3.0);
|
||||||
|
style_line(plot(ax_v, time, speed), {0.10f, 0.10f, 0.10f}, 3.5);
|
||||||
|
auto line_target_speed = plot(ax_v, time, target_speed);
|
||||||
|
line_target_speed->line_width(2.5);
|
||||||
|
line_target_speed->line_style("--");
|
||||||
|
line_target_speed->color({0.80f, 0.55f, 0.10f});
|
||||||
|
title(ax_v, "CartesianTwistLimiter Linear Velocity With Emergency Stop And Restart");
|
||||||
|
xlabel(ax_v, "time [s]");
|
||||||
|
ylabel(ax_v, "velocity [m/s]");
|
||||||
|
legend(ax_v, {"vx", "vy", "vz", "speed", "target speed"});
|
||||||
|
configure_axes(ax_v);
|
||||||
|
|
||||||
|
auto ax_a = subplot(fig, std::array<float, 4>{0.07f, 0.38f, 0.88f, 0.24f});
|
||||||
|
hold(ax_a, on);
|
||||||
|
style_line(plot(ax_a, time, ax), {0.86f, 0.16f, 0.16f}, 3.0);
|
||||||
|
style_line(plot(ax_a, time, ay), {0.16f, 0.47f, 0.80f}, 3.0);
|
||||||
|
style_line(plot(ax_a, time, az), {0.12f, 0.62f, 0.42f}, 3.0);
|
||||||
|
style_line(plot(ax_a, time, accel), {0.10f, 0.10f, 0.10f}, 3.5);
|
||||||
|
title(ax_a, "CartesianTwistLimiter Linear Acceleration");
|
||||||
|
xlabel(ax_a, "time [s]");
|
||||||
|
ylabel(ax_a, "acceleration [m/s^2]");
|
||||||
|
legend(ax_a, {"ax", "ay", "az", "acc norm"});
|
||||||
|
configure_axes(ax_a);
|
||||||
|
|
||||||
|
auto ax_j = subplot(fig, std::array<float, 4>{0.07f, 0.07f, 0.88f, 0.24f});
|
||||||
|
hold(ax_j, on);
|
||||||
|
style_line(plot(ax_j, time, jx), {0.86f, 0.16f, 0.16f}, 3.0);
|
||||||
|
style_line(plot(ax_j, time, jy), {0.16f, 0.47f, 0.80f}, 3.0);
|
||||||
|
style_line(plot(ax_j, time, jz), {0.12f, 0.62f, 0.42f}, 3.0);
|
||||||
|
style_line(plot(ax_j, time, jerk), {0.10f, 0.10f, 0.10f}, 3.5);
|
||||||
|
title(ax_j, "CartesianTwistLimiter Linear Jerk");
|
||||||
|
xlabel(ax_j, "time [s]");
|
||||||
|
ylabel(ax_j, "jerk [m/s^3]");
|
||||||
|
legend(ax_j, {"jx", "jy", "jz", "jerk norm"});
|
||||||
|
configure_axes(ax_j);
|
||||||
|
|
||||||
|
show(fig);
|
||||||
|
cla();
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CARTESIAN_TWIST_LIMITER_TEST, PlotAngularVelocityComponentsAndNorm)
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter limiter = makeLimiter();
|
||||||
|
const Eigen::Matrix3d base_R_tool = Eigen::Matrix3d::Identity();
|
||||||
|
|
||||||
|
std::vector<double> time;
|
||||||
|
std::vector<double> wx;
|
||||||
|
std::vector<double> wy;
|
||||||
|
std::vector<double> wz;
|
||||||
|
std::vector<double> omega;
|
||||||
|
std::vector<double> target_omega;
|
||||||
|
|
||||||
|
constexpr double kEmergencyTime = 8.5;
|
||||||
|
constexpr double kRestartTime = 10.0;
|
||||||
|
constexpr double kTotalTime = 14.0;
|
||||||
|
const int steps = static_cast<int>(kTotalTime / kDt);
|
||||||
|
|
||||||
|
time.reserve(steps + 1);
|
||||||
|
wx.reserve(steps + 1);
|
||||||
|
wy.reserve(steps + 1);
|
||||||
|
wz.reserve(steps + 1);
|
||||||
|
omega.reserve(steps + 1);
|
||||||
|
target_omega.reserve(steps + 1);
|
||||||
|
|
||||||
|
bool emergency_stop_called = false;
|
||||||
|
bool restart_called = false;
|
||||||
|
for (int i = 0; i <= steps; ++i) {
|
||||||
|
const double t = i * kDt;
|
||||||
|
if (t < kEmergencyTime) {
|
||||||
|
limiter.setTargetTwist(angularTargetAtTime(t), CartesianFrame::Base);
|
||||||
|
} else if (!emergency_stop_called) {
|
||||||
|
limiter.emergencyStop(10.0, 50.0);
|
||||||
|
emergency_stop_called = true;
|
||||||
|
} else if (t >= kRestartTime && !restart_called) {
|
||||||
|
limiter.setTargetTwist(makeTwist(0.0, 0.0, 0.0, 0.0, 0.0, -0.5), CartesianFrame::Base);
|
||||||
|
restart_called = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Twist twist = limiter.update(kDt, base_R_tool);
|
||||||
|
const Twist target = limiter.getTargetTwistBase();
|
||||||
|
|
||||||
|
time.push_back(t);
|
||||||
|
wx.push_back(twist(3));
|
||||||
|
wy.push_back(twist(4));
|
||||||
|
wz.push_back(twist(5));
|
||||||
|
omega.push_back(twist.tail<3>().norm());
|
||||||
|
target_omega.push_back(target.tail<3>().norm());
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace matplot;
|
||||||
|
|
||||||
|
auto configure_axes = [](const axes_handle& axes) {
|
||||||
|
axes->line_width(1.5f);
|
||||||
|
grid(axes, on);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto style_line = [](const auto& line, std::initializer_list<float> color, double width) {
|
||||||
|
line->line_width(width);
|
||||||
|
line->color(color);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto fig = figure(true);
|
||||||
|
fig->size(1600, 520);
|
||||||
|
fig->font_size(16);
|
||||||
|
|
||||||
|
auto ax = subplot(fig, std::array<float, 4>{0.07f, 0.14f, 0.88f, 0.74f});
|
||||||
|
hold(ax, on);
|
||||||
|
style_line(plot(ax, time, wx), {0.86f, 0.16f, 0.16f}, 3.0);
|
||||||
|
style_line(plot(ax, time, wy), {0.16f, 0.47f, 0.80f}, 3.0);
|
||||||
|
style_line(plot(ax, time, wz), {0.12f, 0.62f, 0.42f}, 3.0);
|
||||||
|
style_line(plot(ax, time, omega), {0.10f, 0.10f, 0.10f}, 3.5);
|
||||||
|
auto line_target_omega = plot(ax, time, target_omega);
|
||||||
|
line_target_omega->line_width(2.5);
|
||||||
|
line_target_omega->line_style("--");
|
||||||
|
line_target_omega->color({0.80f, 0.55f, 0.10f});
|
||||||
|
title(ax, "CartesianTwistLimiter Angular Velocity With Emergency Stop And Restart");
|
||||||
|
xlabel(ax, "time [s]");
|
||||||
|
ylabel(ax, "angular velocity [rad/s]");
|
||||||
|
legend(ax, {"wx", "wy", "wz", "omega", "target omega"});
|
||||||
|
configure_axes(ax);
|
||||||
|
|
||||||
|
show(fig);
|
||||||
|
cla();
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CARTESIAN_TWIST_LIMITER_TEST, PlotSynchronizeTrackingWithMeasuredTwist)
|
||||||
|
{
|
||||||
|
CartesianTwistLimiter limiter = makeLimiter();
|
||||||
|
const Eigen::Matrix3d base_R_tool = Eigen::Matrix3d::Identity();
|
||||||
|
|
||||||
|
Twist measured_twist = Twist::Zero();
|
||||||
|
|
||||||
|
std::vector<double> time;
|
||||||
|
std::vector<double> target_speed;
|
||||||
|
std::vector<double> commanded_speed;
|
||||||
|
std::vector<double> measured_speed;
|
||||||
|
std::vector<double> commanded_vx;
|
||||||
|
std::vector<double> commanded_vy;
|
||||||
|
std::vector<double> measured_vx;
|
||||||
|
std::vector<double> measured_vy;
|
||||||
|
std::vector<double> tracking_error;
|
||||||
|
std::vector<double> acc_norm;
|
||||||
|
std::vector<double> jerk_norm;
|
||||||
|
|
||||||
|
constexpr double kTotalTime = 10.0;
|
||||||
|
constexpr double kTrackingTau = 0.08;
|
||||||
|
const double alpha = kDt / (kTrackingTau + kDt);
|
||||||
|
const int steps = static_cast<int>(kTotalTime / kDt);
|
||||||
|
|
||||||
|
time.reserve(steps + 1);
|
||||||
|
target_speed.reserve(steps + 1);
|
||||||
|
commanded_speed.reserve(steps + 1);
|
||||||
|
measured_speed.reserve(steps + 1);
|
||||||
|
commanded_vx.reserve(steps + 1);
|
||||||
|
commanded_vy.reserve(steps + 1);
|
||||||
|
measured_vx.reserve(steps + 1);
|
||||||
|
measured_vy.reserve(steps + 1);
|
||||||
|
tracking_error.reserve(steps + 1);
|
||||||
|
acc_norm.reserve(steps + 1);
|
||||||
|
jerk_norm.reserve(steps + 1);
|
||||||
|
|
||||||
|
for (int i = 0; i <= steps; ++i) {
|
||||||
|
const double t = i * kDt;
|
||||||
|
const Twist target = synchronizeTargetAtTime(t);
|
||||||
|
|
||||||
|
limiter.synchronize(measured_twist, kDt, true);
|
||||||
|
limiter.setTargetTwist(target, CartesianFrame::Base);
|
||||||
|
const Twist commanded = limiter.update(kDt, base_R_tool);
|
||||||
|
|
||||||
|
measured_twist += alpha * (commanded - measured_twist);
|
||||||
|
|
||||||
|
time.push_back(t);
|
||||||
|
target_speed.push_back(target.head<3>().norm());
|
||||||
|
commanded_speed.push_back(commanded.head<3>().norm());
|
||||||
|
measured_speed.push_back(measured_twist.head<3>().norm());
|
||||||
|
commanded_vx.push_back(commanded.x());
|
||||||
|
commanded_vy.push_back(commanded.y());
|
||||||
|
measured_vx.push_back(measured_twist.x());
|
||||||
|
measured_vy.push_back(measured_twist.y());
|
||||||
|
tracking_error.push_back((commanded.head<3>() - measured_twist.head<3>()).norm());
|
||||||
|
acc_norm.push_back(limiter.getAccelerationBase().head<3>().norm());
|
||||||
|
jerk_norm.push_back(limiter.getJerkBase().head<3>().norm());
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace matplot;
|
||||||
|
|
||||||
|
auto configure_axes = [](const axes_handle& axes) {
|
||||||
|
axes->line_width(1.5f);
|
||||||
|
grid(axes, on);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto style_line = [](const auto& line, std::initializer_list<float> color, double width) {
|
||||||
|
line->line_width(width);
|
||||||
|
line->color(color);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto fig = figure(true);
|
||||||
|
fig->size(1600, 1200);
|
||||||
|
fig->font_size(16);
|
||||||
|
|
||||||
|
auto ax_speed = subplot(fig, std::array<float, 4>{0.07f, 0.69f, 0.88f, 0.24f});
|
||||||
|
hold(ax_speed, on);
|
||||||
|
auto line_target = plot(ax_speed, time, target_speed);
|
||||||
|
line_target->line_width(2.5);
|
||||||
|
line_target->line_style("--");
|
||||||
|
line_target->color({0.80f, 0.55f, 0.10f});
|
||||||
|
style_line(plot(ax_speed, time, commanded_speed), {0.10f, 0.10f, 0.10f}, 3.5);
|
||||||
|
style_line(plot(ax_speed, time, measured_speed), {0.55f, 0.12f, 0.72f}, 3.0);
|
||||||
|
title(ax_speed, "Synchronize: target / commanded / measured speed");
|
||||||
|
xlabel(ax_speed, "time [s]");
|
||||||
|
ylabel(ax_speed, "speed [m/s]");
|
||||||
|
legend(ax_speed, {"target speed", "commanded speed", "measured speed"});
|
||||||
|
configure_axes(ax_speed);
|
||||||
|
|
||||||
|
auto ax_components = subplot(fig, std::array<float, 4>{0.07f, 0.38f, 0.88f, 0.24f});
|
||||||
|
hold(ax_components, on);
|
||||||
|
style_line(plot(ax_components, time, commanded_vx), {0.86f, 0.16f, 0.16f}, 3.0);
|
||||||
|
auto line_measured_vx = plot(ax_components, time, measured_vx);
|
||||||
|
line_measured_vx->line_width(2.5);
|
||||||
|
line_measured_vx->line_style("--");
|
||||||
|
line_measured_vx->color({0.86f, 0.16f, 0.16f});
|
||||||
|
style_line(plot(ax_components, time, commanded_vy), {0.16f, 0.47f, 0.80f}, 3.0);
|
||||||
|
auto line_measured_vy = plot(ax_components, time, measured_vy);
|
||||||
|
line_measured_vy->line_width(2.5);
|
||||||
|
line_measured_vy->line_style("--");
|
||||||
|
line_measured_vy->color({0.16f, 0.47f, 0.80f});
|
||||||
|
title(ax_components, "Synchronize: commanded vs measured components");
|
||||||
|
xlabel(ax_components, "time [s]");
|
||||||
|
ylabel(ax_components, "velocity [m/s]");
|
||||||
|
legend(ax_components, {"cmd vx", "meas vx", "cmd vy", "meas vy"});
|
||||||
|
configure_axes(ax_components);
|
||||||
|
|
||||||
|
auto ax_dynamics = subplot(fig, std::array<float, 4>{0.07f, 0.07f, 0.88f, 0.24f});
|
||||||
|
hold(ax_dynamics, on);
|
||||||
|
style_line(plot(ax_dynamics, time, tracking_error), {0.10f, 0.10f, 0.10f}, 3.5);
|
||||||
|
style_line(plot(ax_dynamics, time, acc_norm), {0.12f, 0.62f, 0.42f}, 3.0);
|
||||||
|
style_line(plot(ax_dynamics, time, jerk_norm), {0.55f, 0.12f, 0.72f}, 3.0);
|
||||||
|
title(ax_dynamics, "Synchronize: tracking error / acceleration / jerk");
|
||||||
|
xlabel(ax_dynamics, "time [s]");
|
||||||
|
ylabel(ax_dynamics, "norm");
|
||||||
|
legend(ax_dynamics, {"|cmd - meas|", "acc norm", "jerk norm"});
|
||||||
|
configure_axes(ax_dynamics);
|
||||||
|
|
||||||
|
show(fig);
|
||||||
|
cla();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace cmvr
|
||||||
@ -0,0 +1,100 @@
|
|||||||
|
//
|
||||||
|
// Created by lgv on 2026/3/10.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "s_curve_velocity_planner.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace cmvr
|
||||||
|
{
|
||||||
|
|
||||||
|
struct SCurvePositionPlannerState
|
||||||
|
{
|
||||||
|
double position;
|
||||||
|
double velocity;
|
||||||
|
double acceleration;
|
||||||
|
double jerk;
|
||||||
|
double target_position;
|
||||||
|
bool is_moving;
|
||||||
|
|
||||||
|
SCurvePositionPlannerState()
|
||||||
|
: position(0.0)
|
||||||
|
, velocity(0.0)
|
||||||
|
, acceleration(0.0)
|
||||||
|
, jerk(0.0)
|
||||||
|
, target_position(0.0)
|
||||||
|
, is_moving(false)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 单轴位置跟踪规划器
|
||||||
|
*
|
||||||
|
* 结构:
|
||||||
|
* - 外环:position_error -> desired_velocity
|
||||||
|
* - 内环:SCurveVelocityPlanner1D 负责 jerk-limited 速度规划
|
||||||
|
*
|
||||||
|
* 这个类用于高频变化目标的位置跟踪,不承担严格点到点 profile 语义。
|
||||||
|
*/
|
||||||
|
class SCurvePositionPlanner1D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SCurvePositionPlanner1D(double max_velocity = 3.0,
|
||||||
|
double max_acceleration = 10.0,
|
||||||
|
double max_jerk = 50.0);
|
||||||
|
|
||||||
|
void setConstraints(double max_velocity, double max_acceleration, double max_jerk);
|
||||||
|
void getConstraints(double& max_velocity, double& max_acceleration, double& max_jerk) const;
|
||||||
|
|
||||||
|
void setPositionGain(double position_gain);
|
||||||
|
double getPositionGain() const { return position_gain_; }
|
||||||
|
|
||||||
|
void initialize(double position, double velocity = 0.0, double acceleration = 0.0);
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
void setTarget(double target_position);
|
||||||
|
double update(double dt);
|
||||||
|
|
||||||
|
const SCurvePositionPlannerState& getState() const { return state_; }
|
||||||
|
double getPosition() const { return state_.position; }
|
||||||
|
double getVelocity() const { return state_.velocity; }
|
||||||
|
double getAcceleration() const { return state_.acceleration; }
|
||||||
|
double getJerk() const { return state_.jerk; }
|
||||||
|
double getTargetPosition() const { return state_.target_position; }
|
||||||
|
bool isMoving() const { return state_.is_moving; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
double max_velocity_;
|
||||||
|
double max_acceleration_;
|
||||||
|
double max_jerk_;
|
||||||
|
|
||||||
|
SCurvePositionPlannerState state_;
|
||||||
|
SCurveVelocityPlanner1D velocity_planner_;
|
||||||
|
double position_gain_;
|
||||||
|
|
||||||
|
static constexpr double EPSILON = 1e-9;
|
||||||
|
static constexpr double VELOCITY_THRESHOLD = 1e-6;
|
||||||
|
static constexpr double ACCELERATION_THRESHOLD = 1e-6;
|
||||||
|
static constexpr double POSITION_THRESHOLD = 1e-7;
|
||||||
|
|
||||||
|
double computeDesiredVelocity(double position_error) const;
|
||||||
|
double computePlannerStoppingDistance(double velocity, double acceleration) const;
|
||||||
|
|
||||||
|
static double clamp(double value, double min_val, double max_val)
|
||||||
|
{
|
||||||
|
return std::max(min_val, std::min(max_val, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static double sign(double value)
|
||||||
|
{
|
||||||
|
if (value > EPSILON) return 1.0;
|
||||||
|
if (value < -EPSILON) return -1.0;
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace cmvr
|
||||||
@ -0,0 +1,240 @@
|
|||||||
|
//
|
||||||
|
// Created by lgv on 2026/3/9.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace cmvr
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 单次速度切换的 S 曲线剖面参数
|
||||||
|
*
|
||||||
|
* 本类表示从任意 (v0, a0) 连续规划到 (vf, 0) 的 3 段 jerk-limited profile:
|
||||||
|
*
|
||||||
|
* seg1: jerk = j1, duration = t1
|
||||||
|
* seg2: jerk = j2, duration = t2 (当前实现 j2 = 0)
|
||||||
|
* seg3: jerk = j3, duration = t3
|
||||||
|
*
|
||||||
|
* 其中 j1/j3 为 ±j_max,j2 为 0。
|
||||||
|
*/
|
||||||
|
struct SCurveVelocityProfile
|
||||||
|
{
|
||||||
|
double t1;
|
||||||
|
double t2;
|
||||||
|
double t3;
|
||||||
|
|
||||||
|
double total_time;
|
||||||
|
|
||||||
|
double j1;
|
||||||
|
double j2;
|
||||||
|
double j3;
|
||||||
|
|
||||||
|
double v0;
|
||||||
|
double a0;
|
||||||
|
double vf;
|
||||||
|
|
||||||
|
bool valid;
|
||||||
|
|
||||||
|
SCurveVelocityProfile()
|
||||||
|
: t1(0.0), t2(0.0), t3(0.0)
|
||||||
|
, total_time(0.0)
|
||||||
|
, j1(0.0), j2(0.0), j3(0.0)
|
||||||
|
, v0(0.0), a0(0.0), vf(0.0)
|
||||||
|
, valid(false)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief S 曲线速度规划器状态
|
||||||
|
*/
|
||||||
|
struct SCurveVelocityPlannerState
|
||||||
|
{
|
||||||
|
double velocity;
|
||||||
|
double acceleration;
|
||||||
|
double jerk;
|
||||||
|
|
||||||
|
double target_velocity;
|
||||||
|
|
||||||
|
double elapsed_time;
|
||||||
|
bool has_active_profile;
|
||||||
|
bool is_moving;
|
||||||
|
|
||||||
|
SCurveVelocityPlannerState()
|
||||||
|
: velocity(0.0)
|
||||||
|
, acceleration(0.0)
|
||||||
|
, jerk(0.0)
|
||||||
|
, target_velocity(0.0)
|
||||||
|
, elapsed_time(0.0)
|
||||||
|
, has_active_profile(false)
|
||||||
|
, is_moving(false)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 单轴速度型 S 曲线规划器
|
||||||
|
*
|
||||||
|
* 语义:
|
||||||
|
* - setTargetVelocity(v): 设置新目标并重规划
|
||||||
|
* - update(dt): 只采样当前 active profile
|
||||||
|
* - overwriteState(v,a): 仅覆盖当前状态并清掉旧 profile
|
||||||
|
* - synchronizeAndReplan(v,a): 用测量状态同步,并按当前目标重规划
|
||||||
|
*
|
||||||
|
* 数学目标:
|
||||||
|
* - 从任意 (v0, a0) 连续规划到 (vf, 0)
|
||||||
|
* - 满足 |v| <= v_max, |a| <= a_max, |j| <= j_max
|
||||||
|
*/
|
||||||
|
class SCurveVelocityPlanner1D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SCurveVelocityPlanner1D(double max_velocity = 1.0,
|
||||||
|
double max_acceleration = 1.0,
|
||||||
|
double max_jerk = 5.0);
|
||||||
|
|
||||||
|
void setConstraints(double max_velocity, double max_acceleration, double max_jerk);
|
||||||
|
void getConstraints(double& max_velocity, double& max_acceleration, double& max_jerk) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 设置目标变化阈值
|
||||||
|
*
|
||||||
|
* 目标变化量小于该阈值时,不触发重规划。
|
||||||
|
*/
|
||||||
|
void setTargetReplanThreshold(double threshold);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 设置同步反馈时的重规划阈值
|
||||||
|
*
|
||||||
|
* 测量速度与当前 profile 采样状态的偏差小于该阈值时,
|
||||||
|
* synchronizeAndReplan() 只对齐当前状态,不打断现有 profile。
|
||||||
|
*/
|
||||||
|
void setSynchronizeReplanThreshold(double threshold);
|
||||||
|
|
||||||
|
void initialize(double velocity = 0.0, double acceleration = 0.0);
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 仅覆盖当前状态,并清掉旧 profile
|
||||||
|
*
|
||||||
|
* 注意:
|
||||||
|
* - 这个接口不会自动重规划
|
||||||
|
* - 用于初始化、调试、或显式中断旧轨迹
|
||||||
|
*/
|
||||||
|
void overwriteState(double velocity,
|
||||||
|
double acceleration = 0.0,
|
||||||
|
bool keep_target_velocity = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 用测量状态同步,并按当前目标重新规划
|
||||||
|
*
|
||||||
|
* 这是闭环场景真正该用的接口。
|
||||||
|
*/
|
||||||
|
void synchronizeAndReplan(double velocity,
|
||||||
|
double acceleration = 0.0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 设置目标速度,并立即重规划
|
||||||
|
*/
|
||||||
|
void setTargetVelocity(double target_velocity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 平滑停下
|
||||||
|
*/
|
||||||
|
void stop() { setTargetVelocity(0.0); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 更新一步(只采样)
|
||||||
|
* @param dt 时间步长
|
||||||
|
* @return 当前采样后的速度
|
||||||
|
*/
|
||||||
|
double update(double dt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 计算单次速度切换剖面
|
||||||
|
*/
|
||||||
|
SCurveVelocityProfile calculateProfile(double start_velocity,
|
||||||
|
double end_velocity,
|
||||||
|
double start_acceleration = 0.0) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 给定剖面下,获取时刻 t 的速度
|
||||||
|
*/
|
||||||
|
double getVelocityAtTime(const SCurveVelocityProfile& profile, double t) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 给定剖面下,获取时刻 t 的加速度
|
||||||
|
*/
|
||||||
|
double getAccelerationAtTime(const SCurveVelocityProfile& profile, double t) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 给定剖面下,获取时刻 t 的 jerk
|
||||||
|
*/
|
||||||
|
double getJerkAtTime(const SCurveVelocityProfile& profile, double t) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 按固定时间间隔生成轨迹点
|
||||||
|
*/
|
||||||
|
void generateTrajectory(const SCurveVelocityProfile& profile, double dt,
|
||||||
|
std::vector<double>& velocities,
|
||||||
|
std::vector<double>& accelerations,
|
||||||
|
std::vector<double>& jerks) const;
|
||||||
|
|
||||||
|
const SCurveVelocityPlannerState& getState() const { return state_; }
|
||||||
|
const SCurveVelocityProfile& getActiveProfile() const { return active_profile_; }
|
||||||
|
|
||||||
|
double getVelocity() const { return state_.velocity; }
|
||||||
|
double getAcceleration() const { return state_.acceleration; }
|
||||||
|
double getJerk() const { return state_.jerk; }
|
||||||
|
double getTargetVelocity() const { return state_.target_velocity; }
|
||||||
|
bool hasActiveProfile() const { return state_.has_active_profile; }
|
||||||
|
bool isMoving() const { return state_.is_moving; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
double max_velocity_;
|
||||||
|
double max_acceleration_;
|
||||||
|
double max_jerk_;
|
||||||
|
|
||||||
|
double target_replan_threshold_;
|
||||||
|
double synchronize_replan_threshold_;
|
||||||
|
|
||||||
|
SCurveVelocityPlannerState state_;
|
||||||
|
SCurveVelocityProfile active_profile_;
|
||||||
|
|
||||||
|
static constexpr double EPSILON = 1e-9;
|
||||||
|
static constexpr double VELOCITY_THRESHOLD = 1e-6;
|
||||||
|
static constexpr double ACCELERATION_THRESHOLD = 1e-6;
|
||||||
|
static constexpr double DEFAULT_TARGET_REPLAN_THRESHOLD = 1e-9;
|
||||||
|
static constexpr double DEFAULT_SYNCHRONIZE_REPLAN_THRESHOLD = 5e-2;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void updateIsMovingFlag();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 判断 profile 是否满足速度上限
|
||||||
|
*/
|
||||||
|
bool isVelocityLimitSatisfied(const SCurveVelocityProfile& profile) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 计算完整剖面终点状态
|
||||||
|
*/
|
||||||
|
void integrateWholeProfile(const SCurveVelocityProfile& profile,
|
||||||
|
double& v_end,
|
||||||
|
double& a_end) const;
|
||||||
|
|
||||||
|
static double clamp(double value, double min_val, double max_val)
|
||||||
|
{
|
||||||
|
return std::max(min_val, std::min(max_val, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static double sign(double value)
|
||||||
|
{
|
||||||
|
if (value > EPSILON) return 1.0;
|
||||||
|
if (value < -EPSILON) return -1.0;
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace cmvr
|
||||||
191
cmvr-es/planner/s_curve_planner/src/s_curve_position_planner.cpp
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
//
|
||||||
|
// Created by lgv on 2026/3/10.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "../include/s_curve_position_planner.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace cmvr
|
||||||
|
{
|
||||||
|
|
||||||
|
SCurvePositionPlanner1D::SCurvePositionPlanner1D(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk)
|
||||||
|
: max_velocity_(std::abs(max_velocity))
|
||||||
|
, max_acceleration_(std::abs(max_acceleration))
|
||||||
|
, max_jerk_(std::abs(max_jerk))
|
||||||
|
, velocity_planner_(max_velocity_, max_acceleration_, max_jerk_)
|
||||||
|
, position_gain_(1.0)
|
||||||
|
{
|
||||||
|
velocity_planner_.setTargetReplanThreshold(std::max(1e-3, 0.02 * max_velocity_));
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurvePositionPlanner1D::setConstraints(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk)
|
||||||
|
{
|
||||||
|
max_velocity_ = std::abs(max_velocity);
|
||||||
|
max_acceleration_ = std::abs(max_acceleration);
|
||||||
|
max_jerk_ = std::abs(max_jerk);
|
||||||
|
velocity_planner_.setConstraints(max_velocity_, max_acceleration_, max_jerk_);
|
||||||
|
velocity_planner_.setTargetReplanThreshold(std::max(1e-3, 0.02 * max_velocity_));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurvePositionPlanner1D::getConstraints(double& max_velocity,
|
||||||
|
double& max_acceleration,
|
||||||
|
double& max_jerk) const
|
||||||
|
{
|
||||||
|
max_velocity = max_velocity_;
|
||||||
|
max_acceleration = max_acceleration_;
|
||||||
|
max_jerk = max_jerk_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurvePositionPlanner1D::setPositionGain(double position_gain)
|
||||||
|
{
|
||||||
|
position_gain_ = std::max(0.0, position_gain);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurvePositionPlanner1D::initialize(double position, double velocity, double acceleration)
|
||||||
|
{
|
||||||
|
state_.position = position;
|
||||||
|
velocity_planner_.initialize(velocity, acceleration);
|
||||||
|
state_.velocity = velocity_planner_.getVelocity();
|
||||||
|
state_.acceleration = velocity_planner_.getAcceleration();
|
||||||
|
state_.jerk = 0.0;
|
||||||
|
state_.target_position = position;
|
||||||
|
state_.is_moving = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurvePositionPlanner1D::reset()
|
||||||
|
{
|
||||||
|
state_ = SCurvePositionPlannerState();
|
||||||
|
velocity_planner_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurvePositionPlanner1D::setTarget(double target_position)
|
||||||
|
{
|
||||||
|
state_.target_position = target_position;
|
||||||
|
}
|
||||||
|
|
||||||
|
double SCurvePositionPlanner1D::update(double dt)
|
||||||
|
{
|
||||||
|
if (dt <= 0.0 || dt > 0.1) {
|
||||||
|
return state_.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double position_error = state_.target_position - state_.position;
|
||||||
|
if (std::abs(position_error) < POSITION_THRESHOLD &&
|
||||||
|
std::abs(velocity_planner_.getVelocity()) < VELOCITY_THRESHOLD &&
|
||||||
|
std::abs(velocity_planner_.getAcceleration()) < ACCELERATION_THRESHOLD) {
|
||||||
|
velocity_planner_.overwriteState(0.0, 0.0, false);
|
||||||
|
state_.position = state_.target_position;
|
||||||
|
state_.velocity = 0.0;
|
||||||
|
state_.acceleration = 0.0;
|
||||||
|
state_.jerk = 0.0;
|
||||||
|
state_.is_moving = false;
|
||||||
|
return state_.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
velocity_planner_.setTargetVelocity(computeDesiredVelocity(position_error));
|
||||||
|
|
||||||
|
const double old_velocity = velocity_planner_.getVelocity();
|
||||||
|
const double new_velocity = velocity_planner_.update(dt);
|
||||||
|
|
||||||
|
state_.velocity = new_velocity;
|
||||||
|
state_.acceleration = velocity_planner_.getAcceleration();
|
||||||
|
state_.jerk = velocity_planner_.getJerk();
|
||||||
|
state_.position += 0.5 * (old_velocity + new_velocity) * dt;
|
||||||
|
|
||||||
|
const double updated_error = state_.target_position - state_.position;
|
||||||
|
if (std::abs(updated_error) < POSITION_THRESHOLD &&
|
||||||
|
std::abs(state_.velocity) < VELOCITY_THRESHOLD &&
|
||||||
|
std::abs(state_.acceleration) < ACCELERATION_THRESHOLD) {
|
||||||
|
velocity_planner_.overwriteState(0.0, 0.0, false);
|
||||||
|
state_.position = state_.target_position;
|
||||||
|
state_.velocity = 0.0;
|
||||||
|
state_.acceleration = 0.0;
|
||||||
|
state_.jerk = 0.0;
|
||||||
|
state_.is_moving = false;
|
||||||
|
return state_.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
state_.is_moving = velocity_planner_.isMoving() ||
|
||||||
|
std::abs(updated_error) > POSITION_THRESHOLD;
|
||||||
|
return state_.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
double SCurvePositionPlanner1D::computeDesiredVelocity(double position_error) const
|
||||||
|
{
|
||||||
|
if (std::abs(position_error) <= POSITION_THRESHOLD) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double proportional_velocity =
|
||||||
|
clamp(position_gain_ * position_error, -max_velocity_, max_velocity_);
|
||||||
|
const double current_velocity = velocity_planner_.getVelocity();
|
||||||
|
const double current_acceleration = velocity_planner_.getAcceleration();
|
||||||
|
const double stopping_distance =
|
||||||
|
computePlannerStoppingDistance(current_velocity, current_acceleration);
|
||||||
|
|
||||||
|
if (std::abs(current_velocity) > VELOCITY_THRESHOLD &&
|
||||||
|
sign(current_velocity) != sign(position_error)) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (std::abs(current_velocity) > VELOCITY_THRESHOLD &&
|
||||||
|
sign(current_velocity) == sign(position_error) &&
|
||||||
|
std::abs(position_error) <= std::abs(stopping_distance) * 1.05) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
double low = 0.0;
|
||||||
|
double high = max_velocity_;
|
||||||
|
for (int i = 0; i < 40; ++i) {
|
||||||
|
const double mid = 0.5 * (low + high);
|
||||||
|
const double distance =
|
||||||
|
std::abs(computePlannerStoppingDistance(sign(position_error) * mid, 0.0));
|
||||||
|
if (distance <= std::abs(position_error)) {
|
||||||
|
low = mid;
|
||||||
|
} else {
|
||||||
|
high = mid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sign(position_error) *
|
||||||
|
std::min(std::abs(proportional_velocity), low);
|
||||||
|
}
|
||||||
|
|
||||||
|
double SCurvePositionPlanner1D::computePlannerStoppingDistance(double velocity,
|
||||||
|
double acceleration) const
|
||||||
|
{
|
||||||
|
if (std::abs(velocity) <= VELOCITY_THRESHOLD &&
|
||||||
|
std::abs(acceleration) <= ACCELERATION_THRESHOLD) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto profile = velocity_planner_.calculateProfile(velocity, 0.0, acceleration);
|
||||||
|
if (!profile.valid || profile.total_time <= EPSILON) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int steps = std::max(16, static_cast<int>(std::ceil(profile.total_time / 0.002)));
|
||||||
|
const double dt = profile.total_time / static_cast<double>(steps);
|
||||||
|
|
||||||
|
double distance = 0.0;
|
||||||
|
double previous_time = 0.0;
|
||||||
|
double previous_velocity = velocity_planner_.getVelocityAtTime(profile, 0.0);
|
||||||
|
for (int i = 1; i <= steps; ++i) {
|
||||||
|
const double t = (i == steps) ? profile.total_time : i * dt;
|
||||||
|
const double current_velocity = velocity_planner_.getVelocityAtTime(profile, t);
|
||||||
|
distance += 0.5 * (previous_velocity + current_velocity) * (t - previous_time);
|
||||||
|
previous_time = t;
|
||||||
|
previous_velocity = current_velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
return distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace cmvr
|
||||||
562
cmvr-es/planner/s_curve_planner/src/s_curve_velocity_planner.cpp
Normal file
@ -0,0 +1,562 @@
|
|||||||
|
//
|
||||||
|
// Created by lgv on 2026/3/9.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "../include/s_curve_velocity_planner.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
namespace cmvr
|
||||||
|
{
|
||||||
|
|
||||||
|
SCurveVelocityPlanner1D::SCurveVelocityPlanner1D(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk)
|
||||||
|
: max_velocity_(std::abs(max_velocity))
|
||||||
|
, max_acceleration_(std::abs(max_acceleration))
|
||||||
|
, max_jerk_(std::abs(max_jerk))
|
||||||
|
, target_replan_threshold_(DEFAULT_TARGET_REPLAN_THRESHOLD)
|
||||||
|
, synchronize_replan_threshold_(DEFAULT_SYNCHRONIZE_REPLAN_THRESHOLD)
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::setConstraints(double max_velocity,
|
||||||
|
double max_acceleration,
|
||||||
|
double max_jerk)
|
||||||
|
{
|
||||||
|
max_velocity_ = std::abs(max_velocity);
|
||||||
|
max_acceleration_ = std::abs(max_acceleration);
|
||||||
|
max_jerk_ = std::abs(max_jerk);
|
||||||
|
|
||||||
|
state_.velocity = clamp(state_.velocity, -max_velocity_, max_velocity_);
|
||||||
|
state_.acceleration = clamp(state_.acceleration, -max_acceleration_, max_acceleration_);
|
||||||
|
state_.target_velocity = clamp(state_.target_velocity, -max_velocity_, max_velocity_);
|
||||||
|
|
||||||
|
if (state_.has_active_profile) {
|
||||||
|
active_profile_ = calculateProfile(state_.velocity,
|
||||||
|
state_.target_velocity,
|
||||||
|
state_.acceleration);
|
||||||
|
state_.elapsed_time = 0.0;
|
||||||
|
state_.has_active_profile = active_profile_.valid && active_profile_.total_time > EPSILON;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateIsMovingFlag();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::getConstraints(double& max_velocity,
|
||||||
|
double& max_acceleration,
|
||||||
|
double& max_jerk) const
|
||||||
|
{
|
||||||
|
max_velocity = max_velocity_;
|
||||||
|
max_acceleration = max_acceleration_;
|
||||||
|
max_jerk = max_jerk_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::setTargetReplanThreshold(double threshold)
|
||||||
|
{
|
||||||
|
target_replan_threshold_ = std::max(0.0, threshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::setSynchronizeReplanThreshold(double threshold)
|
||||||
|
{
|
||||||
|
synchronize_replan_threshold_ = std::max(0.0, threshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::initialize(double velocity, double acceleration)
|
||||||
|
{
|
||||||
|
state_ = SCurveVelocityPlannerState();
|
||||||
|
state_.velocity = clamp(velocity, -max_velocity_, max_velocity_);
|
||||||
|
state_.acceleration = clamp(acceleration, -max_acceleration_, max_acceleration_);
|
||||||
|
state_.jerk = 0.0;
|
||||||
|
state_.target_velocity = state_.velocity;
|
||||||
|
state_.elapsed_time = 0.0;
|
||||||
|
state_.has_active_profile = false;
|
||||||
|
|
||||||
|
active_profile_ = SCurveVelocityProfile();
|
||||||
|
active_profile_.v0 = state_.velocity;
|
||||||
|
active_profile_.a0 = state_.acceleration;
|
||||||
|
active_profile_.vf = state_.velocity;
|
||||||
|
active_profile_.valid = false;
|
||||||
|
|
||||||
|
updateIsMovingFlag();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::reset()
|
||||||
|
{
|
||||||
|
state_ = SCurveVelocityPlannerState();
|
||||||
|
active_profile_ = SCurveVelocityProfile();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::overwriteState(double velocity,
|
||||||
|
double acceleration,
|
||||||
|
bool keep_target_velocity)
|
||||||
|
{
|
||||||
|
state_.velocity = clamp(velocity, -max_velocity_, max_velocity_);
|
||||||
|
state_.acceleration = clamp(acceleration, -max_acceleration_, max_acceleration_);
|
||||||
|
state_.jerk = 0.0;
|
||||||
|
state_.elapsed_time = 0.0;
|
||||||
|
state_.has_active_profile = false;
|
||||||
|
|
||||||
|
if (!keep_target_velocity) {
|
||||||
|
state_.target_velocity = state_.velocity;
|
||||||
|
} else {
|
||||||
|
state_.target_velocity = clamp(state_.target_velocity, -max_velocity_, max_velocity_);
|
||||||
|
}
|
||||||
|
|
||||||
|
active_profile_ = SCurveVelocityProfile();
|
||||||
|
active_profile_.v0 = state_.velocity;
|
||||||
|
active_profile_.a0 = state_.acceleration;
|
||||||
|
active_profile_.vf = state_.target_velocity;
|
||||||
|
active_profile_.valid = false;
|
||||||
|
|
||||||
|
updateIsMovingFlag();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::synchronizeAndReplan(double velocity,
|
||||||
|
double acceleration)
|
||||||
|
{
|
||||||
|
const double measured_velocity = clamp(velocity, -max_velocity_, max_velocity_);
|
||||||
|
const double measured_acceleration =
|
||||||
|
clamp(acceleration, -max_acceleration_, max_acceleration_);
|
||||||
|
|
||||||
|
if (!state_.has_active_profile &&
|
||||||
|
std::abs(measured_velocity - state_.target_velocity) <= VELOCITY_THRESHOLD) {
|
||||||
|
state_.velocity = state_.target_velocity;
|
||||||
|
state_.acceleration = 0.0;
|
||||||
|
state_.jerk = 0.0;
|
||||||
|
updateIsMovingFlag();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果测量值已经基本落在当前采样状态上,就继续沿现有 profile 走。
|
||||||
|
// 否则每拍都从同一目标重规划,会把已经进入的 jerk phase 反复打断。
|
||||||
|
if (state_.has_active_profile &&
|
||||||
|
std::abs(measured_velocity - state_.velocity) <= synchronize_replan_threshold_) {
|
||||||
|
state_.velocity = measured_velocity;
|
||||||
|
state_.acceleration = measured_acceleration;
|
||||||
|
state_.jerk = getJerkAtTime(active_profile_, state_.elapsed_time);
|
||||||
|
updateIsMovingFlag();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state_.velocity = measured_velocity;
|
||||||
|
state_.acceleration = measured_acceleration;
|
||||||
|
state_.jerk = 0.0;
|
||||||
|
|
||||||
|
active_profile_ = calculateProfile(state_.velocity,
|
||||||
|
state_.target_velocity,
|
||||||
|
state_.acceleration);
|
||||||
|
|
||||||
|
state_.elapsed_time = 0.0;
|
||||||
|
state_.has_active_profile = active_profile_.total_time > EPSILON;
|
||||||
|
|
||||||
|
updateIsMovingFlag();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::setTargetVelocity(double target_velocity)
|
||||||
|
{
|
||||||
|
const double new_target = clamp(target_velocity, -max_velocity_, max_velocity_);
|
||||||
|
|
||||||
|
const bool same_target =
|
||||||
|
std::abs(new_target - state_.target_velocity) <= target_replan_threshold_;
|
||||||
|
|
||||||
|
if (same_target &&
|
||||||
|
state_.has_active_profile) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (same_target &&
|
||||||
|
!state_.has_active_profile &&
|
||||||
|
std::abs(state_.velocity - new_target) <= VELOCITY_THRESHOLD &&
|
||||||
|
std::abs(state_.acceleration) <= ACCELERATION_THRESHOLD) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state_.target_velocity = new_target;
|
||||||
|
|
||||||
|
active_profile_ = calculateProfile(state_.velocity,
|
||||||
|
state_.target_velocity,
|
||||||
|
state_.acceleration);
|
||||||
|
|
||||||
|
state_.elapsed_time = 0.0;
|
||||||
|
state_.has_active_profile = active_profile_.valid && active_profile_.total_time > EPSILON;
|
||||||
|
|
||||||
|
updateIsMovingFlag();
|
||||||
|
}
|
||||||
|
|
||||||
|
double SCurveVelocityPlanner1D::getVelocityAtTime(const SCurveVelocityProfile& profile, double t) const
|
||||||
|
{
|
||||||
|
if (!profile.valid) {
|
||||||
|
return profile.v0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t <= 0.0) {
|
||||||
|
return profile.v0;
|
||||||
|
}
|
||||||
|
if (t >= profile.total_time) {
|
||||||
|
return profile.vf;
|
||||||
|
}
|
||||||
|
|
||||||
|
double v = profile.v0;
|
||||||
|
double a = profile.a0;
|
||||||
|
|
||||||
|
auto process_segment = [&](double dt, double jerk) {
|
||||||
|
v += a * dt + 0.5 * jerk * dt * dt;
|
||||||
|
a += jerk * dt;
|
||||||
|
};
|
||||||
|
|
||||||
|
// seg1
|
||||||
|
if (t <= profile.t1) {
|
||||||
|
process_segment(t, profile.j1);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
process_segment(profile.t1, profile.j1);
|
||||||
|
|
||||||
|
// seg2
|
||||||
|
const double t_after_1 = t - profile.t1;
|
||||||
|
if (t_after_1 <= profile.t2) {
|
||||||
|
process_segment(t_after_1, profile.j2);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
process_segment(profile.t2, profile.j2);
|
||||||
|
|
||||||
|
// seg3
|
||||||
|
const double t_after_2 = t_after_1 - profile.t2;
|
||||||
|
process_segment(t_after_2, profile.j3);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
double SCurveVelocityPlanner1D::getAccelerationAtTime(const SCurveVelocityProfile& profile, double t) const
|
||||||
|
{
|
||||||
|
if (!profile.valid) {
|
||||||
|
return profile.a0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t <= 0.0) {
|
||||||
|
return profile.a0;
|
||||||
|
}
|
||||||
|
if (t >= profile.total_time) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
double a = profile.a0;
|
||||||
|
|
||||||
|
auto process_segment = [&](double dt, double jerk) {
|
||||||
|
a += jerk * dt;
|
||||||
|
};
|
||||||
|
|
||||||
|
// seg1
|
||||||
|
if (t <= profile.t1) {
|
||||||
|
process_segment(t, profile.j1);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
process_segment(profile.t1, profile.j1);
|
||||||
|
|
||||||
|
// seg2
|
||||||
|
const double t_after_1 = t - profile.t1;
|
||||||
|
if (t_after_1 <= profile.t2) {
|
||||||
|
process_segment(t_after_1, profile.j2);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
process_segment(profile.t2, profile.j2);
|
||||||
|
|
||||||
|
// seg3
|
||||||
|
const double t_after_2 = t_after_1 - profile.t2;
|
||||||
|
process_segment(t_after_2, profile.j3);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
double SCurveVelocityPlanner1D::getJerkAtTime(const SCurveVelocityProfile& profile, double t) const
|
||||||
|
{
|
||||||
|
if (!profile.valid) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t <= 0.0 || t >= profile.total_time) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t <= profile.t1) {
|
||||||
|
return profile.j1;
|
||||||
|
}
|
||||||
|
if (t <= profile.t1 + profile.t2) {
|
||||||
|
return profile.j2;
|
||||||
|
}
|
||||||
|
return profile.j3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::integrateWholeProfile(const SCurveVelocityProfile& profile,
|
||||||
|
double& v_end,
|
||||||
|
double& a_end) const
|
||||||
|
{
|
||||||
|
double v = profile.v0;
|
||||||
|
double a = profile.a0;
|
||||||
|
|
||||||
|
auto process_segment = [&](double dt, double jerk) {
|
||||||
|
v += a * dt + 0.5 * jerk * dt * dt;
|
||||||
|
a += jerk * dt;
|
||||||
|
};
|
||||||
|
|
||||||
|
process_segment(profile.t1, profile.j1);
|
||||||
|
process_segment(profile.t2, profile.j2);
|
||||||
|
process_segment(profile.t3, profile.j3);
|
||||||
|
|
||||||
|
v_end = v;
|
||||||
|
a_end = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SCurveVelocityPlanner1D::isVelocityLimitSatisfied(const SCurveVelocityProfile& profile) const
|
||||||
|
{
|
||||||
|
if (!profile.valid) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<double> check_times;
|
||||||
|
check_times.reserve(8);
|
||||||
|
|
||||||
|
check_times.push_back(0.0);
|
||||||
|
check_times.push_back(profile.t1);
|
||||||
|
check_times.push_back(profile.t1 + profile.t2);
|
||||||
|
check_times.push_back(profile.total_time);
|
||||||
|
|
||||||
|
// seg1 内部若 acceleration 过零,则 velocity 可能在段内出现极值
|
||||||
|
if (std::abs(profile.j1) > EPSILON && profile.t1 > EPSILON) {
|
||||||
|
const double tz = -profile.a0 / profile.j1;
|
||||||
|
if (tz > EPSILON && tz < profile.t1 - EPSILON) {
|
||||||
|
check_times.push_back(tz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (double t : check_times) {
|
||||||
|
const double v = getVelocityAtTime(profile, t);
|
||||||
|
if (std::abs(v) > max_velocity_ + 1e-7) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCurveVelocityProfile SCurveVelocityPlanner1D::calculateProfile(double start_velocity,
|
||||||
|
double end_velocity,
|
||||||
|
double start_acceleration) const
|
||||||
|
{
|
||||||
|
SCurveVelocityProfile best;
|
||||||
|
best.v0 = clamp(start_velocity, -max_velocity_, max_velocity_);
|
||||||
|
best.a0 = clamp(start_acceleration, -max_acceleration_, max_acceleration_);
|
||||||
|
best.vf = clamp(end_velocity, -max_velocity_, max_velocity_);
|
||||||
|
|
||||||
|
if (max_jerk_ <= EPSILON || max_acceleration_ <= EPSILON) {
|
||||||
|
// 退化情况:这里不做特殊退化规划,直接返回 invalid
|
||||||
|
return best;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double v0 = best.v0;
|
||||||
|
const double a0 = best.a0;
|
||||||
|
const double vf = best.vf;
|
||||||
|
|
||||||
|
// 目标方向坐标:尽量统一到“signed frame 下 Δv >= 0”
|
||||||
|
double s = sign(vf - v0);
|
||||||
|
if (std::abs(vf - v0) <= VELOCITY_THRESHOLD) {
|
||||||
|
s = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double dv = s * (vf - v0); // >= 0
|
||||||
|
const double a0s = s * a0; // signed frame 下的初始 acceleration
|
||||||
|
const double j = max_jerk_;
|
||||||
|
const double amax = max_acceleration_;
|
||||||
|
|
||||||
|
auto normalize_nonnegative = [](double x) {
|
||||||
|
return (x < 0.0 && x > -1e-10) ? 0.0 : x;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto try_candidate = [&](double t1, double t2, double t3,
|
||||||
|
double j1s, double j2s, double j3s) {
|
||||||
|
t1 = normalize_nonnegative(t1);
|
||||||
|
t2 = normalize_nonnegative(t2);
|
||||||
|
t3 = normalize_nonnegative(t3);
|
||||||
|
|
||||||
|
if (t1 < 0.0 || t2 < 0.0 || t3 < 0.0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCurveVelocityProfile cand;
|
||||||
|
cand.t1 = t1;
|
||||||
|
cand.t2 = t2;
|
||||||
|
cand.t3 = t3;
|
||||||
|
cand.total_time = t1 + t2 + t3;
|
||||||
|
|
||||||
|
cand.j1 = s * j1s;
|
||||||
|
cand.j2 = s * j2s;
|
||||||
|
cand.j3 = s * j3s;
|
||||||
|
|
||||||
|
cand.v0 = v0;
|
||||||
|
cand.a0 = a0;
|
||||||
|
cand.vf = vf;
|
||||||
|
cand.valid = true;
|
||||||
|
|
||||||
|
double vend = 0.0;
|
||||||
|
double aend = 0.0;
|
||||||
|
integrateWholeProfile(cand, vend, aend);
|
||||||
|
|
||||||
|
if (std::abs(vend - vf) > 1e-5) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (std::abs(aend) > 1e-5) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!isVelocityLimitSatisfied(cand)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!best.valid || cand.total_time < best.total_time) {
|
||||||
|
best = cand;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// ---------------- UDU 三角形(无平台) ----------------
|
||||||
|
{
|
||||||
|
// Δv = (2A^2 - a0^2)/(2j)
|
||||||
|
const double A2 = 0.5 * (2.0 * j * dv + a0s * a0s);
|
||||||
|
if (A2 >= -1e-10) {
|
||||||
|
const double A = std::sqrt(std::max(0.0, A2));
|
||||||
|
if (A <= amax + 1e-10 && A >= a0s - 1e-10) {
|
||||||
|
const double t1 = (A - a0s) / j;
|
||||||
|
const double t2 = 0.0;
|
||||||
|
const double t3 = A / j;
|
||||||
|
try_candidate(t1, t2, t3, +j, 0.0, -j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------- UDU 梯形(有平台) ----------------
|
||||||
|
{
|
||||||
|
const double A = amax;
|
||||||
|
if (A > EPSILON && A >= a0s - 1e-10) {
|
||||||
|
const double base = (2.0 * A * A - a0s * a0s) / (2.0 * j);
|
||||||
|
const double t1 = (A - a0s) / j;
|
||||||
|
const double t2 = (dv - base) / A;
|
||||||
|
const double t3 = A / j;
|
||||||
|
try_candidate(t1, t2, t3, +j, 0.0, -j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------- DUD 三角形(无平台) ----------------
|
||||||
|
{
|
||||||
|
// Δv = (a0^2 - 2B^2)/(2j)
|
||||||
|
const double B2 = 0.5 * (a0s * a0s - 2.0 * j * dv);
|
||||||
|
if (B2 >= -1e-10) {
|
||||||
|
const double B = std::sqrt(std::max(0.0, B2));
|
||||||
|
if (B <= amax + 1e-10 && B >= -a0s - 1e-10) {
|
||||||
|
const double t1 = (a0s + B) / j;
|
||||||
|
const double t2 = 0.0;
|
||||||
|
const double t3 = B / j;
|
||||||
|
try_candidate(t1, t2, t3, -j, 0.0, +j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------- DUD 梯形(有平台) ----------------
|
||||||
|
{
|
||||||
|
const double B = amax;
|
||||||
|
if (B > EPSILON && B >= -a0s - 1e-10) {
|
||||||
|
const double base = (a0s * a0s - 2.0 * B * B) / (2.0 * j);
|
||||||
|
const double t1 = (a0s + B) / j;
|
||||||
|
const double t2 = (base - dv) / B;
|
||||||
|
const double t3 = B / j;
|
||||||
|
try_candidate(t1, t2, t3, -j, 0.0, +j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 已到终点附近
|
||||||
|
if (!best.valid &&
|
||||||
|
std::abs(vf - v0) <= VELOCITY_THRESHOLD &&
|
||||||
|
std::abs(a0) <= ACCELERATION_THRESHOLD) {
|
||||||
|
best.valid = false;
|
||||||
|
best.total_time = 0.0;
|
||||||
|
best.v0 = v0;
|
||||||
|
best.a0 = a0;
|
||||||
|
best.vf = vf;
|
||||||
|
}
|
||||||
|
|
||||||
|
return best;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::generateTrajectory(const SCurveVelocityProfile& profile, double dt,
|
||||||
|
std::vector<double>& velocities,
|
||||||
|
std::vector<double>& accelerations,
|
||||||
|
std::vector<double>& jerks) const
|
||||||
|
{
|
||||||
|
velocities.clear();
|
||||||
|
accelerations.clear();
|
||||||
|
jerks.clear();
|
||||||
|
|
||||||
|
if (!profile.valid || profile.total_time <= 0.0 || dt <= 0.0) {
|
||||||
|
velocities.push_back(profile.v0);
|
||||||
|
accelerations.push_back(profile.a0);
|
||||||
|
jerks.push_back(0.0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int num_points = static_cast<int>(std::ceil(profile.total_time / dt)) + 1;
|
||||||
|
velocities.reserve(num_points);
|
||||||
|
accelerations.reserve(num_points);
|
||||||
|
jerks.reserve(num_points);
|
||||||
|
|
||||||
|
for (double t = 0.0; t <= profile.total_time; t += dt) {
|
||||||
|
velocities.push_back(getVelocityAtTime(profile, t));
|
||||||
|
accelerations.push_back(getAccelerationAtTime(profile, t));
|
||||||
|
jerks.push_back(getJerkAtTime(profile, t));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (velocities.empty() || std::abs(velocities.back() - profile.vf) > VELOCITY_THRESHOLD) {
|
||||||
|
velocities.push_back(profile.vf);
|
||||||
|
accelerations.push_back(0.0);
|
||||||
|
jerks.push_back(0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double SCurveVelocityPlanner1D::update(double dt)
|
||||||
|
{
|
||||||
|
if (dt <= 0.0) {
|
||||||
|
return state_.velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!state_.has_active_profile || !active_profile_.valid) {
|
||||||
|
state_.jerk = 0.0;
|
||||||
|
updateIsMovingFlag();
|
||||||
|
return state_.velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
state_.elapsed_time += dt;
|
||||||
|
|
||||||
|
if (state_.elapsed_time >= active_profile_.total_time) {
|
||||||
|
state_.elapsed_time = active_profile_.total_time;
|
||||||
|
state_.velocity = active_profile_.vf;
|
||||||
|
state_.acceleration = 0.0;
|
||||||
|
state_.jerk = 0.0;
|
||||||
|
state_.has_active_profile = false;
|
||||||
|
updateIsMovingFlag();
|
||||||
|
return state_.velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
state_.velocity = getVelocityAtTime(active_profile_, state_.elapsed_time);
|
||||||
|
state_.acceleration = getAccelerationAtTime(active_profile_, state_.elapsed_time);
|
||||||
|
state_.jerk = getJerkAtTime(active_profile_, state_.elapsed_time);
|
||||||
|
|
||||||
|
updateIsMovingFlag();
|
||||||
|
return state_.velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCurveVelocityPlanner1D::updateIsMovingFlag()
|
||||||
|
{
|
||||||
|
state_.is_moving =
|
||||||
|
state_.has_active_profile ||
|
||||||
|
std::abs(state_.velocity) > VELOCITY_THRESHOLD ||
|
||||||
|
std::abs(state_.target_velocity) > VELOCITY_THRESHOLD ||
|
||||||
|
std::abs(state_.acceleration) > ACCELERATION_THRESHOLD;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace cmvr
|
||||||
@ -1,169 +1,547 @@
|
|||||||
t,q1,q2,q3,q4,q5,q6,q7
|
t,q1,q2,q3,q4,q5,q6,q7
|
||||||
0,0.25,1,1.5707963267949,1.5707963267949,-1.5707963267949,0,0
|
0,0.25,1,1.5707963267949,1.5707963267949,-1.5707963267949,0,0
|
||||||
0.002,0.25,1,1.5707963267949,1.5707963267949,-1.5707963267949,0,0
|
0.002,0.25,1,1.5707963267949,1.5707963267949,-1.5707963267949,0,0
|
||||||
0.004,0.250001842320363,1.00000035621738,1.57079547429742,1.57079444210524,-1.57079668301227,3.34430494936117e-07,1.42912469251269e-07
|
0.004,0.25000047042195,0.999999643059012,1.57079655522309,1.57079724068573,-1.57079596985391,-1.30973721143836e-06,4.82598248142038e-07
|
||||||
0.006,0.250009211599068,1.00000178109261,1.57079206431392,1.57078690333631,-1.57079810788309,1.67216263610067e-06,7.14561905387093e-07
|
0.006,0.250002352119835,0.999998215295479,1.57079746893306,1.57080089623876,-1.57079454209152,-6.54868491622439e-06,2.41299125801426e-06
|
||||||
0.008,0.250025792451452,1.0000049871135,1.57078439190875,1.57076994101371,-1.57080131385445,4.68215140661819e-06,2.00076916853545e-06
|
0.008,0.250006586030861,0.999995002831306,1.57079952475507,1.57080912114056,-1.57079132964004,-1.83363069831887e-05,6.75637568596772e-06
|
||||||
0.01,0.25005526942355,1.00001068691258,1.57077075230822,1.57073978540339,-1.57080701340708,1.00336083670537e-05,4.28734398236013e-06
|
0.01,0.250014113346931,0.999989291798997,1.57080317944813,1.57082374281808,-1.57078561867083,-3.92920384698955e-05,1.44779486252094e-05
|
||||||
0.012,0.250101326918013,1.00001959342197,1.57074944107367,1.5706926662341,-1.57081591909138,1.83962760218046e-05,7.8600730098651e-06
|
0.012,0.25002587578704,0.999980368352981,1.57080888962368,1.57084658816104,-1.570776695436,-7.20352548050359e-05,2.65429080714911e-05
|
||||||
0.014,0.250167649092643,1.00003242008538,1.57071875433882,1.57062481231678,-1.57082874357675,3.04408038203672e-05,1.3004703478399e-05
|
0.014,0.250042815970618,0.999967518685138,1.57081711164106,1.57087948314138,-1.57076384632562,-0.000119185229528684,4.39164535541204e-05
|
||||||
0.016,0.250257919731615,1.00004988112752,1.57067698911111,1.57053245106106,-1.57084619971424,4.68392258226527e-05,2.00069223188819e-05
|
0.016,0.250065877891993,0.999950029044509,1.57082830147452,1.57092425232965,-1.5707463579404,-0.000183361080548634,6.75637869166764e-05
|
||||||
0.018,0.250375822089508,1.00007269188062,1.57062244363736,1.57041180788839,-1.57086900061264,6.8265540079134e-05,2.91523307867103e-05
|
0.018,0.250096007496088,0.999927185761162,1.57084291455164,1.57098271830821,-1.5707235171799,-0.000267181704862094,9.84501132239856e-05
|
||||||
0.02,0.25052503870832,1.00010156916829,1.57055341783365,1.57025910554178,-1.57089785972805,9.53963898036617e-05,4.07264145527739e-05
|
0.02,0.250134153355467,0.999898275274187,1.570861405563,1.57105670098111,-1.57069461134612,-0.000373265701722758,0.000137540641784734
|
||||||
0.022,0.250709251207703,1.00013723174661,1.57046821377978,1.57007056329152,-1.57093349096721,0.000128911846446335,5.50145092939761e-05
|
0.022,0.250181267448461,0.999862584163762,1.57088422824305,1.57114801678116,-1.57065892826264,-0.00050423128435177,0.00018580058735287
|
||||||
0.024,0.25093214004874,1.00018040080262,1.57036513627856,1.56984239603644,-1.5709766088048,0.000169496294800861,7.23017618654089e-05
|
0.024,0.250238306037392,0.999819399187298,1.57091183512237,1.57125847777549,-1.57061575640899,-0.000662696180567743,0.000244195171776534
|
||||||
0.026,0.251197384271681,1.00023180051036,1.57024249348038,1.56957081330007,-1.57102792841521,0.000217839420297711,9.28730871779383e-05
|
0.026,0.250306230644415,0.999768007319777,1.57094467725243,1.5713898906728,-1.57056438507031,-0.000851277523241454,0.000313689626812957
|
||||||
0.028,0.251508661208166,1.00029215864445,1.57009859757347,1.56925201812088,-1.57108816581923,0.000274637298630594,0.000117013120891842
|
0.028,0.250386009127344,0.999707695798416,1.57098320390151,1.57154405572967,-1.5705041045026,-0.0010725917297323,0.000395249197883043
|
||||||
0.03,0.251869646168614,1.00036220725132,1.56993176554023,1.56888220583562,-1.57115803804603,0.000340593587825559,0.000145006167898724
|
0.03,0.250478616872607,0.999637752170651,1.57102786221273,1.57172276553403,-1.57043420611487,-0.00132925436411946,0.000489839144531641
|
||||||
0.032,0.252284012105614,1.00044268337735,1.56974031997957,1.56845756275503,-1.5712382633105,0.000416420822772189,0.000177136146195836
|
0.032,0.250585038074371,0.999557464346465,1.57107909683867,1.57192780370559,-1.57035398266535,-0.00162387999348339,0.000598424744928135
|
||||||
0.034,0.252755429254375,1.00053432985264,1.56952258999442,1.56797426473065,-1.57132956120555,0.000502841812073582,0.000213686525014057
|
0.034,0.250706267118671,0.999466120654551,1.57113734954332,1.57216094348961,-1.57026272847384,-0.00195908203141728,0.00072197130036424
|
||||||
0.036,0.253287564751547,1.00063789612751,1.56927691214216,1.56742847561208,-1.57143265290722,0.000600591136810968,0.000254940254750321
|
0.036,0.250843310069524,0.999363009902274,1.57120305877169,1.57242394624786,-1.5701597396497,-0.00233747256989253,0.000861444140564823
|
||||||
0.038,0.253884082234046,1.00075413915643,1.56900163144327,1.56681634559378,-1.571548261389,0.000710416750429909,0.000301179684129656
|
0.038,0.25099718625673,0.999247421439378,1.57127665918684,1.57271855984787,-1.57004431433571,-0.00276166219960709,0.0010178086300883
|
||||||
0.04,0.254548641419916,1.00088382432053,1.56869510244007,1.56613400945109,-1.57167711163798,0.000833081678402873,0.000352686456771557
|
0.04,0.251168929965533,0.999118645225347,1.57135858117314,1.57304651695034,-1.56991575296774,-0.00323425981877845,0.0011920301760154
|
||||||
0.042,0.255284897673769,1.00102772637452,1.56835569029184,1.56537758466548,-1.57181993086087,0.00096936581556545,0.000409741374578847
|
0.042,0.251359592228325,0.998975971900352,1.57144925030474,1.57340953319513,-1.5697733585504,-0.00375787243033101,0.00138507423714958
|
||||||
0.044,0.256096501559966,1.00118663039675,1.56798177188531,1.56454316943985,-1.57197744866114,0.00112006781800965,0.000472624208638559
|
0.044,0.251570242718595,0.998818692859658,1.5715490867781,1.57380930528595,-1.56961643694885,-0.00433510492741253,0.00159790633497738
|
||||||
0.046,0.25698709838616,1.00136133272898,1.56757173694767,1.5636268406016,-1.57215039717532,0.00128600708927412,0.000541613444858038
|
0.046,0.251801971747353,0.998646100331404,1.57165850480715,1.57424750897407,-1.56944429719675,-0.0049685598671558,0.00183149206666271
|
||||||
0.048,0.257960327706088,1.00155264235986,1.56712398963253,1.56262465129037,-1.57233951158172,0.00146802596391654,0.000616986357907511
|
0.048,0.252055499984317,0.998457778919316,1.57177772745776,1.57472505784035,-1.56925654240594,-0.00565976745880769,0.00208640259738799
|
||||||
0.05,0.25901982283555,1.00176138210273,1.56663694990973,1.56153262858032,-1.57254553040044,0.00166699193133438,0.000699018857582903
|
0.05,0.252330161960637,0.998254355835669,1.57190631321648,1.57524020644808,-1.56905381705993,-0.00640643167306516,0.00236179878779658
|
||||||
0.052,0.260169210372693,1.0019883896871,1.5661090548831,1.56034677099537,-1.57276919568873,0.00188379993879461,0.000787985203963878
|
0.052,0.252625171204899,0.998036551188815,1.57204376048817,1.57579097026807,-1.56883685873587,-0.00720591555188081,0.00265671598977199
|
||||||
0.054,0.261412109710082,1.00223451898233,1.5655387602637,1.55906304586521,-1.57301125333204,0.00211937482346646,0.000884157781179529
|
0.054,0.252939742373786,0.997805085101871,1.57218956708213,1.57637536373045,-1.56860640519761,-0.00805558200416776,0.00297018961259649
|
||||||
0.056,0.262752132550084,1.00250064125313,1.56492454189639,1.55767738653966,-1.57327245334267,0.0023746738510965,0.000987806843381478
|
0.056,0.253273089233422,0.997560677628197,1.57234323076536,1.57699140228548,-1.56836319408827,-0.00895279403244094,0.0033012551216505
|
||||||
0.058,0.264192882428002,1.00278764644405,1.56426489733812,1.55618568945554,-1.57355355016504,0.00265068936227716,0.00109920022985152
|
0.058,0.253624422740584,0.997304048671724,1.57250424979362,1.57763710435995,-1.56810796263798,-0.00989491494798889,0.00364894803594106
|
||||||
0.06,0.265737954247884,1.00309644448937,1.56355834748601,1.55458381105016,-1.57385530298695,0.00294845152742228,0.00121860304593726
|
0.06,0.253992949223688,0.997035917912167,1.57267212342084,1.5783104932092,-1.56784144738653,-0.0108793085746444,0.00401230392437078
|
||||||
0.062,0.267390933836477,1.00342796664498,1.56280343825317,1.55286756451418,-1.57417847605577,0.00326903121175137,0.00134627730627171
|
0.062,0.254377868663495,0.996757004735117,1.57284635238723,1.57900959866477,-1.56756438392099,-0.0119033394412278,0.00439035840069514
|
||||||
0.064,0.269155397521335,1.00378316683865,1.5619987422898,1.55103271637648,-1.57452383899889,0.00361354295180039,0.00148248153649196
|
0.064,0.25477837307352,0.996468028167002,1.5730264393861,1.57973245877761,-1.56727750662821,-0.0129643729627431,0.00478214711714979
|
||||||
0.066,0.271034911739794,1.00416302303465,1.5611428607472,1.54907498291238,-1.57489216714748,0.00398314804522704,0.00162747032942876
|
0.066,0.25519364498011,0.996169706814893,1.57321188950975,1.58047712135703,-1.56698154846202,-0.0140597756104065,0.00518670575676088
|
||||||
0.068,0.273033032686143,1.00456853860907,1.56023442508162,1.54699002636592,-1.57528424186254,0.0043790577559646,0.00178149385149385
|
0.068,0.25562285600223,0.995862758811123,1.57340221067413,1.58124164540536,-1.56667724072532,-0.0151869150705921,0.00560307002438021
|
||||||
0.07,0.275153306005132,1.00500074373146,1.5592720988951,1.54477345097585,-1.57570085086258,0.00480253663710795,0.00194479729474488
|
0.07,0.256065165530977,0.995547901762665,1.57359691402226,1.58202410244853,-1.56636531286683,-0.0163431603927744,0.00603027563651297
|
||||||
0.0720000000000001,0.277399266540752,1.00546069674887,1.55825457980963,1.5424207987938,-1.57614278855189,0.00525490597429168,0.00211762026986112
|
0.0720000000000001,0.256519719508883,0.995225852705231,1.57379551430601,1.58282257776265,-1.56604649229253,-0.0175258821265462,0.00646735831002896
|
||||||
0.0740000000000001,0.279774438150143,1.00594948556802,1.55718060137111,1.53992754528202,-1.5766108563487,0.00573754735275206,0.00230019613501494
|
0.0740000000000001,0.256985649309076,0.994897328062009,1.57399753024604,1.5836351714967,-1.56572150419184,-0.0187324524477844,0.00691335374986928
|
||||||
0.0760000000000001,0.282282333593441,1.00646822903136,1.55604893497889,1.53728909467663,-1.57710586301241,0.00625190635175666,0.00249275125537641
|
0.0760000000000001,0.257462070714391,0.994563043606989,1.57420248486925,1.58445999969163,-1.56539107137852,-0.0199602452740281,0.00736729763587812
|
||||||
0.0780000000000001,0.28492645451149,1.00701807828284,1.5548583918365,1.53450077510092,-1.57762862496925,0.00679949637064798,0.00269550418774032
|
0.0780000000000001,0.257948082996526,0.994223714432794,1.57440990582331,1.58529519519592,-1.56505591414624,-0.0212066363691233,0.00782822560890514
|
||||||
0.0800000000000001,0.287710291504475,1.00760021811934,1.55360782491869,1.53155783341149,-1.57817996663587,0.00738190259138794,0.00290866478451633
|
0.0800000000000001,0.258442768095387,0.993880054922939,1.57461932566765,1.58613890847775,-1.56471675013891,-0.0224690034371797,0.00829517325633661
|
||||||
0.0820000000000001,0.290636961340257,1.00821579201921,1.55229629365924,1.5284558144833,-1.57876064876227,0.0080007093413499,0.00313240550072555
|
0.0820000000000001,0.25894518989871,0.993532778728442,1.57483028214013,1.58698930833416,-1.56437429423587,-0.0237447262058671,0.00876717609722456
|
||||||
0.0840000000000001,0.293704335855572,1.00886487094147,1.55092524192205,1.52519573812858,-1.5793704003301,0.00865645872516008,0.00336648940686858
|
0.0840000000000001,0.259454393622146,0.993182598748703,1.57504231839865,1.58784458249719,-1.56402925845179,-0.0250311864990688,0.00924326956719108
|
||||||
0.0860000000000001,0.296908573121487,1.00954717080892,1.54949689362425,1.52178041113848,-1.58000861146009,0.00934935295292093,0.00361054168475044
|
0.0860000000000001,0.259969405289927,0.992830227116568,1.57525498323697,1.58870293813725,-1.56368235185161,-0.0263257682988902,0.00972248900329144
|
||||||
0.0880000000000001,0.300245837642274,1.01026240719637,1.54801347594706,1.51821261851234,-1.58067467243228,0.0100796063044685,0.00386418116996403
|
0.0880000000000001,0.260489231316283,0.9924763751875,1.57546783127372,1.58956260226394,-1.56333428048042,-0.0276258577970037,0.0102038696290235
|
||||||
0.0900000000000001,0.303712301919588,1.01101029304587,1.54647721672544,1.51449512663298,-1.58136797317742,0.0108474415190109,0.00412702031074811
|
0.0900000000000001,0.261012858187775,0.992121753532774,1.57568042311382,1.5904218220245,-1.56298574730837,-0.0289288434352961,0.010686446539673
|
||||||
0.0920000000000001,0.307304147961211,1.01179053649422,1.54489034191344,1.51063068636732,-1.58208790279819,0.0116530862970873,0.00439866516278821
|
0.0920000000000001,0.261539293116413,0.991767044398554,1.57589234193789,1.59127893145011,-1.56263742514831,-0.0302322171314552,0.0111692921788712
|
||||||
0.0940000000000001,0.311017568729452,1.01260283881528,1.54325507312735,1.50662203609744,-1.58283384912085,0.0124967699139056,0.00467871542248941
|
0.0940000000000001,0.26206826540447,0.991412432143538,1.57610347297143,1.59213348235848,-1.56228949602713,-0.0315352999553912,0.0116521558609447
|
||||||
0.0960000000000001,0.31484876952446,1.01344689247894,1.54157362526907,1.5024719046872,-1.583605198278,0.0133787199429329,0.00496676450076238
|
0.0960000000000001,0.262599775628729,0.991057916464163,1.57631381254385,1.59298547524946,-1.56194196032547,-0.0328380914940666,0.0121350381449214
|
||||||
0.0980000000000001,0.318793969297783,1.01432237932795,1.5398482042319,1.49818301438949,-1.58440133432277,0.0142991590884302,0.00526239963889535
|
0.0980000000000001,0.26313382436409,0.990703497061623,1.5765233569802,1.59383491061208,-1.5615948184307,-0.0341405913192268,0.0126179395848887
|
||||||
0.1,0.322849401891661,1.015228968873,1.53808100469095,1.4937580836989,-1.58522163887456,0.0152583021254375,0.00556520206763711
|
0.1,0.263670412183494,0.990349173641918,1.57673210260126,1.59468178892469,-1.56124807073686,-0.0354427989874131,0.0131008607300459
|
||||||
0.102,0.32701131719969,1.0161663167061,1.53627420798018,1.48919983015459,-1.58606549079628,0.0162563529455337,0.00587474721019104
|
0.102,0.26420953965784,0.989994945915897,1.57694004572354,1.59552611065498,-1.56090171764465,-0.0367447140399751,0.0135838021247549
|
||||||
0.104,0.331275982244604,1.01713406303155,1.53442998005796,1.48451097309827,-1.58693226590272,0.0172935017065123,0.00619060492941906
|
0.104,0.26475120735591,0.989640813599312,1.57714718265939,1.59636787626012,-1.56055575956143,-0.0380463360030837,0.0140667643085924
|
||||||
0.106,0.335639682169149,1.01813183131323,1.53255046956309,1.47969423639167,-1.58782133669963,0.0183699220839392,0.00651233981917903
|
0.106,0.26529541584429,0.989286776412861,1.57735350971706,1.59720708618682,-1.56021019690123,-0.0393476643877437,0.0145497478164011
|
||||||
0.108,0.340098721136147,1.01915922703648,1.53063780596284,1.47475235109838,-1.58873207215267,0.0194857686223861,0.00683951153936941
|
0.108,0.265842165687293,0.988932834082236,1.57755902320072,1.59804374087143,-1.55986503008467,-0.0406486986898065,0.0150327531783412
|
||||||
0.11,0.34464942313408,1.0202158365824,1.52869409779455,1.46968805813435,-1.58966383748541,0.0206411741839657,0.00717167519393315
|
0.11,0.266391457446878,0.988578986338176,1.57776371941057,1.59887784074,-1.55952025953902,-0.0419494383899835,0.0155157809199423
|
||||||
0.112,0.349288132684715,1.02130122621178,1.52672143100214,1.46450411089169,-1.59061599400533,0.0218362474916401,0.0075083817507786
|
0.112,0.26694329168258,0.988225232916509,1.57796759464288,1.59970938620838,-1.55917588569813,-0.0432498829538583,0.0159988315621542
|
||||||
0.114,0.354011215449523,1.02241494115569,1.5247218673686,1.45920327784012,-1.59158789895642,0.0230710707646193,0.00784917850230876
|
0.114,0.267497668951425,0.987871573558206,1.57817064519004,1.60053837768231,-1.55883190900246,-0.0445500318319001,0.0164819056213988
|
||||||
0.116,0.358815058731886,1.02355650480918,1.52269744304558,1.45378834511041,-1.59257890539705,0.0243456974430299,0.00819360956501266
|
0.116,0.268054589807858,0.987518008009427,1.57837286734064,1.60136481555748,-1.55848832989906,-0.0458498844594769,0.0169650036096216
|
||||||
0.118,0.363696071872331,1.02472541802433,1.52065016718065,1.44826211906423,-1.59358836210158,0.0256601499989021,0.008541216416363
|
0.118,0.268614054803667,0.987164536021568,1.57857425737952,1.60218870021964,-1.55814514884153,-0.0471494402568679,0.0174481260343425
|
||||||
0.12,0.368650686534288,1.02592115849861,1.51858202064295,1.44262742885442,-1.59461561348388,0.0270144178304039,0.00889153846708243
|
0.12,0.269176064487903,0.986811157351316,1.57877481158786,1.60301003204465,-1.55780236629004,-0.0484486986292776,0.017931273398708
|
||||||
0.122,0.373675356878174,1.0271431802541,1.51649495484737,1.43688712898005,-1.59565999954108,0.028408455236147,0.0092441136666864
|
0.122,0.26974061940681,0.986457871760693,1.57897452624321,1.60382881139859,-1.55745998271133,-0.0497476589668481,0.0184144462015419
|
||||||
0.124,0.378766559621848,1.02839091320318,1.5143908906776,1.43104410184024,-1.59672085581554,0.029842179466293,0.0095984791400826
|
0.124,0.270307720103742,0.986104679017106,1.57917339761955,1.60464503863785,-1.55711799857864,-0.0510463206446732,0.0188976449373969
|
||||||
0.126,0.383920793985801,1.02966376279578,1.51227171750777,1.42510126029066,-1.5977975133731,0.0313154688471123,0.00995417185290487
|
0.126,0.270877367119095,0.985751578893398,1.5793714219874,1.60545871410915,-1.55677641437178,-0.0523446830228112,0.019380870096606
|
||||||
0.128,0.389132439035416,1.0309605766285,1.51014016859368,1.41906403208699,-1.59888885015124,0.0328275393694689,0.0103105827840801
|
0.128,0.271449560990227,0.9853985711679,1.57956859561384,1.6062698381497,-1.55643523057704,-0.0536427454462986,0.0198641221653337
|
||||||
0.13,0.394393098808599,1.03227945999131,1.5080000631315,1.41294118320728,-1.59999314805991,0.0343767034910838,0.0106669203107345
|
0.13,0.272024302251384,0.985045655624473,1.57976491476258,1.60707841108723,-1.55609444768725,-0.0549405072451638,0.0203474016256274
|
||||||
0.132,0.399694836020666,1.033618566465,1.5058549654811,1.40674111753033,-1.60110876649478,0.0359612723489954,0.0110224379770385
|
0.132,0.272601591433626,0.984692832052567,1.57996037569404,1.60788443324009,-1.55575406620173,-0.0562379677344403,0.0208307089554687
|
||||||
0.134,0.405030176915752,1.03497610371369,1.50370818616009,1.40047186364808,-1.60223414483986,0.0375795633954864,0.011376435455188
|
0.134,0.273181429064756,0.984340100247267,1.5801549746654,1.6086879049173,-1.55541408662628,-0.0575351262141809,0.0213140446288245
|
||||||
0.136,0.410392110969218,1.03635033828429,1.50156278538738,1.39414106653408,-1.60336780395946,0.0392299073945067,0.0117282589581785
|
0.136,0.273763815669239,0.983987460009341,1.58034870793068,1.60948882641869,-1.5550745094732,-0.0588319819694711,0.0217974091156985
|
||||||
0.138,0.415774086150845,1.03773959945933,1.49942157876802,1.38775598354351,-1.60450834678907,0.0409106547468421,0.0120773011659201
|
0.138,0.274348751768133,0.983634911145294,1.58054157174079,1.61028719803492,-1.55473533526125,-0.0601285342704432,0.0222808028821822
|
||||||
0.14,0.421170000430154,1.03914228222015,1.49728714473416,1.38132348422386,-1.60565445813446,0.0426201811283066,0.0124230007266122
|
0.14,0.274936237879016,0.983282453467419,1.58073356234361,1.61108302004757,-1.55439656451566,-0.0614247823722904,0.0227642263905066
|
||||||
0.142,0.42657419016316,1.04055684938462,1.49516183338634,1.37485005343265,-1.60680490378529,0.0443568924387481,0.0127648413940003
|
0.142,0.275526274515908,0.982930086793845,1.58092467598404,1.61187629272925,-1.55405819776811,-0.0627207255152808,0.0232476800990929
|
||||||
0.144,0.43198141594933,1.04198183298805,1.49304777641304,1.36834179728575,-1.60795852904412,0.0461192290709096,0.0131023508586034
|
0.144,0.276118862189203,0.982577810948587,1.58111490890407,1.61266701634365,-1.55372023555674,-0.0640163629247713,0.0237311644626041
|
||||||
0.146,0.437386846492176,1.04341583497793,1.49094689780066,1.36180445149229,-1.60911425676545,0.0479056695173839,0.0134350993275664
|
0.146,0.276714001405596,0.982225625761601,1.58130425734287,1.61345519114562,-1.55338267842611,-0.0653116938112225,0.024214679931996
|
||||||
0.148,0.442786040939981,1.04485752729382,1.4888609250818,1.35524339166883,-1.61027108499168,0.0497147333412469,0.0137626979037592
|
0.148,0.277311692668004,0.981873531068833,1.58149271753681,1.61424081738124,-1.55304552692725,-0.0666067173702129,0.0246982269545687
|
||||||
0.15,0.448174930126541,1.04630565140208,1.48679140090333,1.34866364526346,-1.61142808426523,0.0515449835416281,0.0140847968103465
|
0.15,0.277911936475503,0.981521526712269,1.58168028571956,1.61502389528794,-1.55270878161758,-0.0679014327824531,0.0251818059740175
|
||||||
0.152,0.453549797077296,1.04775901735317,1.48473969472809,1.34206990475832,-1.61258439468812,0.0533950283496603,0.0144010835024751
|
0.152,0.278514733323249,0.981169612539986,1.58186695812217,1.61580442509453,-1.55237244306095,-0.0691958392138011,0.0256654174304842
|
||||||
0.154,0.458907257094704,1.04921650242608,1.48270701451423,1.33546654185659,-1.61373922279214,0.0552635224931243,0.0147112807031349
|
0.154,0.27912008370241,0.980817788406207,1.5820527309731,1.61658240702127,-1.55203651182763,-0.0704899358152766,0.0261490617606084
|
||||||
0.156,0.464244237688956,1.05067704942034,1.48069441824316,1.32885762239553,-1.61489183827549,0.0571491679698173,0.0150151443957416
|
0.156,0.279727988100092,0.98046605417135,1.58223760049831,1.61735784128,-1.55170098849429,-0.0717837217230759,0.0266327393975787
|
||||||
0.158,0.469557958576464,1.05213966465222,1.47870282519217,1.32224692176043,-1.61604157065429,0.0590507143704104,0.0153124618016734
|
0.158,0.280338446999268,0.980114409702077,1.58242156292131,1.61813072807417,-1.551365873644,-0.0730771960585872,0.0271164507711838
|
||||||
0.16,0.474845911929095,1.05360341570695,1.47673302686921,1.3156379406061,-1.61718780587073,0.0609669587914467,0.0156030493669124
|
0.16,0.280951460878711,0.979762854871352,1.58260461446327,1.61890106759892,-1.55103116786622,-0.0743703579284058,0.0276001963078635
|
||||||
0.162,0.480105843021937,1.05506742899422,1.47478569754699,1.30903392072057,-1.61832998289332,0.0628967453783252,0.0158867507781568
|
0.162,0.281567030212918,0.979411389558486,1.58278675134304,1.61966886004119,-1.5506968717568,-0.075663206424349,0.0280839764307602
|
||||||
0.164,0.485335731396195,1.05653088714955,1.47286140434986,1.30243786089249,-1.61946759033905,0.0648389645367334,0.0161634350252857
|
0.164,0.282185155472041,0.979060013649194,1.58296796977723,1.62043410557973,-1.55036298591798,-0.0769557406234719,0.02856779155977
|
||||||
0.166,0.490533772626531,1.05799302631962,1.47096061686153,1.29585253266698,-1.62060016314195,0.0667925518491565,0.0164329945239143
|
0.166,0.28280583712182,0.978708727035644,1.58314826598031,1.62119680438525,-1.55002951095837,-0.0782479595880829,0.0290516421115937
|
||||||
0.168,0.495698360758408,1.05945313336497,1.4690837162338,1.28928049589621,-1.62172727928815,0.0687564867308961,0.0166953433089443
|
0.168,0.283429075623506,0.978357529616511,1.58332763616464,1.62195695662045,-1.54969644749294,-0.0795398623657591,0.0295355284997882
|
||||||
0.17,0.50082807146055,1.06091054300935,1.46723100378656,1.2827241140101,-1.62284855663301,0.0707297908575757,0.016950415307515
|
0.17,0.284054871433801,0.978006421297028,1.58350607654057,1.62271456244007,-1.54936379614306,-0.0808314479893627,0.0300194511348173
|
||||||
0.172,0.505921645920092,1.06236463496105,1.4654027090981,1.27618556894938,-1.62396364981244,0.0727115263934614,0.0171981626975632
|
0.172,0.284683225004777,0.977655401989038,1.58368358331648,1.62346962199104,-1.54903155753642,-0.0821227154770566,0.0305034104241034
|
||||||
0.174,0.510977975493128,1.06381483102725,1.46359899759148,1.26966687571855,-1.62507224725731,0.0747007940471486,0.0174385543562951
|
0.174,0.285314136783819,0.977304471611047,1.58386015269888,1.62422213541247,-1.5486997323071,-0.0834136638323206,0.030987406772078
|
||||||
0.176,0.515996087110802,1.06526059223957,1.46181997762848,1.26316989652938,-1.62617406831665,0.0766967309783177,0.0176715744012447
|
0.176,0.285947607213544,0.976953630088275,1.58403578089245,1.62497210283579,-1.54836832109552,-0.0847042920439679,0.0314714405802334
|
||||||
0.178,0.520975129430561,1.06670141600493,1.46006570712712,1.25669635451767,-1.62726886049336,0.0786985085763708,0.0178972208252095
|
0.178,0.286583636731742,0.976602877352713,1.58421046410015,1.62571952438478,-1.54803732454846,-0.0859945990861612,0.0319555122471737
|
||||||
0.18,0.525914359713424,1.06813683329348,1.4583361997222,1.25024784702624,-1.62835639679346,0.0807053301288722,0.018115504225208
|
0.18,0.287222225771302,0.976252213343167,1.58438419852324,1.62646440017566,-1.54770674331902,-0.0872845839184297,0.0324396221686657
|
||||||
0.182,0.530813131400832,1.06956640587183,1.45663143049105,1.24382585845659,-1.62943647318829,0.0827164283948316,0.0183264466246588
|
0.182,0.287863374760144,0.97590163800532,1.5845569803614,1.62720673031715,-1.54737657806668,-0.0885742454856857,0.0329237707376901
|
||||||
0.184,0.535670882358609,1.07098972358797,1.45495134126864,1.23743177269962,-1.63050890618749,0.084731063095021,0.0185300803872241
|
0.184,0.288507084121155,0.975551151291778,1.58472880581277,1.62794651491056,-1.54704682945723,-0.0898635827182415,0.0334079583444932
|
||||||
0.186,0.540487123750597,1.07240640171113,1.45329584557758,1.2310668851637,-1.6315735305189,0.0867485183286836,0.0187264472201739
|
0.186,0.289153354272115,0.975200753162125,1.58489967107404,1.62868375404986,-1.54671749816281,-0.0911525945318267,0.033892185376637
|
||||||
0.188,0.54526142950029,1.07381607832826,1.45166483319964,1.22473241442463,-1.63263019691059,0.0887680999231974,0.0189155972646791
|
0.188,0.289802185625634,0.974850443582977,1.58506957234051,1.62941844782171,-1.54638858486189,-0.0924412798276051,0.0343764522190514
|
||||||
0.19,0.549993426295309,1.07521841179622,1.45005817441603,1.21842951352881,-1.63367876996873,0.0907891327204559,0.0190975882701343
|
0.19,0.290453578589085,0.974500222528032,1.58523850580615,1.6301505963056,-1.54606009023927,-0.0937296374921925,0.0348607592540846
|
||||||
0.192,0.55468278408642,1.07661307824739,1.44847572394389,1.21215928098644,-1.63471912614449,0.0928109578009326,0.0192724848494072
|
0.192,0.291107533564534,0.974150089978124,1.58540646766371,1.63088019957388,-1.54573201498608,-0.0950176663976742,0.0353451068615543
|
||||||
0.194,0.559329207029992,1.07799976914393,1.4469173245969,1.2059227714976,-1.63575115178179,0.0948329296435486,0.0194403578118137
|
0.194,0.291764050948672,0.973800045921278,1.58557345410477,1.6316072576918,-1.54540435979976,-0.0963053654016227,0.0358294954187993
|
||||||
0.196,0.563932424820101,1.0793781888748,1.44538281069794,1.19972100645986,-1.63677474123723,0.096854413216551,0.0196012835706063
|
0.196,0.292423131132757,0.973450090352759,1.5857394613198,1.63233177071767,-1.54507712538411,-0.0975927333471159,0.03631392530073
|
||||||
0.198,0.56849218435373,1.08074805238733,1.44387201127166,1.19355498431187,-1.63778979506226,0.0988747809915702,0.0197553436218292
|
0.198,0.293084774502535,0.973100223275128,1.58590448549825,1.63305373870282,-1.54475031244922,-0.0988797690627548,0.0367983968798798
|
||||||
0.2,0.573008241669545,1.08210908284378,1.4423847530452,1.18742569077398,-1.6387962182374,0.10089340986981,0.0199026240915238
|
0.2,0.293748981438185,0.972750444698293,1.58606852282864,1.63377316169178,-1.5444239217115,-0.100166471362683,0.0372829105264564
|
||||||
0.202,0.57748035409739,1.08346100929107,1.44092086328537,1.18133410905379,-1.63979391844655,0.102909678005867,0.0200432153484704
|
0.202,0.294415752314247,0.972400754639564,1.58623156949858,1.63449003972224,-1.54409795389372,-0.101452839046602,0.0377674666083925
|
||||||
0.204,0.581908272551671,1.08480356433026,1.43948017250095,1.17528123009259,-1.6407828043792,0.104922961510877,0.0201772116799003
|
0.204,0.295085087499557,0.972051153123704,1.5863936216949,1.63520437282521,-1.54377240972491,-0.102738870899796,0.038252065491397
|
||||||
0.206,0.586291733897091,1.08613648176994,1.43806251703955,1.16926806293759,-1.64176278404674,0.106932631012464,0.0203047110279236
|
0.206,0.295756987357185,0.971701640182982,1.5865546756037,1.63591616102504,-1.54344728994046,-0.104024565693144,0.0387367075390062
|
||||||
0.208,0.590630453309381,1.08745949424521,1.43666774160949,1.16329564533564,-1.64273376309773,0.108938048044185,0.0204258147847799
|
0.208,0.296431452244367,0.971352215857228,1.58671472741044,1.6366254043395,-1.54312259528206,-0.105309922183144,0.0392213931126348
|
||||||
0.21,0.594924116546526,1.08877233078131,1.43529570175815,1.15736505465657,-1.64369564311545,0.110938561231623,0.020540627645439
|
0.21,0.297108482512437,0.971002880193886,1.58687377329997,1.63733210277985,-1.54279832649772,-0.106594939111928,0.0397061225716272
|
||||||
0.212,0.59917237203715,1.09007471427752,1.43394626634078,1.15147741926967,-1.6446483198792,0.112933502235891,0.0206492575165592
|
0.212,0.297788078506771,0.970653633248063,1.58703180945667,1.63803625635091,-1.54247448434176,-0.107879615207285,0.0401908962733081
|
||||||
0.214,0.603374822681679,1.09136635888301,1.43261932001573,1.14563393051492,-1.6455916815681,0.114922181407675,0.0207518154813593
|
0.214,0.298470240566714,0.970304475082586,1.58718883206446,1.63873786505112,-1.54215106957482,-0.10916394918268,0.0406757145730338
|
||||||
0.216,0.607531017248159,1.09264696723191,1.43131476580591,1.13983585543318,-1.64652560688365,0.116903883095872,0.0208484158205918
|
0.216,0.299154969025521,0.969955405768056,1.58734483730694,1.63943692887261,-1.54182808296385,-0.110447939737272,0.0411605778242434
|
||||||
0.218,0.611640441227448,1.09391622749866,1.43003252777044,1.13408455044681,-1.64744996306321,0.118877860543898,0.0209391760905339
|
0.218,0.29984226421029,0.969606425382896,1.58749982136741,1.64013344780127,-1.54150552528214,-0.111731585555937,0.0416454863785097
|
||||||
0.22,0.615702506990877,1.09517381022828,1.42877255383642,1.12838147621652,-1.64836460375254,0.120843330293354,0.0210242172597587
|
0.22,0.3005321264419,0.969257534013409,1.58765378042898,1.64082742181683,-1.54118339730925,-0.113014885309286,0.04213044058559
|
||||||
0.222,0.619716543066404,1.0964193648871,1.42753481884801,1.12272821394221,-1.64926936669954,0.122799465998217,0.0211036639074507
|
0.222,0.301224556034948,0.968908731753829,1.58780671067464,1.6415188508929,-1.54086169983111,-0.114297837653685,0.0426154407934776
|
||||||
0.224,0.623681782314903,1.09765251606879,1.42631932789977,1.117126483429,-1.65016407122443,0.124745391532273,0.0211776444872216
|
0.224,0.301919553297684,0.968560018706372,1.58795860828732,1.64220773499704,-1.54054043363992,-0.115580441231278,0.0431004873484523
|
||||||
0.226,0.627597348744652,1.09887285927698,1.42512612003332,1.11157816330648,-1.65104851541256,0.126680173246775,0.0212462916618221
|
0.226,0.302617118531949,0.968211394981292,1.58810946944998,1.64289407409085,-1.54021959953422,-0.116862694670006,0.0435855805951317
|
||||||
0.228,0.631462242646331,1.10007995618832,1.42395527239265,1.10608531387447,-1.65192247296484,0.12860281120284,0.0213097427159108
|
0.228,0.303317252033112,0.967862860696935,1.58825929034571,1.64357786813002,-1.53989919831888,-0.118144596583632,0.0440707208765224
|
||||||
0.23,0.635275323659058,1.1012733292778,1.42280690495391,1.10065020315785,-1.65278568962571,0.130512229161623,0.0213681400562343
|
0.23,0.304019954090006,0.967514415979785,1.58840806715775,1.6442591170644,-1.53957923080508,-0.119426145571755,0.0445559085340702
|
||||||
0.232,0.63903529128488,1.10245245565926,1.42168118597271,1.09527533689436,-1.65363787909004,0.132407263061863,0.0214216318113319
|
0.232,0.304725224984871,0.967166060964527,1.58855579606963,1.64493782083805,-1.53925969781032,-0.120707340219838,0.0450411439077118
|
||||||
0.234,0.642736496313849,1.10361545093439,1.42057957825489,1.08996946544768,-1.6544777729133,0.134284534660412,0.0214703177474029
|
0.234,0.305433064993284,0.96681779579409,1.5887024732652,1.64561397938933,-1.53894060015842,-0.121988179099229,0.0455264273359255
|
||||||
0.236,0.646372093974725,1.10476004924951,1.41950386936223,1.08474313656344,-1.65530383140351,0.136139993161554,0.0215143104730273
|
0.236,0.306143474384104,0.966469620619707,1.58884809492874,1.64628759265094,-1.53862193867954,-0.123268660767179,0.0460117591557821
|
||||||
0.238,0.64993532926834,1.10588400622119,1.41845578486969,1.07960686203962,-1.65611453450217,0.137969559783451,0.0215537551641745
|
0.238,0.306856453419405,0.966121535600963,1.58899265724502,1.64695866055001,-1.53830371421017,-0.124548783766869,0.0464971397029957
|
||||||
0.24,0.653419530807091,1.10698509841652,1.41743699292,1.07457111972711,-1.65690838059529,0.139769129987341,0.021588827953406
|
0.24,0.30757200235442,0.965773540905851,1.58913615639938,1.64762718300816,-1.53798592759311,-0.12582854662743,0.0469825693119748
|
||||||
0.242,0.65681810545678,1.10806112300992,1.41644910860526,1.06964635415541,-1.65768388547656,0.141534576296102,0.0216197341763527
|
0.242,0.308290121437475,0.965425636710822,1.58927858857782,1.64829315994152,-1.53766857967752,-0.127107947863965,0.047468048315873
|
||||||
0.244,0.66012453378391,1.10910989761547,1.41549369817407,1.06484297577424,-1.65843958146359,0.143261751708139,0.0216467064714335
|
0.244,0.309010810909931,0.965077823200839,1.58941994996707,1.64895659126086,-1.53735167131887,-0.128386985977575,0.0479535770466399
|
||||||
0.246,0.663332366311344,1.11012926029438,1.41457228306306,1.06017135880129,-1.65917401666846,0.144946493713076,0.0216700027291523
|
0.246,0.309734071006122,0.96473010056943,1.58956023675469,1.64961747687163,-1.53703520337899,-0.129665659455379,0.0484391558350722
|
||||||
0.248,0.666435220584072,1.11111706973783,1.41368634375261,1.05564183766743,-1.65988575442362,0.146584628915491,0.021689903887829
|
0.248,0.310459901953295,0.964382469018738,1.58969944512909,1.65027581667399,-1.53671917672604,-0.130943966770539,0.048924785010864
|
||||||
0.25,0.669426779044936,1.1120712056256,1.41283732344721,1.05126470205371,-1.6605733728641,0.148171978271759,0.0217067115733034
|
0.25,0.31118830397155,0.964034928759578,1.58983757127968,1.65093161056293,-1.53640359223453,-0.132221906382283,0.0494104649026581
|
||||||
0.252,0.67230080954945,1.11298957599929,1.41202662518981,1.04705015855001,-1.66123546948518,0.14970437454984,0.0217207455592956
|
0.252,0.311919277273779,0.963687480011482,1.58997461139693,1.65158485842826,-1.53608845078532,-0.13349947673593,0.0498961958380963
|
||||||
0.254,0.675054918669169,1.11387129484519,1.41125452047699,1.04300281446194,-1.66187148961923,0.151179673697358,0.0217323335474792
|
0.254,0.312652822065607,0.963340123002759,1.59011056167242,1.65223556015477,-1.53577375326561,-0.134776676262912,0.0503819781438705
|
||||||
0.256,0.677689677898528,1.11471641371178,1.41052042673693,1.03912289958477,-1.66248153408414,0.152597336038527,0.0217417933709644
|
0.256,0.313388938545334,0.962992857970542,1.59024541829896,1.65288371562221,-1.53545950056896,-0.1360535033808,0.0508678121457733
|
||||||
0.258,0.680205902287652,1.11552507078587,1.40982371167993,1.03541023116908,-1.66306575878394,0.153956995337513,0.021749428991169
|
0.258,0.31412762690387,0.962645685160841,1.59037917747063,1.65352932470537,-1.53514569359531,-0.137329956493328,0.0513536981687488
|
||||||
0.26,0.682604636308303,1.11629748610458,1.409163698156,1.03186423250805,-1.66362437149318,0.155258452986939,0.0217555293641079
|
0.26,0.314868887324684,0.962298604828597,1.59051183538291,1.65417238727418,-1.53483233325094,-0.13860603399042,0.051839636536943
|
||||||
0.262,0.6848871405047,1.11703395696748,1.40853966853826,1.02848395102939,-1.66415762881832,0.156501672096117,0.021760367528145
|
0.262,0.315612719983738,0.961951617237731,1.59064338823272,1.65481290319372,-1.53451942044849,-0.139881734248211,0.0523256275737547
|
||||||
0.264,0.687054878865238,1.11773485354077,1.40795086867556,1.02526807592404,-1.66466583332293,0.157686771493156,0.0217641998988518
|
0.264,0.316359125049433,0.961604722661196,1.59077383221852,1.65545087232433,-1.534206956107,-0.141157055629075,0.0528116716018859
|
||||||
0.266,0.689109506857087,1.11840061464581,1.40739651145443,1.02221495533837,-1.66514933080505,0.158814019655678,0.0217672657566141
|
0.266,0.317108102682548,0.961257921381031,1.59090316354039,1.65608629452163,-1.53389494115187,-0.142431996481649,0.0532977689433926
|
||||||
0.268,0.69105286007145,1.11903174372432,1.40687578000731,1.01932261315163,-1.66560850771546,0.159883828585304,0.0217697869126982
|
0.268,0.317859653036183,0.960911213688412,1.59103137840012,1.6567191696366,-1.53358337651488,-0.143706555140862,0.0537839199197351
|
||||||
0.27,0.692886943432767,1.11962880497315,1.40638783060117,1.01658876535531,-1.66604378870713,0.160896747641634,0.0217719675396166
|
0.27,0.3186137762557,0.9605645998837,1.59115847300127,1.65734949751566,-1.53327226313419,-0.144980729927958,0.0542701248518287
|
||||||
0.272,0.694613920930365,1.12019241964189,1.40593179523737,1.01401083604683,-1.66645563430673,0.161853457351795,0.0217739941518242
|
0.272,0.319370472478667,0.960218080276496,1.59128444354927,1.65797727800068,-1.53296160195437,-0.146254519150522,0.0547563840600941
|
||||||
0.274,0.696236105835983,1.12072326248695,1.40550678399123,1.01158597304523,-1.66684453870013,0.162754763212052,0.0217760357230159
|
0.274,0.320129741834796,0.95987165518569,1.5914092862515,1.6586025109291,-1.53265139392637,-0.147527921102509,0.0552426978645079
|
||||||
0.276,0.697755951375101,1.12122205837642,1.40511188711695,1.00931106313328,-1.66721102762474,0.163601589498198,0.0217782439265824
|
0.276,0.320891584445894,0.959525324939513,1.59153299731737,1.65922519613393,-1.53234164000754,-0.14880093406427,0.0557290665846529
|
||||||
0.278,0.699176041824194,1.1216895790402,1.40474617694125,1.00718274692639,-1.66755565636225,0.164394973101665,0.0217807534861179
|
0.278,0.321656000425796,0.959179089875588,1.59165557295841,1.65984533344388,-1.53203234116164,-0.150073556302579,0.0562154905397685
|
||||||
0.28,0.700499084009816,1.12212663996054,1.40440870956698,1.00519743336615,-1.66787900782608,0.165136057408306,0.0217836826232383
|
0.28,0.322422989880316,0.958832950340979,1.59177700938833,1.66046292268334,-1.53172349835885,-0.151345786070659,0.0567019700488009
|
||||||
0.282,0.701727899188819,1.12253409739859,1.40409852640559,1.0033513138334,-1.66818169073876,0.165826086236788,0.0217871335903862
|
0.282,0.323192552907185,0.958486906692245,1.59189730282316,1.66107796367251,-1.53141511257575,-0.15261762160821,0.0571885054304539
|
||||||
0.284,0.702865415292041,1.12291284555272,1.40381465555585,1.00164037587392,-1.66846433789473,0.166466397853349,0.0217911932767349
|
0.284,0.323964689595999,0.958140959295485,1.59201644948126,1.66169045622742,-1.53110718479536,-0.153889061141441,0.0576750970032382
|
||||||
0.286,0.703914659516474,1.12326381384506,1.40355611304421,1.00006041652778,-1.66872760450488,0.167058419079344,0.0217959338757838
|
0.286,0.324739400028158,0.957795108526396,1.59213444558344,1.66230040016,-1.53079971600712,-0.155160102883092,0.0581617450855226
|
||||||
0.288,0.704878751253193,1.12358796433277,1.40332190394086,0.998607055252488,-1.66897216661964,0.167603659507635,0.0218014136037348
|
0.288,0.325516684276815,0.957449354770314,1.59225128735308,1.66290779527813,-1.5304927072069,-0.156430745032465,0.0586484499955835
|
||||||
0.29,0.705760915577555,1.12388618284817,1.40311081459325,0.997275755681831,-1.66919854164349,0.168103687680765,0.0218075720469102
|
0.29,0.326296542406816,0.957103698422271,1.59236697101614,1.66351264138571,-1.53018615939702,-0.157700985775455,0.059135212051655
|
||||||
0.292,0.706564561572463,1.12415883183593,1.40292053773514,0.996061876400101,-1.66940634032113,0.168560049436762,0.0218137901125297
|
0.292,0.327078974474646,0.956758139887043,1.5924814928013,1.66411493828273,-1.52988007358625,-0.158970823284575,0.0596220315719796
|
||||||
0.294,0.707293148791385,1.12440641878883,1.40274898596643,0.99496062434672,-1.66959538456491,0.168974376736195,0.0218195552112768
|
0.294,0.327863980528374,0.956412679579197,1.59259484894003,1.66471468576528,-1.5295744507898,-0.160240255718988,0.0601089088748571
|
||||||
0.296,0.707950166012334,1.12462967417806,1.4025944533599,0.99396705898098,-1.66976584321932,0.169348396413619,0.0218245415369336
|
0.296,0.328651560607598,0.956067317923144,1.59270703566668,1.66531188362568,-1.52926929202935,-0.161509281224534,0.0605958442786957
|
||||||
0.298,0.708539132867538,1.12482951105172,1.40245554382415,0.993076106285733,-1.66991816912845,0.169683918845492,0.021828572963982
|
0.298,0.329441714743389,0.955722055353186,1.59281804921854,1.66590653165247,-1.52896459833304,-0.162777897933763,0.061082838102061
|
||||||
0.3,0.709063601048548,1.12500698884725,1.40233110622867,0.992282571967934,-1.67005304212536,0.169982827411263,0.0218315899641012
|
0.3,0.330234442958236,0.955376892313565,1.59292788583597,1.6664986296305,-1.52866037073551,-0.164046103965962,0.0615698906637263
|
||||||
0.302,0.709527155063088,1.12516328141069,1.40222017658937,0.99158115384138,-1.67017131818006,0.170247068779264,0.0218336205413285
|
0.302,0.331029745265994,0.955031829258514,1.59303654176244,1.66708817734099,-1.52835661027784,-0.165313897427187,0.0620570022827223
|
||||||
0.304,0.709933412552451,1.12529964907496,1.40212192729088,0.990966453390331,-1.67027398467105,0.170478644022542,0.0218347550442238
|
0.304,0.331827621671827,0.954686866652304,1.59314401324465,1.66767517456159,-1.52805331800762,-0.166581276410293,0.0625441732783867
|
||||||
0.306,0.710286024196073,1.12541741457677,1.4020356231342,0.990432986520877,-1.67036212158804,0.170679600553607,0.0218351246401672
|
0.306,0.332628072172154,0.954342004969292,1.5932502965326,1.6682596210664,-1.52775049497894,-0.167848238994966,0.063031403970414
|
||||||
0.308,0.710588673238204,1.12551794256296,1.4019605839001,0.989975193511789,-1.67043686839195,0.170852024857835,0.0218348832072312
|
0.308,0.333431096754597,0.953997244693971,1.59335538787968,1.66884151662608,-1.52744814225239,-0.16911478324775,0.0635186946789048
|
||||||
0.31,0.710845074674242,1.12560262243324,1.40189615307419,0.989587448179387,-1.67049939622162,0.170998036000298,0.0218341923946644
|
0.31,0.334236695397927,0.953652586321016,1.59345928354276,1.66942086100786,-1.52714626089506,-0.170380907222085,0.0640060457244159
|
||||||
0.312,0.711058974134028,1.12567285427472,1.40184167236362,0.989264066272617,-1.67055088512486,0.171119779878176,0.0218332096110777
|
0.312,0.335044868072007,0.953308030355334,1.59356197978227,1.66999765397563,-1.52684485198055,-0.171646608958332,0.0644934574280089
|
||||||
0.314,0.711234146497942,1.12573003765657,1.40179646163219,0.988999313115664,-1.67059250598918,0.171219424189395,0.0218320787114413
|
0.314,0.335855614737744,0.95296357731211,1.5936634728623,1.67057189528999,-1.52654391658902,-0.172911886483809,0.0649809301113006
|
||||||
0.316,0.711374394280274,1.12577556306379,1.40175980387856,0.988787410516486,-1.67062540684716,0.171299154086923,0.0218309231648644
|
0.316,0.336668935347032,0.952619227716857,1.59376375905067,1.67114358470826,-1.52624345580712,-0.174176737812823,0.0654684640965115
|
||||||
0.318,0.711483545813478,1.12581080575691,1.40173093487695,0.988622542960711,-1.67065070322715,0.171361168486807,0.0218298414922057
|
0.318,0.337484829842701,0.952274982105459,1.59386283461903,1.67171272198463,-1.52594347072807,-0.175441160946701,0.0659560597065153
|
||||||
0.32,0.711565453266935,1.12583712184677,1.4017090370887,0.988498863111629,-1.67066947221106,0.171407676996329,0.0218289047650134
|
0.32,0.338303298158464,0.951930841024221,1.59396069584294,1.6722793068701,-1.52564396245162,-0.176705153873823,0.0664437172648883
|
||||||
0.322,0.71162399053454,1.12585584637196,1.40169323743674,0.988410496638348,-1.67068274984787,0.171440897426766,0.021828155955454
|
0.322,0.339124340218865,0.951586805029915,1.59405733900198,1.67284333911265,-1.52534493208409,-0.177968714569655,0.0669314370959582
|
||||||
0.324,0.711663051026769,1.12586829316129,1.40168260851534,0.988351546395683,-1.67069153155464,0.171463053853064,0.0218276109217672
|
0.324,0.339947955939224,0.951242874689827,1.5941527603798,1.67340481845719,-1.52504638073836,-0.179231840996784,0.0674192195248532
|
||||||
0.326,0.711686545404481,1.12587575625676,1.40167617278701,0.988316095980698,-1.67069677511968,0.171476375180642,0.0218272608067261
|
0.326,0.34077414522559,0.950899050581803,1.59424695626424,1.6739637446457,-1.52474830953388,-0.18049453110495,0.0679070648775512
|
||||||
0.328,0.711698399293412,1.12587951266435,1.40167290929865,0.988298212692149,-1.67069940590607,0.171483094177588,0.021827075618881
|
0.328,0.341602907974683,0.950555333294294,1.59433992294741,1.67452011741722,-1.52445071959667,-0.18175678283108,0.0683949734809281
|
||||||
0.33,0.711702551019825,1.12588082619303,1.40167176243318,0.988291949920128,-1.67070032384003,0.171485446928849,0.0218270087591687
|
0.33,0.342434244073849,0.950211723426402,1.59443165672576,1.67507393650796,-1.52415361205937,-0.183018594099322,0.0688829456628071
|
||||||
0.332,0.711702949409042,1.12588095213593,1.40167165220097,0.988291348994029,-1.67070041175885,0.171485672667813,0.0218270022495337
|
0.332,0.343268153401002,0.949868221587929,1.59452215390022,1.6756252016513,-1.52385698806118,-0.184279962821081,0.069370981752007
|
||||||
0.334,0.711702949409042,1.12588095213593,1.40167165220097,0.988291348994029,-1.67070041175885,0.171485672667813,0.0218270022495337
|
0.334,0.344104635824578,0.949524828399416,1.59461141077621,1.67617391257789,-1.52356084874794,-0.18554088689505,0.0698590820783912
|
||||||
|
0.336,0.344943691203482,0.949181544492193,1.59469942366383,1.67672006901567,-1.52326519527207,-0.186801364207251,0.0703472469729158
|
||||||
|
0.338,0.345785319387035,0.948838370508422,1.59478618887784,1.67726367068995,-1.52297002879264,-0.188061392631064,0.0708354767676782
|
||||||
|
0.34,0.346629520214928,0.948495307101141,1.59487170273784,1.67780471732343,-1.52267535047535,-0.189320970027268,0.0713237717959655
|
||||||
|
0.342,0.347476293517167,0.948152354934307,1.59495596156831,1.6783432086363,-1.52238116149254,-0.190580094244071,0.0718121323923024
|
||||||
|
0.344,0.348325639114026,0.947809514682845,1.59503896169872,1.67887914434624,-1.52208746302317,-0.191838763117154,0.0723005588924998
|
||||||
|
0.346,0.349177556815994,0.947466787032685,1.59512069946362,1.67941252416852,-1.52179425625291,-0.193096974469698,0.0727890516337023
|
||||||
|
0.348,0.350032046423729,0.947124172680809,1.59520117120271,1.67994334781601,-1.52150154237405,-0.194354726112429,0.0732776109544367
|
||||||
|
0.35,0.350889107728003,0.946781672335295,1.59528037326097,1.68047161499928,-1.5212093225856,-0.19561201584365,0.0737662371946591
|
||||||
|
0.352,0.351748740509659,0.946439286715355,1.5953583019887,1.68099732542658,-1.52091759809321,-0.19686884144928,0.0742549306958032
|
||||||
|
0.354,0.352610944539556,0.946097016551382,1.59543495374166,1.68152047880399,-1.52062637010927,-0.198125200702894,0.0747436918008276
|
||||||
|
0.356,0.353475719578523,0.94575486258499,1.59551032488114,1.68204107483538,-1.52033563985285,-0.199381091365754,0.0752325208542634
|
||||||
|
0.358,0.354343065377309,0.945412825569056,1.59558441177404,1.68255911322251,-1.52004540854973,-0.200636511186854,0.0757214182022613
|
||||||
|
0.36,0.355212981676535,0.945070906267762,1.59565721079299,1.68307459366507,-1.51975567743242,-0.201891457902957,0.0762103841926393
|
||||||
|
0.362,0.356085468206646,0.944729105456634,1.5957287183164,1.68358751586073,-1.51946644774018,-0.203145929238629,0.0766994191749294
|
||||||
|
0.364,0.356960524687859,0.944387423922587,1.59579893072861,1.6840978795052,-1.51917772071898,-0.204399922906287,0.0771885235004247
|
||||||
|
0.366,0.35783815083012,0.944045862463961,1.59586784441992,1.68460568429225,-1.51888949762157,-0.205653436606227,0.0776776975222266
|
||||||
|
0.368,0.358718346333053,0.943704421890561,1.59593545578674,1.6851109299138,-1.51860177970743,-0.206906468026673,0.0781669415952909
|
||||||
|
0.37,0.359601110885912,0.943363103023703,1.59600176123164,1.68561361605995,-1.51831456824285,-0.208159014843814,0.0786562560764751
|
||||||
|
0.372,0.360486444167536,0.943021906696245,1.59606675716345,1.68611374241903,-1.51802786450087,-0.209411074721842,0.0791456413245844
|
||||||
|
0.374,0.361374345846298,0.942680833752633,1.59613043999738,1.68661130867764,-1.51774166976134,-0.210662645312993,0.0796350977004183
|
||||||
|
0.376,0.36226481558006,0.942339885048933,1.59619280615507,1.68710631452072,-1.51745598531088,-0.211913724257591,0.0801246255668166
|
||||||
|
0.378,0.363157853016126,0.941999061452876,1.59625385206475,1.68759875963159,-1.51717081244295,-0.213164309184085,0.0806142252887057
|
||||||
|
0.38,0.364053457791195,0.941658363843892,1.59631357416123,1.688088643692,-1.51688615245782,-0.214414397709093,0.0811038972331446
|
||||||
|
0.382,0.364951629531313,0.941317793113149,1.59637196888611,1.68857596638216,-1.51660200666258,-0.215663987437443,0.08159364176937
|
||||||
|
0.384,0.365852367851828,0.940977350163588,1.59642903268779,1.68906072738083,-1.51631837637116,-0.216913075962212,0.082083459268843
|
||||||
|
0.386,0.366755672357344,0.940637035909964,1.5964847620216,1.68954292636532,-1.51603526290435,-0.218161660864773,0.0825733501052936
|
||||||
|
0.388,0.367661542641671,0.940296851278877,1.59653915334987,1.69002256301158,-1.5157526675898,-0.219409739714834,0.0830633146547665
|
||||||
|
0.39,0.368569978287785,0.939956797208814,1.59659220314207,1.69049963699421,-1.515470591762,-0.220657310070483,0.0835533532956665
|
||||||
|
0.392,0.369480978867779,0.939616874650179,1.59664390787484,1.69097414798655,-1.51518903676233,-0.221904369478227,0.0840434664088029
|
||||||
|
0.394,0.370394543942817,0.939277084565332,1.59669426403216,1.69144609566067,-1.51490800393909,-0.223150915473041,0.0845336543774348
|
||||||
|
0.396,0.371310673063087,0.938937427928622,1.59674326810536,1.6919154796875,-1.51462749464742,-0.224396945578406,0.0850239175873156
|
||||||
|
0.398,0.372229365767761,0.938597905726425,1.59679091659329,1.69238229973678,-1.51434751024941,-0.225642457306357,0.0855142564267376
|
||||||
|
0.4,0.373150621584946,0.938258518957171,1.59683720600238,1.69284655547717,-1.51406805211405,-0.226887448157526,0.0860046712865763
|
||||||
|
0.402,0.374074440031639,0.937919268631384,1.59688213284672,1.6933082465763,-1.51378912161725,-0.228131915621184,0.0864951625603347
|
||||||
|
0.404,0.375000820613682,0.937580155771713,1.59692569364819,1.69376737270078,-1.51351072014188,-0.229375857175288,0.086985730644187
|
||||||
|
0.406,0.375929762825722,0.937241181412965,1.59696788493653,1.69422393351626,-1.51323284907771,-0.230619270286527,0.0874763759370227
|
||||||
|
0.408,0.376861266151158,0.936902346602134,1.59700870324946,1.69467792868748,-1.51295550982152,-0.231862152410366,0.0879670988404902
|
||||||
|
0.41,0.377795330062107,0.936563652398441,1.59704814513274,1.69512935787833,-1.51267870377702,-0.233104500991088,0.0884578997590401
|
||||||
|
0.412,0.37873195401935,0.936225099873356,1.59708620714031,1.69557822075187,-1.51240243235489,-0.234346313461847,0.0889487790999687
|
||||||
|
0.414,0.379671137472297,0.935886690110636,1.59712288583434,1.69602451697037,-1.51212669697282,-0.235587587244708,0.0894397372734609
|
||||||
|
0.416,0.380612879858934,0.935548424206352,1.59715817778535,1.6964682461954,-1.51185149905546,-0.236828319750696,0.089930774692633
|
||||||
|
0.418,0.38155718060579,0.935210303268921,1.59719207957232,1.69690940808782,-1.5115768400345,-0.238068508379842,0.0904218917735756
|
||||||
|
0.42,0.382504039127882,0.934872328419132,1.59722458778275,1.69734800230787,-1.51130272134862,-0.239308150521231,0.090913088935396
|
||||||
|
0.422,0.383453454828683,0.934534500790182,1.5972556990128,1.69778402851517,-1.51102914444351,-0.240547243553046,0.0914043666002606
|
||||||
|
0.424,0.38440542710007,0.934196821527698,1.59728540986734,1.69821748636881,-1.51075611077192,-0.24178578484262,0.0918957251934366
|
||||||
|
0.426,0.385359955322286,0.933859291789768,1.59731371696009,1.69864837552736,-1.51048362179361,-0.243023771746481,0.0923871651433344
|
||||||
|
0.428,0.386317038863895,0.933521912746971,1.59734061691368,1.69907669564892,-1.51021167897542,-0.244261201610398,0.0928786868815489
|
||||||
|
0.43,0.387276677081741,0.933184685582401,1.59736610635976,1.69950244639119,-1.50994028379122,-0.245498071769434,0.0933702908429011
|
||||||
|
0.432,0.388238869320904,0.932847611491693,1.59739018193913,1.69992562741147,-1.50966943772197,-0.246734379547992,0.0938619774654791
|
||||||
|
0.434,0.389203614914658,0.932510691683054,1.59741284030178,1.70034623836673,-1.50939914225568,-0.247970122259861,0.0943537471906794
|
||||||
|
0.436,0.390170913184431,0.932173927377284,1.59743407810701,1.70076427891365,-1.50912939888748,-0.249205297208272,0.0948456004632477
|
||||||
|
0.438,0.391140763439758,0.931837319807807,1.59745389202356,1.70117974870866,-1.50886020911956,-0.25043990168594,0.0953375377313192
|
||||||
|
0.44,0.392113164978246,0.931500870220689,1.59747227872965,1.70159264740799,-1.50859157446123,-0.251673932975118,0.0958295594464589
|
||||||
|
0.442,0.393088117085527,0.931164579874666,1.59748923491312,1.70200297466769,-1.50832349642891,-0.252907388347646,0.0963216660637022
|
||||||
|
0.444,0.394065619035216,0.930828450041171,1.59750475727152,1.70241073014369,-1.50805597654615,-0.254140265064998,0.0968138580415941
|
||||||
|
0.446,0.395045670088874,0.930492482004351,1.59751884251218,1.70281591349184,-1.50778901634361,-0.25537256037834,0.0973061358422294
|
||||||
|
0.448,0.396028269495965,0.930156677061093,1.59753148735235,1.70321852436796,-1.50752261735909,-0.25660427152857,0.0977984999312916
|
||||||
|
0.45,0.397013416493813,0.929821036521048,1.59754268851926,1.70361856242784,-1.50725678113756,-0.257835395746379,0.0982909507780924
|
||||||
|
0.452,0.398001110307561,0.929485561706649,1.59755244275026,1.70401602732735,-1.5069915092311,-0.259065930252294,0.0987834888556103
|
||||||
|
0.454,0.398991350150136,0.929150253953137,1.59756074679286,1.70441091872241,-1.506726803199,-0.260295872256736,0.0992761146405295
|
||||||
|
0.456,0.399984135222199,0.928815114608577,1.59756759740488,1.70480323626908,-1.50646266460768,-0.261525218960066,0.099768828613278
|
||||||
|
0.458,0.400979464712113,0.928480145033881,1.59757299135453,1.70519297962359,-1.50619909503075,-0.262753967552641,0.100261631258066
|
||||||
|
0.46,0.401977337795896,0.928145346602827,1.59757692542049,1.70558014844233,-1.50593609604903,-0.263982115214864,0.100754523062923
|
||||||
|
0.462,0.402977753637188,0.927810720702078,1.59757939639205,1.70596474238199,-1.5056736692505,-0.265209659117237,0.101247504519738
|
||||||
|
0.464,0.403980711387202,0.927476268731201,1.59758040106917,1.70634676109951,-1.50541181623034,-0.266436596420413,0.101740576124292
|
||||||
|
0.466,0.404986210184694,0.927141992102685,1.59757993626258,1.70672620425215,-1.50515053859098,-0.267662924275251,0.1022337383763
|
||||||
|
0.468,0.405994249155913,0.926807892241959,1.5975779987939,1.70710307149753,-1.50488983794201,-0.268888639822866,0.102726991779444
|
||||||
|
0.47,0.40700482741457,0.926473970587407,1.59757458549574,1.7074773624937,-1.50462971590028,-0.270113740194684,0.103220336841414
|
||||||
|
0.472,0.408017944061793,0.926140228590386,1.59756969321177,1.7078490768991,-1.50437017408986,-0.271338222512494,0.103713774073937
|
||||||
|
0.474,0.409033598186093,0.925806667715241,1.59756331879685,1.70821821437268,-1.50411121414204,-0.272562083888507,0.104207303992821
|
||||||
|
0.476,0.410051788863317,0.925473289439324,1.59755545911709,1.7085847745739,-1.50385283769538,-0.273785321425403,0.104700927117986
|
||||||
|
0.478,0.411072515156616,0.925140095253,1.59754611105,1.70894875716276,-1.50359504639568,-0.275007932216388,0.1051946439735
|
||||||
|
0.48,0.412095776116403,0.924807086659672,1.59753527148455,1.70931016179987,-1.50333784189597,-0.276229913345252,0.105688455087614
|
||||||
|
0.482,0.413121570780314,0.924474265175787,1.59752293732127,1.70966898814644,-1.50308122585658,-0.277451261886419,0.106182360992797
|
||||||
|
0.484,0.414149898173172,0.924141632330849,1.59750910547238,1.71002523586438,-1.50282519994509,-0.278671974905004,0.106676362225771
|
||||||
|
0.486,0.415180757306943,0.923809189667436,1.59749377286185,1.71037890461627,-1.50256976583636,-0.279892049456867,0.107170459327546
|
||||||
|
0.488,0.416214147180705,0.92347693874121,1.59747693642552,1.71072999406544,-1.50231492521251,-0.28111148258867,0.107664652843451
|
||||||
|
0.49,0.417250066780603,0.923144881120924,1.59745859311121,1.71107850387601,-1.50206067976296,-0.282330271337933,0.108158943323168
|
||||||
|
0.492,0.418288515079815,0.92281301838844,1.59743873987878,1.71142443371289,-1.50180703118444,-0.283548412733088,0.10865333132077
|
||||||
|
0.494,0.419329491038513,0.922481352138732,1.59741737370027,1.71176778324186,-1.50155398118094,-0.284765903793536,0.109147817394746
|
||||||
|
0.496,0.420372993603824,0.922149883979901,1.59739449155999,1.71210855212956,-1.50130153146376,-0.285982741529702,0.10964240210804
|
||||||
|
0.498,0.421419021709794,0.921818615533179,1.59737009045458,1.71244674004356,-1.50104968375153,-0.287198922943095,0.110137086028081
|
||||||
|
0.5,0.422467574277348,0.921487548432941,1.59734416739316,1.71278234665239,-1.50079843977016,-0.288414445026361,0.110631869726815
|
||||||
|
0.502,0.423518650214258,0.92115668432671,1.59731671939742,1.71311537162556,-1.50054780125289,-0.289629304763342,0.111126753780736
|
||||||
|
0.504,0.424572248415098,0.920826024875166,1.5972877435017,1.71344581463362,-1.50029776994026,-0.290843499129133,0.111621738770918
|
||||||
|
0.506,0.425628367761213,0.920495571752151,1.59725723675307,1.71377367534816,-1.50004834758017,-0.292057025090136,0.112116825283045
|
||||||
|
0.508,0.426687007120678,0.920165326644675,1.5972251962115,1.71409895344188,-1.4997995359278,-0.293269879604124,0.112612013907443
|
||||||
|
0.51,0.427748165348264,0.919835291252921,1.59719161894989,1.7144216485886,-1.49955133674569,-0.294482059620294,0.113107305239111
|
||||||
|
0.512,0.428811841285401,0.91950546729025,1.59715650205419,1.71474176046331,-1.49930375180371,-0.295693562079326,0.113602699877745
|
||||||
|
0.514,0.429878033760137,0.919175856483205,1.59711984262351,1.71505928874217,-1.49905678287905,-0.296904383913441,0.114098198427777
|
||||||
|
0.516,0.430946741587108,0.918846460571513,1.59708163777022,1.7153742331026,-1.49881043175625,-0.298114522046459,0.114593801498395
|
||||||
|
0.518,0.432017963567498,0.918517281308088,1.59704188462004,1.71568659322327,-1.4985647002272,-0.29932397339386,0.115089509703578
|
||||||
|
0.52,0.433091698489001,0.918188320459035,1.59700058031211,1.71599636878415,-1.49831959009112,-0.300532734862839,0.115585323662122
|
||||||
|
0.522,0.434167945125789,0.917859579803647,1.59695772199916,1.71630355946653,-1.49807510315458,-0.301740803352369,0.116081243997667
|
||||||
|
0.524,0.435246702238473,0.917531061134412,1.59691330684755,1.71660816495307,-1.49783124123149,-0.302948175753255,0.116577271338728
|
||||||
|
0.526,0.436327968574069,0.917202766257005,1.59686733203737,1.71691018492781,-1.49758800614312,-0.304154848948199,0.117073406318718
|
||||||
|
0.528,0.437411742865961,0.916874696990294,1.59681979476258,1.71720961907622,-1.4973453997181,-0.305360819811854,0.11756964957598
|
||||||
|
0.53,0.438498023833864,0.916546855166338,1.59677069223108,1.71750646708523,-1.49710342379238,-0.306566085210889,0.118066001753808
|
||||||
|
0.532,0.439586810183794,0.916219242630379,1.59672002166479,1.71780072864327,-1.49686208020928,-0.307770642004043,0.118562463500479
|
||||||
|
0.534,0.440678100608024,0.915891861240847,1.5966677802998,1.71809240344026,-1.4966213708195,-0.308974487042191,0.119059035469273
|
||||||
|
0.536,0.441771893785058,0.915564712869354,1.59661396538643,1.71838149116769,-1.49638129748104,-0.3101776171684,0.119555718318503
|
||||||
|
0.538,0.442868188379589,0.915237799400688,1.59655857418932,1.71866799151864,-1.49614186205929,-0.311380029217989,0.120052512711538
|
||||||
|
0.54,0.443966983042466,0.91491112273281,1.59650160398758,1.71895190418777,-1.49590306642699,-0.312581720018594,0.120549419316826
|
||||||
|
0.542,0.445068276410662,0.91458468477685,1.59644305207483,1.71923322887141,-1.49566491246421,-0.313782686390222,0.121046438807922
|
||||||
|
0.544,0.446172067107234,0.914258487457099,1.59638291575934,1.71951196526756,-1.49542740205841,-0.314982925145319,0.12154357186351
|
||||||
|
0.546,0.447278353741294,0.913932532711005,1.59632119236409,1.7197881130759,-1.49519053710435,-0.316182433088826,0.122040819167425
|
||||||
|
0.548,0.448387134907968,0.913606822489161,1.59625787922691,1.72006167199787,-1.49495431950419,-0.31738120701824,0.122538181408677
|
||||||
|
0.55,0.449498409188369,0.913281358755302,1.59619297370056,1.72033264173665,-1.4947187511674,-0.31857924372368,0.123035659281475
|
||||||
|
0.552,0.450612175149558,0.912956143486296,1.59612647315281,1.72060102199721,-1.49448383401081,-0.319776539987942,0.123533253485245
|
||||||
|
0.554,0.451728431344509,0.91263117867213,1.59605837496658,1.72086681248635,-1.4942495699586,-0.320973092586567,0.124030964724659
|
||||||
|
0.556,0.452847176312079,0.912306466315906,1.59598867653998,1.72113001291272,-1.49401596094226,-0.322168898287895,0.124528793709649
|
||||||
|
0.558,0.453968408576972,0.911982008433825,1.59591737528648,1.72139062298681,-1.49378300890066,-0.323363953853137,0.125026741155429
|
||||||
|
0.56,0.455092126649704,0.91165780705518,1.59584446863492,1.72164864242107,-1.49355071577996,-0.324558256036426,0.125524807782522
|
||||||
|
0.562,0.456218329026572,0.911333864222342,1.5957699540297,1.72190407092982,-1.49331908353368,-0.325751801584889,0.126022994316769
|
||||||
|
0.564,0.457347014189618,0.911010181990748,1.59569382893082,1.72215690822939,-1.49308811412265,-0.326944587238701,0.12652130148936
|
||||||
|
0.566,0.458478180606598,0.910686762428884,1.59561609081397,1.72240715403807,-1.49285780951502,-0.328136609731153,0.127019730036845
|
||||||
|
0.568,0.459611826730947,0.910363607618278,1.59553673717068,1.72265480807615,-1.49262817168628,-0.329327865788713,0.127518280701155
|
||||||
|
0.57,0.460747951001747,0.910040719653478,1.59545576550837,1.72289987006599,-1.4923992026192,-0.330518352131086,0.128016954229621
|
||||||
|
0.572,0.461886551843691,0.909718100642041,1.59537317335046,1.723142339732,-1.49217090430386,-0.331708065471283,0.128515751374993
|
||||||
|
0.574,0.463027627667057,0.909395752704516,1.59528895823648,1.72338221680068,-1.49194327873766,-0.332897002515675,0.129014672895453
|
||||||
|
0.576,0.464171176867667,0.909073677974424,1.59520311772215,1.72361950100065,-1.49171632792528,-0.334085159964064,0.129513719554636
|
||||||
|
0.578,0.46531719782686,0.908751878598245,1.59511564937949,1.72385419206267,-1.49149005387869,-0.335272534509743,0.130012892121643
|
||||||
|
0.58,0.466465688911458,0.908430356735398,1.59502655079689,1.72408628971968,-1.49126445861714,-0.336459122839557,0.13051219137106
|
||||||
|
0.582,0.467616648473732,0.908109114558218,1.59493581957926,1.7243157937068,-1.49103954416714,-0.337644921633971,0.131011618082973
|
||||||
|
0.584,0.468770074851372,0.907788154251945,1.59484345334806,1.72454270376138,-1.49081531256249,-0.338829927567129,0.131511173042979
|
||||||
|
0.586,0.469925966367455,0.907467478014693,1.59474944974146,1.72476701962301,-1.49059176584422,-0.34001413730692,0.132010857042206
|
||||||
|
0.588,0.471084321330411,0.907147088057438,1.59465380641438,1.72498874103356,-1.49036890606064,-0.341197547515043,0.132510670877323
|
||||||
|
0.59,0.472245138033991,0.906826986603992,1.59455652103862,1.72520786773716,-1.49014673526726,-0.342380154847064,0.133010615350555
|
||||||
|
0.592,0.473408414757241,0.906507175890978,1.59445759130295,1.72542439948029,-1.48992525552685,-0.34356195595249,0.133510691269697
|
||||||
|
0.594,0.47457414976446,0.906187658167812,1.59435701491321,1.72563833601175,-1.4897044689094,-0.344742947474824,0.134010899448123
|
||||||
|
0.596,0.47574234130518,0.905868435696676,1.59425478959237,1.72584967708271,-1.48948437749209,-0.345923126051633,0.134511240704803
|
||||||
|
0.598,0.476912987614126,0.905549510752494,1.5941509130807,1.72605842244674,-1.48926498335933,-0.347102488314612,0.13501171586431
|
||||||
|
0.6,0.478086086911188,0.905230885622905,1.59404538313576,1.72626457185978,-1.48904628860268,-0.348281030889647,0.135512325756834
|
||||||
|
0.602,0.479261637401393,0.904912562608241,1.59393819753261,1.72646812508025,-1.48882829532091,-0.349458750396881,0.136013071218192
|
||||||
|
0.604,0.480439637274868,0.904594544021494,1.59382935406381,1.72666908186899,-1.48861100561995,-0.350635643450775,0.136513953089834
|
||||||
|
0.606,0.481620084706813,0.904276832188293,1.59371885053956,1.72686744198932,-1.48839442161287,-0.351811706660177,0.13701497221886
|
||||||
|
0.608,0.482802977857471,0.903959429446877,1.59360668478781,1.72706320520708,-1.48817854541989,-0.352986936628383,0.137516129458023
|
||||||
|
0.61,0.483988314872094,0.90364233814806,1.5934928546543,1.72725637129059,-1.48796337916836,-0.3541613299532,0.138017425665739
|
||||||
|
0.612,0.485176093880918,0.903325560655206,1.5933773580027,1.72744694001076,-1.48774892499274,-0.355334883227016,0.138518861706095
|
||||||
|
0.614,0.486366312999127,0.903009099344198,1.59326019271468,1.72763491114102,-1.4875351850346,-0.356507593036861,0.139020438448859
|
||||||
|
0.616,0.487558970326826,0.902692956603405,1.59314135669003,1.7278202844574,-1.48732216144258,-0.357679455964469,0.139522156769481
|
||||||
|
0.618,0.488754063949011,0.902377134833652,1.59302084784673,1.72800305973853,-1.4871098563724,-0.358850468586351,0.140024017549106
|
||||||
|
0.62,0.489951591935539,0.902061636448187,1.59289866412103,1.72818323676566,-1.48689827198684,-0.36002062747385,0.140526021674575
|
||||||
|
0.622,0.491151552341097,0.901746463872645,1.59277480346758,1.72836081532269,-1.4866874104557,-0.361189929193213,0.141028170038431
|
||||||
|
0.624,0.492353943205176,0.901431619545019,1.59264926385951,1.72853579519617,-1.48647727395584,-0.362358370305652,0.141530463538927
|
||||||
|
0.626,0.493558762552036,0.901117105915622,1.59252204328849,1.72870817617534,-1.48626786467109,-0.363525947367411,0.142032903080027
|
||||||
|
0.628,0.494766008390683,0.900802925447048,1.59239313976488,1.72887795805214,-1.48605918479229,-0.364692656929829,0.142535489571409
|
||||||
|
0.63,0.495975678714836,0.900489080614146,1.59226255131776,1.72904514062123,-1.48585123651724,-0.365858495539406,0.143038223928472
|
||||||
|
0.632,0.497187771502897,0.900175573903971,1.59213027599509,1.72920972368,-1.48564402205071,-0.36702345973787,0.143541107072334
|
||||||
|
0.634,0.498402284717928,0.899862407815755,1.59199631186372,1.72937170702861,-1.48543754360439,-0.368187546062236,0.144044139929837
|
||||||
|
0.636,0.499619216307615,0.899549584860865,1.59186065700957,1.72953109046998,-1.48523180339688,-0.369350751044879,0.144547323433548
|
||||||
|
0.638,0.500838564204245,0.899237107562765,1.59172330953764,1.72968787380984,-1.4850268036537,-0.370513071213592,0.145050658521758
|
||||||
|
0.64,0.502060326324677,0.898924978456973,1.59158426757215,1.72984205685669,-1.48482254660723,-0.371674503091655,0.145554146138485
|
||||||
|
0.642,0.503284500570311,0.898613200091027,1.59144352925663,1.72999363942192,-1.4846190344967,-0.372835043197899,0.146057787233472
|
||||||
|
0.644,0.504511084827061,0.898301775024437,1.59130109275397,1.73014262131969,-1.48441626956818,-0.373994688046771,0.146561582762187
|
||||||
|
0.646,0.50574007696533,0.897990705828645,1.59115695624656,1.73028900236709,-1.48421425407455,-0.3751534341484,0.147065533685819
|
||||||
|
0.648,0.506971474839979,0.897679995086986,1.59101111793635,1.73043278238403,-1.4840129902755,-0.37631127800866,0.147569640971281
|
||||||
|
0.65,0.508205276290301,0.89736964539464,1.59086357604494,1.73057396119335,-1.48381248043744,-0.377468216129236,0.148073905591203
|
||||||
|
0.652,0.509441479139993,0.897059659358588,1.59071432881369,1.73071253862077,-1.48361272683357,-0.37862424500769,0.148578328523931
|
||||||
|
0.654,0.51068008119713,0.896750039597571,1.59056337450377,1.73084851449496,-1.4834137317438,-0.379779361137527,0.149082910753522
|
||||||
|
0.656,0.511921080254135,0.896440788742039,1.59041071139629,1.73098188864751,-1.4832154974547,-0.380933561008256,0.149587653269741
|
||||||
|
0.658,0.513164474087757,0.896131909434109,1.59025633779236,1.73111266091297,-1.48301802625956,-0.382086841105458,0.150092557068056
|
||||||
|
0.66,0.514410260459039,0.895823404327517,1.59010025201319,1.73124083112886,-1.48282132045828,-0.383239197910851,0.15059762314963
|
||||||
|
0.662,0.515658437113297,0.89551527608757,1.58994245240019,1.73136639913569,-1.48262538235739,-0.384390627902356,0.151102852521318
|
||||||
|
0.664,0.516909001780089,0.895207527391094,1.58978293731502,1.73148936477694,-1.48243021427003,-0.385541127554157,0.151608246195661
|
||||||
|
0.666,0.51816195217319,0.894900160926391,1.58962170513971,1.73160972789914,-1.48223581851586,-0.386690693336772,0.152113805190873
|
||||||
|
0.668,0.519417285990568,0.894593179393185,1.58945875427673,1.7317274883518,-1.48204219742113,-0.387839321717115,0.15261953053084
|
||||||
|
0.67,0.520675000914355,0.894286585502574,1.58929408314909,1.73184264598752,-1.48184935331856,-0.38898700915856,0.153125423245108
|
||||||
|
0.672,0.521935094610826,0.893980381976974,1.5891276902004,1.7319552006619,-1.48165728854736,-0.390133752121008,0.153631484368872
|
||||||
|
0.674,0.523197564730369,0.893674571550073,1.58895957389499,1.73206515223364,-1.48146600545321,-0.391279547060951,0.154137714942972
|
||||||
|
0.676,0.524462408907462,0.893369156966773,1.58878973271797,1.73217250056449,-1.48127550638819,-0.392424390431536,0.154644116013877
|
||||||
|
0.678,0.525729624760646,0.893064140983141,1.58861816517533,1.73227724551931,-1.48108579371077,-0.393568278682629,0.155150688633677
|
||||||
|
0.68,0.526999209892505,0.892759526366351,1.58844486979399,1.73237938696605,-1.4808968697858,-0.394711208260885,0.155657433860071
|
||||||
|
0.682,0.528271161889635,0.892455315894632,1.58826984512195,1.73247892477576,-1.48070873698442,-0.395853175609803,0.156164352756354
|
||||||
|
0.684,0.529545478322624,0.892151512357212,1.58809308972831,1.73257585882264,-1.48052139768411,-0.396994177169802,0.156671446391406
|
||||||
|
0.686,0.530822156746026,0.891848118554258,1.58791460220337,1.73267018898401,-1.48033485426858,-0.398134209378273,0.157178715839674
|
||||||
|
0.688000000000001,0.532101194698337,0.891545137296824,1.58773438115874,1.73276191514032,-1.48014910912778,-0.399273268669656,0.157686162181166
|
||||||
|
0.690000000000001,0.533382589701972,0.891242571406793,1.58755242522738,1.7328510371752,-1.47996416465785,-0.400411351475495,0.158193786501428
|
||||||
|
0.692000000000001,0.53466633926324,0.890940423716815,1.58736873306373,1.73293755497542,-1.4797800232611,-0.401548454224505,0.158701589891533
|
||||||
|
0.694000000000001,0.535952440872321,0.89063869707025,1.58718330334374,1.73302146843096,-1.47959668734595,-0.40268457334264,0.159209573448066
|
||||||
|
0.696000000000001,0.537240892003244,0.890337394321109,1.586996134765,1.73310277743496,-1.47941415932693,-0.403819705253151,0.159717738273103
|
||||||
|
0.698000000000001,0.538531690113862,0.890036518333992,1.58680722604678,1.73318148188375,-1.4792324416246,-0.404953846376654,0.1602260854742
|
||||||
|
0.700000000000001,0.539824832645832,0.88973607198403,1.58661657593013,1.73325758167688,-1.47905153666555,-0.406086993131194,0.160734616164367
|
||||||
|
0.702000000000001,0.541120317024588,0.889436058156818,1.58642418317797,1.73333107671711,-1.47887144688234,-0.407219141932305,0.161243331462059
|
||||||
|
0.704000000000001,0.542418140659324,0.889136479748358,1.58623004657515,1.7334019669104,-1.47869217471346,-0.40835028919308,0.161752232491148
|
||||||
|
0.706000000000001,0.543718300942968,0.888837339664992,1.58603416492852,1.73347025216597,-1.47851372260333,-0.409480431324229,0.16226132038091
|
||||||
|
0.708000000000001,0.54502079525216,0.888538640823339,1.58583653706706,1.73353593239626,-1.47833609300219,-0.410609564734145,0.162770596266001
|
||||||
|
0.710000000000001,0.546325620947233,0.888240386150234,1.5856371618419,1.73359900751695,-1.47815928836615,-0.411737685828969,0.163280061286435
|
||||||
|
0.712000000000001,0.547632775372191,0.887942578582658,1.58543603812642,1.73365947744698,-1.47798331115705,-0.412864791012652,0.163789716587566
|
||||||
|
0.714000000000001,0.548942255854684,0.887645221067672,1.58523316481633,1.73371734210856,-1.47780816384249,-0.413990876687015,0.164299563320064
|
||||||
|
0.716000000000001,0.550254059705993,0.887348316562356,1.58502854082976,1.73377260142713,-1.47763384889577,-0.415115939251818,0.16480960263989
|
||||||
|
0.718000000000001,0.551568184221004,0.887051868033737,1.58482216510729,1.73382525533145,-1.47746036879584,-0.416239975104821,0.165319835708274
|
||||||
|
0.720000000000001,0.552884626678192,0.886755878458723,1.5846140366121,1.73387530375352,-1.47728772602725,-0.417362980641844,0.165830263691691
|
||||||
|
0.722000000000001,0.554203384339596,0.886460350824033,1.58440415432997,1.73392274662865,-1.47711592308013,-0.418484952256834,0.166340887761837
|
||||||
|
0.724000000000001,0.555524454450804,0.886165288126131,1.58419251726939,1.73396758389542,-1.47694496245012,-0.419605886341925,0.166851709095599
|
||||||
|
0.726000000000001,0.556847834240929,0.885870693371153,1.58397912446164,1.73400981549571,-1.47677484663834,-0.420725779287503,0.167362728875035
|
||||||
|
0.728000000000001,0.558173520922593,0.885576569574838,1.58376397496086,1.73404944137472,-1.47660557815134,-0.421844627482264,0.16787394828734
|
||||||
|
0.730000000000001,0.559501511691904,0.885282919762457,1.58354706784411,1.73408646148093,-1.47643715950105,-0.422962427313284,0.168385368524824
|
||||||
|
0.732000000000001,0.560831803728442,0.88498974696874,1.58332840221145,1.73412087576615,-1.47626959320474,-0.424079175166072,0.168896990784883
|
||||||
|
0.734000000000001,0.562164394195236,0.884697054237806,1.58310797718603,1.73415268418549,-1.47610288178497,-0.42519486742464,0.169408816269966
|
||||||
|
0.736000000000001,0.563499280238748,0.884404844623089,1.58288579191413,1.73418188669737,-1.47593702776951,-0.426309500471559,0.169920846187549
|
||||||
|
0.738000000000001,0.564836458988852,0.884113121187264,1.58266184556526,1.73420848326357,-1.47577203369137,-0.427423070688025,0.170433081750106
|
||||||
|
0.740000000000001,0.566175927558821,0.883821887002171,1.5824361373322,1.73423247384916,-1.47560790208866,-0.42853557445392,0.170945524175074
|
||||||
|
0.742000000000001,0.567517683045306,0.883531145148745,1.58220866643111,1.73425385842254,-1.47544463550459,-0.429647008147871,0.171458174684822
|
||||||
|
0.744000000000001,0.56886172252832,0.883240898716936,1.58197943210157,1.73427263695546,-1.47528223648741,-0.430757368147312,0.171971034506622
|
||||||
|
0.746000000000001,0.570208043071218,0.882951150805634,1.58174843360665,1.73428880942298,-1.47512070759036,-0.431866650828549,0.172484104872614
|
||||||
|
0.748000000000001,0.571556641720685,0.882661904522594,1.58151567023301,1.73430237580353,-1.47496005137162,-0.432974852566815,0.172997387019772
|
||||||
|
0.750000000000001,0.572907515506717,0.882373162984358,1.58128114129091,1.73431333607884,-1.47480027039421,-0.434081969736338,0.173510882189869
|
||||||
|
0.752000000000001,0.574260661442607,0.882084929316175,1.58104484611434,1.734321690234,-1.47464136722603,-0.435187998710394,0.174024591629444
|
||||||
|
0.754000000000001,0.575616076524924,0.881797206651926,1.58080678406105,1.73432743825743,-1.47448334443972,-0.436292935861373,0.174538516589767
|
||||||
|
0.756000000000001,0.576973757733505,0.881509998134041,1.58056695451263,1.73433058014092,-1.47432620461263,-0.437396777560839,0.175052658326798
|
||||||
|
0.758000000000001,0.578333702031433,0.881223306913424,1.58032535687455,1.73433111587956,-1.4741699503268,-0.438499520179586,0.175567018101155
|
||||||
|
0.760000000000001,0.579695906365026,0.880937136149367,1.58008199057628,1.73432904547181,-1.47401458416884,-0.439601160087703,0.176081597178075
|
||||||
|
0.762000000000001,0.581060367663824,0.880651489009475,1.57983685507131,1.73432436891946,-1.47386010872993,-0.440701693654633,0.176596396827374
|
||||||
|
0.764000000000001,0.582427082840568,0.88036636866958,1.5795899498372,1.73431708622767,-1.47370652660573,-0.441801117249229,0.177111418323409
|
||||||
|
0.766000000000001,0.583796048791196,0.880081778313663,1.5793412743757,1.73430719740491,-1.47355384039632,-0.442899427239818,0.177626662945039
|
||||||
|
0.768000000000001,0.585167262394818,0.879797721133767,1.57909082821277,1.73429470246301,-1.47340205270617,-0.443996619994258,0.178142131975585
|
||||||
|
0.770000000000001,0.586540720513715,0.879514200329917,1.57883861089866,1.73427960141713,-1.47325116614405,-0.445092691879997,0.178657826702786
|
||||||
|
0.772000000000001,0.587916419993315,0.879231219110036,1.57858462200795,1.73426189428578,-1.47310118332296,-0.446187639264133,0.179173748418762
|
||||||
|
0.774000000000001,0.589294357662189,0.878948780689859,1.57832886113965,1.73424158109082,-1.47295210686012,-0.447281458513473,0.179689898419965
|
||||||
|
0.776000000000001,0.590674530332033,0.878666888292853,1.57807132791721,1.73421866185741,-1.47280393937686,-0.44837414599459,0.180206278007144
|
||||||
|
0.778000000000001,0.592056934797661,0.878385545150123,1.57781202198864,1.73419313661408,-1.47265668349856,-0.449465698073883,0.180722888485294
|
||||||
|
0.780000000000001,0.593441567836988,0.878104754500334,1.5775509430265,1.73416500539268,-1.47251034185463,-0.450556111117633,0.181239731163617
|
||||||
|
0.782000000000001,0.594828426211026,0.877824519589624,1.57728809072802,1.73413426822839,-1.47236491707839,-0.451645381492064,0.181756807355473
|
||||||
|
0.784000000000001,0.596217506663866,0.87754484367151,1.57702346481513,1.7341009251597,-1.47222041180703,-0.452733505563398,0.182274118378338
|
||||||
|
0.786000000000001,0.597608805922672,0.87726573000681,1.57675706503451,1.73406497622846,-1.47207682868156,-0.453820479697916,0.182791665553752
|
||||||
|
0.788000000000001,0.599002320697671,0.876987181863549,1.57648889115765,1.73402642147981,-1.47193417034672,-0.45490630026201,0.183309450207279
|
||||||
|
0.790000000000001,0.600398047682141,0.876709202516871,1.57621894298094,1.73398526096222,-1.47179243945091,-0.455990963622245,0.183827473668453
|
||||||
|
0.792000000000001,0.601795983552404,0.876431795248953,1.57594722032567,1.73394149472746,-1.47165163864617,-0.457074466145414,0.184345737270735
|
||||||
|
0.794000000000001,0.603196124967817,0.876154963348912,1.57567372303813,1.73389512283062,-1.47151177058802,-0.458156804198595,0.184864242351456
|
||||||
|
0.796000000000001,0.604598468570761,0.875878710112718,1.57539845098963,1.73384614533009,-1.4713728379355,-0.459237974149207,0.185382990251778
|
||||||
|
0.798000000000001,0.606003010986638,0.875603038843101,1.57512140407657,1.73379456228755,-1.471234843351,-0.460317972365066,0.185901982316635
|
||||||
|
0.800000000000001,0.607409748823857,0.875327952849463,1.57484258222051,1.73374037376799,-1.47109778950029,-0.461396795214443,0.186421219894683
|
||||||
|
0.802000000000001,0.608818678673833,0.875053455447783,1.57456198536819,1.73368357983966,-1.47096167905234,-0.462474439066119,0.186940704338253
|
||||||
|
0.804000000000001,0.610229797110975,0.874779549960529,1.57427961349158,1.73362418057413,-1.47082651467933,-0.463550900289437,0.187460437003294
|
||||||
|
0.806000000000001,0.611643100692684,0.874506239716561,1.57399546658798,1.73356217604621,-1.47069229905656,-0.464626175254363,0.187980419249321
|
||||||
|
0.808000000000001,0.613058585959342,0.874233528051042,1.57370954468001,1.73349756633399,-1.47055903486235,-0.465700260331539,0.188500652439361
|
||||||
|
0.810000000000001,0.614476249434314,0.873961418305345,1.57342184781567,1.73343035151884,-1.47042672477799,-0.466773151892335,0.189021137939902
|
||||||
|
0.812000000000001,0.615896087623933,0.873689913826956,1.57313237606844,1.73336053168536,-1.47029537148767,-0.467844846308908,0.189541877120831
|
||||||
|
0.814000000000001,0.617318097017503,0.873419017969381,1.57284112953726,1.73328810692141,-1.47016497767838,-0.468915339954255,0.190062871355384
|
||||||
|
0.816000000000001,0.618742274087295,0.873148734092055,1.57254810834662,1.73321307731809,-1.47003554603984,-0.469984629202264,0.190584122020088
|
||||||
|
0.818000000000001,0.620168615288535,0.872879065560241,1.57225331264657,1.73313544296973,-1.46990707926447,-0.471052710427774,0.191105630494703
|
||||||
|
0.820000000000001,0.62159711705941,0.872610015744938,1.57195674261282,1.7330552039739,-1.46977958004723,-0.472119580006623,0.191627398162166
|
||||||
|
0.822000000000001,0.623027775821061,0.872341588022787,1.57165839844673,1.73297236043136,-1.46965305108561,-0.473185234315705,0.192149426408529
|
||||||
|
0.824000000000001,0.624460587977579,0.872073785775971,1.57135828037537,1.7328869124461,-1.46952749507954,-0.47424966973302,0.192671716622905
|
||||||
|
0.826000000000001,0.625895549916005,0.871806612392117,1.5710563886516,1.7327988601253,-1.46940291473127,-0.475312882637732,0.193194270197405
|
||||||
|
0.828000000000001,0.627332658006332,0.871540071264207,1.57075272355404,1.73270820357932,-1.46927931274535,-0.476374869410216,0.193717088527078
|
||||||
|
0.830000000000001,0.628771908601495,0.871274165790472,1.57044728538719,1.73261494292173,-1.46915669182849,-0.477435626432114,0.19424017300985
|
||||||
|
0.832000000000001,0.630213298037378,0.871008899374296,1.57014007448141,1.73251907826924,-1.46903505468952,-0.478495150086386,0.194763525046463
|
||||||
|
0.834000000000001,0.631656822632812,0.870744275424124,1.56983109119298,1.73242060974174,-1.4689144040393,-0.479553436757363,0.195287146040414
|
||||||
|
0.836000000000001,0.633102478689575,0.870480297353353,1.56952033590416,1.73231953746225,-1.46879474259064,-0.480610482830795,0.195811037397887
|
||||||
|
0.838000000000001,0.634550262492392,0.870216968580243,1.56920780902321,1.73221586155694,-1.46867607305818,-0.48166628469391,0.196335200527698
|
||||||
|
0.840000000000001,0.636000170308938,0.869954292527811,1.56889351098442,1.73210958215513,-1.46855839815836,-0.482720838735454,0.196859636841221
|
||||||
|
0.842000000000001,0.637452198389838,0.869692272623734,1.56857744224815,1.73200069938921,-1.46844172060932,-0.483774141345754,0.197384347752331
|
||||||
|
0.844000000000001,0.638906342968672,0.869430912300249,1.56825960330088,1.73188921339473,-1.46832604313078,-0.484826188916759,0.197909334677334
|
||||||
|
0.846000000000001,0.640362600261975,0.869170214994053,1.56793999465524,1.73177512431028,-1.468211368444,-0.485876977842096,0.198434599034903
|
||||||
|
0.848000000000001,0.641820966469242,0.868910184146201,1.56761861685004,1.73165843227758,-1.46809769927166,-0.486926504517117,0.19896014224601
|
||||||
|
0.850000000000001,0.643281437772933,0.868650823202005,1.56729547045029,1.73153913744139,-1.4679850383378,-0.487974765338951,0.19948596573386
|
||||||
|
0.852000000000001,0.644744010338476,0.868392135610934,1.56697055604728,1.73141723994954,-1.46787338836771,-0.48902175670655,0.200012070923822
|
||||||
|
0.854000000000001,0.64620868031427,0.868134124826513,1.56664387425853,1.73129273995289,-1.46776275208785,-0.490067475020745,0.200538459243361
|
||||||
|
0.856000000000001,0.647675443831696,0.867876794306219,1.56631542572793,1.73116563760535,-1.46765313222577,-0.491111916684285,0.201065132121969
|
||||||
|
0.858000000000001,0.649144297005118,0.867620147511379,1.56598521112567,1.73103593306384,-1.46754453151001,-0.492155078101897,0.201592090991095
|
||||||
|
0.860000000000001,0.65061523593189,0.867364187907071,1.56565323114831,1.73090362648827,-1.46743695267,-0.493196955680325,0.202119337284073
|
||||||
|
0.862000000000001,0.652088256692368,0.867108918962015,1.56531948651884,1.73076871804157,-1.46733039843599,-0.494237545828382,0.202646872436052
|
||||||
|
0.864000000000001,0.653563355349911,0.866854344148476,1.56498397798665,1.73063120788962,-1.46722487153896,-0.495276844957,0.203174697883929
|
||||||
|
0.866000000000001,0.655040527950894,0.866600466942159,1.5646467063276,1.73049109620127,-1.46712037471049,-0.496314849479273,0.203702815066266
|
||||||
|
0.868000000000001,0.656519770524717,0.866347290822102,1.56430767234401,1.73034838314831,-1.46701691068271,-0.497351555810508,0.20423122542323
|
||||||
|
0.870000000000001,0.658001079083809,0.866094819270579,1.56396687686473,1.73020306890547,-1.46691448218819,-0.498386960368268,0.20475993039651
|
||||||
|
0.872000000000001,0.659484449623645,0.865843055772988,1.56362432074513,1.73005515365041,-1.46681309195986,-0.499421059572424,0.205288931429246
|
||||||
|
0.874000000000001,0.660969878122753,0.865592003817755,1.56328000486712,1.72990463756365,-1.46671274273087,-0.500453849845198,0.205818229965956
|
||||||
|
0.876000000000001,0.662457360542723,0.865341666896222,1.56293393013922,1.72975152082862,-1.46661343723456,-0.501485327611209,0.20634782745246
|
||||||
|
0.878000000000001,0.663946892828224,0.865092048502547,1.5625860974965,1.72959580363163,-1.4665151782043,-0.502515489297519,0.206877725335803
|
||||||
|
0.880000000000001,0.665438470907013,0.864843152133601,1.56223650790071,1.72943748616182,-1.46641796837345,-0.50354433133368,0.207407925064179
|
||||||
|
0.882000000000001,0.666932090689948,0.864594981288854,1.56188516234017,1.72927656861116,-1.46632181047522,-0.504571850151778,0.207938428086857
|
||||||
|
0.884000000000001,0.668427748071,0.864347539470282,1.56153206182992,1.72911305117447,-1.46622670724262,-0.50559804218648,0.208469235854099
|
||||||
|
0.886000000000001,0.669925438927274,0.864100830182251,1.56117720741164,1.72894693404934,-1.46613266140828,-0.506622903875073,0.209000349817084
|
||||||
|
0.888000000000001,0.671425159119014,0.863854856931418,1.56082060015371,1.72877821743615,-1.46603967570445,-0.507646431657516,0.209531771427833
|
||||||
|
0.890000000000001,0.672926904489625,0.863609623226621,1.56046224115124,1.72860690153805,-1.46594775286284,-0.508668621976478,0.210063502139123
|
||||||
|
0.892000000000001,0.674430670865689,0.863365132578778,1.56010213152603,1.72843298656094,-1.46585689561452,-0.509689471277386,0.210595543404412
|
||||||
|
0.894000000000001,0.675936454056978,0.863121388500776,1.55974027242666,1.72825647271344,-1.46576710668985,-0.510708976008465,0.211127896677758
|
||||||
|
0.896000000000001,0.677444249856473,0.862878394507367,1.55937666502844,1.72807736020688,-1.46567838881836,-0.511727132620783,0.21166056341374
|
||||||
|
0.898000000000001,0.678954054040382,0.862636154115063,1.55901131053346,1.7278956492553,-1.46559074472864,-0.512743937568295,0.212193545067371
|
||||||
|
0.900000000000001,0.68046586236816,0.862394670842026,1.55864421017057,1.72771134007538,-1.46550417714826,-0.513759387307882,0.212726843094021
|
||||||
|
0.902000000000001,0.681979670582525,0.862153948207967,1.55827536519544,1.72752443288647,-1.46541868880367,-0.514773478299397,0.213260458949336
|
||||||
|
0.904000000000001,0.68349547440948,0.861913989734032,1.55790477689051,1.72733492791056,-1.46533428242004,-0.515786207005705,0.213794394089151
|
||||||
|
0.906000000000001,0.685013269558333,0.861674798942701,1.55753244656506,1.72714282537223,-1.46525096072125,-0.516797569892724,0.214328649969407
|
||||||
|
0.908000000000001,0.686533051721719,0.861436379357682,1.55715837555517,1.72694812549868,-1.4651687264297,-0.51780756342947,0.21486322804607
|
||||||
|
0.910000000000001,0.68805481657562,0.861198734503797,1.55678256522375,1.72675082851966,-1.46508758226627,-0.518816184088091,0.215398129775046
|
||||||
|
0.912000000000001,0.689578559779388,0.860961867906883,1.55640501696055,1.72655093466749,-1.46500753095015,-0.519823428343917,0.215933356612093
|
||||||
|
0.914000000000001,0.691104276975769,0.86072578309368,1.55602573218213,1.72634844417699,-1.4649285751988,-0.520829292675493,0.216468910012739
|
||||||
|
0.916000000000001,0.692631963790926,0.860490483591726,1.55564471233194,1.72614335728551,-1.46485071772781,-0.521833773564622,0.217004791432196
|
||||||
|
0.918000000000001,0.694161615834466,0.860255972929249,1.55526195888024,1.7259356742329,-1.46477396125078,-0.522836867496405,0.217541002325271
|
||||||
|
0.920000000000001,0.695693228699459,0.86002225463506,1.55487747332414,1.72572539526144,-1.46469830847925,-0.523838570959278,0.218077544146281
|
||||||
|
0.922000000000001,0.697226797962472,0.859789332238447,1.55449125718762,1.72551252061588,-1.46462376212257,-0.524838880445057,0.218614418348965
|
||||||
|
0.924000000000001,0.698762319183589,0.859557209269066,1.5541033120215,1.72529705054338,-1.46455032488778,-0.525837792448971,0.219151626386398
|
||||||
|
0.926000000000001,0.70029978790644,0.859325889256835,1.55371363940345,1.72507898529349,-1.46447799947954,-0.526835303469702,0.219689169710901
|
||||||
|
0.928000000000001,0.701839199658234,0.859095375731825,1.553322240938,1.72485832511816,-1.46440678859996,-0.527831410009425,0.220227049773952
|
||||||
|
0.930000000000001,0.703380549949778,0.858865672224156,1.55292911825653,1.72463507027167,-1.46433669494857,-0.528826108573845,0.220765268026098
|
||||||
|
0.932000000000001,0.704923834275515,0.858636782263888,1.55253427301724,1.72440922101062,-1.46426772122215,-0.529819395672234,0.221303825916866
|
||||||
|
0.934000000000001,0.706469048113551,0.858408709380912,1.5521377069052,1.72418077759394,-1.46419987011463,-0.53081126781747,0.221842724894669
|
||||||
|
0.936000000000001,0.708016186925684,0.858181457104846,1.5517394216323,1.72394974028283,-1.464133144317,-0.531801721526072,0.222381966406721
|
||||||
|
0.938000000000001,0.709565246157439,0.857955028964927,1.55133941893729,1.72371610934073,-1.46406754651717,-0.532790753318239,0.222921551898944
|
||||||
|
0.940000000000001,0.711116221238098,0.857729428489903,1.55093770058571,1.72347988503334,-1.4640030793999,-0.533778359717884,0.223461482815873
|
||||||
|
0.942000000000001,0.712669107580733,0.857504659207926,1.55053426836993,1.72324106762854,-1.46393974564663,-0.534764537252671,0.224001760600571
|
||||||
|
0.944000000000001,0.714223900582241,0.857280724646449,1.55012912410912,1.72299965739641,-1.46387754793543,-0.535749282454052,0.224542386694531
|
||||||
|
0.946000000000001,0.715780595623377,0.857057628332111,1.54972226964928,1.72275565460918,-1.46381648894084,-0.536732591857301,0.225083362537588
|
||||||
|
0.948000000000001,0.717339188068792,0.85683537379064,1.54931370686316,1.72250905954121,-1.46375657133378,-0.53771446200155,0.22562468956782
|
||||||
|
0.950000000000001,0.718899673267065,0.85661396454674,1.54890343765031,1.72225987246896,-1.46369779778142,-0.538694889429823,0.226166369221463
|
||||||
|
0.952000000000001,0.720462046550743,0.856393404123984,1.54849146393702,1.72200809367097,-1.46364017094711,-0.539673870689072,0.226708402932809
|
||||||
|
0.954000000000001,0.722026303236377,0.856173696044713,1.54807778767637,1.72175372342785,-1.4635836934902,-0.540651402330209,0.227250792134119
|
||||||
|
0.956000000000001,0.72359243862456,0.855954843829926,1.54766241084813,1.72149676202222,-1.46352836806596,-0.541627480908142,0.227793538255521
|
||||||
|
0.958000000000001,0.725160447999967,0.855736850999173,1.54724533545882,1.72123720973869,-1.46347419732549,-0.542602102981809,0.228336642724924
|
||||||
|
0.960000000000001,0.726730326631394,0.855519721070452,1.54682656354166,1.72097506686386,-1.46342118391554,-0.543575265114208,0.228880106967914
|
||||||
|
0.962000000000001,0.7283020697718,0.8553034575601,1.54640609715655,1.72071033368628,-1.46336933047848,-0.544546963872433,0.229423932407666
|
||||||
|
0.964000000000001,0.729875672658345,0.855088063982692,1.54598393839006,1.72044301049639,-1.46331863965209,-0.545517195827706,0.229968120464842
|
||||||
|
0.966000000000001,0.731451130512437,0.85487354385093,1.54556008935541,1.72017309758653,-1.46326911406952,-0.546485957555409,0.230512672557499
|
||||||
|
0.968000000000001,0.733028438539769,0.854659900675541,1.54513455219245,1.71990059525092,-1.46322075635914,-0.547453245635117,0.23105759010099
|
||||||
|
0.970000000000001,0.734607591930368,0.854447137965172,1.54470732906763,1.7196255037856,-1.46317356914442,-0.548419056650628,0.231602874507869
|
||||||
|
0.972000000000001,0.736188585858637,0.854235259226282,1.544278422174,1.71934782348839,-1.46312755504384,-0.549383387189995,0.232148527187791
|
||||||
|
0.974000000000001,0.7377714154834,0.854024267963042,1.54384783373116,1.71906755465893,-1.46308271667073,-0.550346233845558,0.23269454954742
|
||||||
|
0.976000000000001,0.739356075947947,0.853814167677228,1.54341556598525,1.71878469759857,-1.46303905663319,-0.551307593213976,0.233240942990322
|
||||||
|
0.978000000000001,0.740942562380084,0.853604961868114,1.54298162120891,1.71849925261039,-1.46299657753396,-0.552267461896253,0.233787708916878
|
||||||
|
0.980000000000001,0.74253086989218,0.853396654032375,1.5425460017013,1.71821121999916,-1.46295528197029,-0.553225836497772,0.234334848724176
|
||||||
|
0.982000000000001,0.744120993581211,0.853189247663977,1.542108709788,1.7179206000713,-1.46291517253385,-0.554182713628324,0.234882363805919
|
||||||
|
0.984000000000001,0.745712928528814,0.852982746254073,1.54166974782104,1.71762739313486,-1.46287625181059,-0.555138089902139,0.235430255552321
|
||||||
|
0.986000000000001,0.747306669801336,0.852777153290908,1.54122911817886,1.71733159949949,-1.4628385223806,-0.556091961937912,0.235978525350012
|
||||||
|
0.988000000000001,0.748902212449883,0.852572472259706,1.54078682326625,1.7170332194764,-1.46280198681805,-0.557044326358833,0.236527174581937
|
||||||
|
0.990000000000001,0.750499551510374,0.852368706642572,1.54034286551436,1.71673225337834,-1.46276664769103,-0.557995179792617,0.237076204627253
|
||||||
|
0.992000000000001,0.752098682003593,0.852165859918391,1.53989724738063,1.71642870151956,-1.46273250756142,-0.558944518871534,0.237625616861236
|
||||||
|
0.994000000000001,0.753699598935238,0.851963935562724,1.53944997134879,1.71612256421578,-1.46269956898482,-0.55989234023243,0.238175412655175
|
||||||
|
0.996000000000001,0.755302297295983,0.851762937047704,1.53900103992882,1.71581384178417,-1.46266783451038,-0.560838640516764,0.238725593376274
|
||||||
|
0.998000000000001,0.756906772061525,0.85156286784194,1.53855045565687,1.7155025345433,-1.4626373066807,-0.561783416370628,0.239276160387549
|
||||||
|
1,0.758513018192645,0.85136373141041,1.5380982210953,1.71518864281313,-1.46260798803172,-0.562726664444779,0.239827115047732
|
||||||
|
1.002,0.760121030635263,0.851165531214365,1.53764433883257,1.71487216691494,-1.46257988109258,-0.56366838139466,0.240378458711165
|
||||||
|
1.004,0.76172919481938,0.850968474709213,1.53718927241537,1.71455342542013,-1.46255302535324,-0.56460762397024,0.240929648748077
|
||||||
|
1.006,0.763334277846886,0.850772968998806,1.53673395490576,1.71423306805792,-1.46252749178502,-0.565542516737705,0.241479597042579
|
||||||
|
1.008,0.764933032822655,0.850579414161899,1.53627933296572,1.71391176514017,-1.46250334251824,-0.566471196624796,0.242027213011431
|
||||||
|
1.01,0.766522199073563,0.850388203246982,1.53582636669269,1.71359020737919,-1.46248063087678,-0.567391812881454,0.242571403604126
|
||||||
|
1.012,0.768098502436208,0.850199722302999,1.53537602938591,1.71326910560232,-1.4624594014561,-0.568302526976553,0.243111073314558
|
||||||
|
1.014,0.769658655611943,0.850014350446767,1.53492930724412,1.71294919036331,-1.46243969024533,-0.569201512429837,0.243645124204465
|
||||||
|
1.016,0.771199358587896,0.849832459967934,1.53448719899545,1.71263121145076,-1.46242152479363,-0.570086954578155,0.244172455938864
|
||||||
|
1.018,0.772717299122628,0.849654416472253,1.53405071545996,1.71231593729341,-1.46240492442135,-0.570957050275173,0.24469196583363
|
||||||
|
1.02,0.774209153295166,0.849480579063933,1.53362087904565,1.71200415426268,-1.46238990047625,-0.571810007523754,0.245202548915392
|
||||||
|
1.022,0.775671586116195,0.849311300567766,1.53319872317847,1.71169666587236,-1.46237645663525,-0.572644045040266,0.245703097993917
|
||||||
|
1.024,0.777101252200228,0.849146927791694,1.53278529166706,1.71139429187555,-1.46236458925177,-0.573457391750115,0.246192503747102
|
||||||
|
1.026,0.778494796497713,0.848987801830413,1.53238163800274,1.711097867259,-1.46235428774923,-0.574248286213881,0.246669654818711
|
||||||
|
1.028,0.779848855086078,0.848834258410554,1.53198882459542,1.71080824113483,-1.46234553506075,-0.575014975983496,0.247133437928979
|
||||||
|
1.03,0.78116005601885,0.848686628277909,1.53160792194592,1.71052627552974,-1.4623383081153,-0.575755716887987,0.247582737998157
|
||||||
|
1.032,0.782425020232096,0.848545237627096,1.53124000775516,1.71025284407179,-1.46233257837058,-0.576468772248378,0.248016438283103
|
||||||
|
1.034,0.783640362507572,0.848410408573973,1.53088616597073,1.70998883057466,-1.46232831239258,-0.577152412021443,0.248433420526975
|
||||||
|
1.036,0.7848026924921,0.848282459671025,1.53054748577114,1.70973512751965,-1.46232547248219,-0.577804911872101,0.248832565122065
|
||||||
|
1.038,0.785908615772882,0.848161706465851,1.53022506048805,1.70949263443516,-1.46232401734862,-0.57842455217434,0.24921275128582
|
||||||
|
1.04,0.78695473500859,0.848048462102792,1.52991998646666,1.70926225617395,-1.4623239028299,-0.579009616940665,0.249572857250063
|
||||||
|
1.042,0.787937651116305,0.847943037967608,1.52963336186444,1.70904490108794,-1.46232508266035,-0.579558392680183,0.249911760463395
|
||||||
|
1.044,0.788853964514537,0.847845744375028,1.52936628538811,1.70884147910071,-1.46232750928497,-0.580069167185563,0.250228337806779
|
||||||
|
1.046,0.789700276422797,0.847756891298874,1.52911985496879,1.70865289967754,-1.4623311347206,-0.580540228249231,0.250521465822255
|
||||||
|
1.048,0.790474531515875,0.847676635331512,1.52889476407133,1.70847977114713,-1.46233589722404,-0.580970607186103,0.250790469763278
|
||||||
|
1.05,0.791179477875349,0.847604587113496,1.52869025955989,1.70832162230551,-1.4623416888769,-0.581361990782562,0.251036280427551
|
||||||
|
1.052,0.791818305861189,0.84754031645905,1.52850544503333,1.7081778637077,-1.46234840719383,-0.58171628864015,0.251259974198561
|
||||||
|
1.054,0.792394220156922,0.847483400874214,1.52833940991484,1.70804788416909,-1.4623559591194,-0.582035396968814,0.251462630091183
|
||||||
|
1.056,0.792910438356313,0.847433424873286,1.52819123084624,1.70793105283471,-1.46236426018755,-0.58232119983247,0.251645329536891
|
||||||
|
1.058,0.79337018963127,0.847389979322948,1.52805997300734,1.70782672114435,-1.46237323371983,-0.582575570339205,0.25180915617816
|
||||||
|
1.06,0.793776713478906,0.847352660815312,1.52794469136149,1.7077342246939,-1.46238281006298,-0.582800371774751,0.251955195672332
|
||||||
|
1.062,0.794133258545905,0.847321071071069,1.52784443182793,1.70765288499264,-1.46239292586635,-0.582997458678001,0.252084535505199
|
||||||
|
1.064,0.7944430815285,0.847294816373726,1.52775823238202,1.7075820111171,-1.46240352339968,-0.583168677857466,0.252198264814529
|
||||||
|
1.066,0.794709446146578,0.847273507035861,1.52768512408382,1.7075209012611,-1.46241454991172,-0.583315869347713,0.252297474223733
|
||||||
|
1.068,0.794935621134677,0.847256582178173,1.52762398533234,1.70746886022957,-1.46242568999227,-0.583440857634691,0.252383050855421
|
||||||
|
1.07,0.795124876564734,0.847242800968848,1.52757311565017,1.70742524724721,-1.46243558784952,-0.583545424258445,0.252455082111308
|
||||||
|
1.072,0.79528048963571,0.847231324436233,1.52753114513836,1.70738937777344,-1.4624435007616,-0.583631368484945,0.252514124239224
|
||||||
|
1.074,0.795405743378718,0.847221698745122,1.52749702203415,1.70736052646407,-1.46244927420063,-0.583700507250131,0.25256118338822
|
||||||
|
1.076,0.795503924901395,0.847213705083353,1.5274698878575,1.70733794208708,-1.46245311274696,-0.583754667567952,0.252597540065297
|
||||||
|
1.078,0.795578324099649,0.847207244726261,1.5274489817838,1.707320858976,-1.46245540452512,-0.583795680766422,0.252624614669369
|
||||||
|
1.08,0.795632232709233,0.847202255186311,1.52743357092267,1.70730850546845,-1.46245659303338,-0.58382537835427,0.252643869376861
|
||||||
|
1.082,0.795668943607795,0.847198653344747,1.52742290313086,1.70730010975261,-1.46245709017542,-0.583845589308781,0.252656741614279
|
||||||
|
1.084,0.795691750307612,0.847196301672216,1.52741617913159,1.70729490350484,-1.46245722458809,-0.583858138579516,0.252664604579035
|
||||||
|
1.086,0.79570394660047,0.847194993819697,1.52741254083593,1.70729212367106,-1.4624572196004,-0.583864846606945,0.25266875045968
|
||||||
|
1.088,0.79570882633024,0.84719445593062,1.52741107280446,1.70729101272849,-1.4624571952486,-0.583867529655005,0.252670392078664
|
||||||
|
1.09,0.795709683276719,0.847194360012352,1.52741081376797,1.70729081775968,-1.4624571887431,-0.583868000753386,0.252670678660393
|
||||||
|
|||||||
|
@ -1,169 +1,547 @@
|
|||||||
t,px,py,pz,vx,vy,vz,ax,ay,az,speed,acc
|
t,px,py,pz,vx,vy,vz,ax,ay,az,speed,acc
|
||||||
0,0.559809314390095,-0.292914056655931,0.00429163619695835,0,0,0,0.0499999733977186,5.51156342787351e-08,4.43482056633471e-08,0,0.0499999733977686
|
0,0.559809314390095,-0.292914056655931,0.00429163619695835,0,0,0,-2.63539190470397e-08,1.86795023893183e-08,0.0499999791552658,0,0.0499999791552762
|
||||||
0.002,0.559809314390095,-0.292914056655931,0.00429163619695835,9.99999467954371e-05,1.1023126855747e-10,8.86964113266941e-11,0.124999924931701,4.50216253167213e-07,3.45509211518991e-07,9.99999467955372e-05,0.12499992493299
|
0.002,0.559809314390095,-0.292914056655931,0.00429163619695835,-5.27078380940793e-11,3.73590047786365e-11,9.99999583105315e-05,-2.55427623496729e-07,1.76723219391661e-07,0.124999884896886,9.99999583105524e-05,0.124999884897271
|
||||||
0.004,0.559809714389882,-0.29291405665549,0.00429163619731314,0.000499999699726805,1.80086501266885e-09,1.38203684607596e-09,0.299999780524474,2.51783663363092e-06,1.90865379057215e-06,0.000499999699731958,0.299999780541111
|
0.004,0.559809314389884,-0.292914056655782,0.0042920361967916,-1.02171049398692e-09,7.06892877566645e-10,0.000499999539587542,-1.48488860096663e-06,1.02245295563463e-06,0.299999433996979,0.000499999539589086,0.299999434002397
|
||||||
0.006,0.559811314388894,-0.292914056648728,0.0042916362024865,0.00129999906889333,1.01815778030812e-08,7.72331157361528e-09,0.49999952015517,8.36266125792129e-06,6.30987709998587e-06,0.00129999906895614,0.499999520264919
|
0.006,0.559809314386008,-0.292914056653104,0.0042936361951167,-5.99226224196059e-09,4.12717082731717e-09,0.00129999769429845,-5.00186697616201e-06,3.43832948224154e-06,0.499998216783697,0.00129999769431881,0.499998216820538
|
||||||
0.008,0.559814914386157,-0.292914056614764,0.00429163622820639,0.00249999778034748,3.5251510044354e-08,2.66215452460195e-08,0.699999088221714,2.04570457795761e-05,1.54041571165386e-05,0.00249999778073776,0.699999088690129
|
0.008,0.559809314365915,-0.292914056639273,0.00429723618756879,-2.10291783986349e-08,1.44602108065328e-08,0.00249999240672233,-1.23088275683081e-05,8.45479589117737e-06,0.699995739690193,0.00249999240685259,0.699995739849473
|
||||||
0.01,0.559821314380015,-0.292914056507722,0.00429163630897268,0.00409999542178019,9.20097609213855e-08,6.93399400397698e-08,0.899998415099246,4.13012367361798e-05,3.10682677501228e-05,0.00409999542339895,0.899998416583154
|
0.01,0.559809314301891,-0.292914056595263,0.00430363616474359,-5.52275725151929e-08,3.79463543920266e-08,0.00409998065305922,-2.49193027324068e-05,1.71093902934238e-05,0.899991498596285,0.00409998065360679,0.899991499103903
|
||||||
0.012,0.559831314367845,-0.292914056246725,0.00429163650556615,0.00609999144074447,2.00456456989073e-07,1.50894616246511e-07,1.09999742960165,7.33957374043914e-05,5.51777738083681e-05,0.00609999144590447,1.09999743343417
|
0.012,0.559809314145005,-0.292914056487488,0.00431363611018103,-1.20706389328262e-07,8.28977719802282e-08,0.00609995840110747,-4.4341134930459e-05,3.04341309098621e-05,1.0999849891823,0.00609995840286503,1.09998499049703
|
||||||
0.014,0.559845714345778,-0.292914055705896,0.00429163691255115,0.00849998514018679,3.85592710538951e-07,2.90051035273242e-07,1.2999960579893,0.000119240478602123,8.96055313281962e-05,0.0084999851538816,1.29999606654604
|
0.014,0.559809313819066,-0.292914056263672,0.00432803599834802,-2.32592112237029e-07,1.59682878031475e-07,0.00849992060978841,-7.20702525436323e-05,4.94503847592309e-05,1.29997570688222,0.00849992061447067,1.29997570982053
|
||||||
0.016,0.559865314308405,-0.292914054704354,0.00429163766577029,0.0112999756727017,6.77418371397564e-07,5.09316741559296e-07,1.49999422298374,0.000181333153354002,0.000136219124521886,0.0112999757044849,1.4999942401296
|
0.016,0.559809313214636,-0.292914055848756,0.00434763579262018,-4.08987399502791e-07,2.80699311017152e-07,0.0112998612286363,-0.00010958457058452,7.51633512374726e-05,1.49996314679785,0.0112998612395242,1.4999631526841
|
||||||
0.018,0.559890914248469,-0.292914052996222,0.00429163894981811,0.0144999620321218,1.11092532395496e-06,8.34927533360785e-07,1.69999184224112,0.00026216611173635,0.000196876992139549,0.0144999620987171,1.69999187385645
|
0.018,0.559809312183116,-0.292914055140874,0.00437323544326257,-6.70930394575108e-07,4.60336282981366e-07,0.0144997731969798,-0.000158344372336305,0.000108560615358355,1.69994680364674,0.0144997732198097,1.69994681448777
|
||||||
0.02,0.559923314156534,-0.292914050260653,0.00429164100548042,0.0180999430416662,1.72608281834297e-06,1.29682471011749e-06,1.8999888267146,0.000364221840187806,0.000273423240645942,0.0180999431704267,1.89998888129856
|
0.02,0.559809310530915,-0.292914054007411,0.0044056348854081,-1.04236488884801e-06,7.14941772450572e-07,0.0180996484432233,-0.000219812813784248,0.000150624648170838,1.89992617181771,0.0180996484873586,1.89992619050408
|
||||||
0.022,0.559963314020635,-0.292914046091891,0.00429164413711695,0.0220999173389802,2.56781268470618e-06,1.92862049594455e-06,2.09998507891967,0.000489967604683227,0.000367681445186118,0.0220999175723123,2.09998516826742
|
0.022,0.559809308013656,-0.292914052281107,0.00444563403703546,-1.5501816497121e-06,1.06283487566472e-06,0.0220994778842506,-0.000295522363524813,0.000202376244234914,2.09990074540641,0.0220994779641774,2.099900775953
|
||||||
0.024,0.56001171382589,-0.292914039989402,0.0042916487199624,0.0264998833573449,3.68595323707588e-06,2.76755049086197e-06,2.29998049072754,0.000641850097377049,0.000481448277078743,0.0264998837582067,2.29998063067742
|
0.024,0.559809304330188,-0.292914049756072,0.0044940327969451,-2.22445434294727e-06,1.52444674939023e-06,0.0264992514248489,-0.000387126351808486,0.000264907408509262,2.29987001800109,0.0264992515620629,2.29987006583918
|
||||||
0.026,0.560069313554065,-0.292914031348078,0.00429165520731892,0.0312998393018904,5.13521307421438e-06,3.85441360425953e-06,2.49997494087411,0.000822292078178631,0.000616488269288006,0.0312998399604707,2.49997515212063
|
0.026,0.559809299115839,-0.29291404618332,0.00455163104273486,-3.09868705694605e-06,2.12246450970177e-06,0.031298957956255,-0.000496138317929162,0.000339199945909029,2.49983348153334,0.0312989581816094,2.49983355378012
|
||||||
0.028,0.560136913183097,-0.29291401944855,0.00429166413761682,0.0364997831208413,6.9751215497904e-06,5.23350356801399e-06,2.69996829273255,0.00103369430376476,0.000774532239559976,0.0364997841625171,2.69996860170359
|
0.028,0.55980929193544,-0.292914041266214,0.00461922862877012,-4.20900761466391e-06,2.88124653302635e-06,0.0364985853509823,-0.000623858811832355,0.000426072475911975,2.69979062634834,0.0364985857073979,2.69979073204868
|
||||||
0.03,0.560215312686548,-0.292914003447592,0.00429167614133319,0.0420997124728206,9.26999028927344e-06,6.95254256249944e-06,2.89996039135043,0.0012784471016547,0.000957282728780704,0.0420997140674938,2.89996083115247
|
0.03,0.559809282279809,-0.292914034658334,0.00469762538413879,-5.59412230427547e-06,3.82675441334967e-06,0.0420981204616484,-0.000771733545124052,0.000526422933022629,2.89974094256316,0.0420981210072577,2.89974109304104
|
||||||
0.032,0.560305312032989,-0.292913982368589,0.00429169194778707,0.048099624686243,1.20889099564092e-05,9.06263448313681e-06,3.09995106013982,0.00155895799394678,0.00116643122678034,0.0480996270591626,3.09995167158681
|
0.032,0.55980926955895,-0.292914025959196,0.00478762111061672,-7.29594179516013e-06,4.98693826511686e-06,0.048097549121235,-0.00094130906541645,0.000641194729256166,3.09968391953071,0.04809754993313,3.09968412877678
|
||||||
0.034,0.560407711185293,-0.292913955091952,0.00429171239187112,0.0544995167133799,1.55058222650606e-05,1.16182674696208e-05,3.29994009783812,0.00187770390208674,0.00140369367344906,0.0544995201575815,3.29994093059978
|
0.034,0.559809253096041,-0.292914014710581,0.00489001558062373,-9.35935856594127e-06,6.39153333037434e-06,0.0544968561397712,-0.00113406957436002,0.000771261061960348,3.2996190451268,0.0544968573182731,3.29961933015324
|
||||||
0.036,0.560523310099842,-0.2929139203453,0.00429173842085695,0.0612993850775955,1.95997255647562e-05,1.4677409176933e-05,3.49992727462916,0.00223731853876696,0.00167087221576017,0.0612993899681467,3.49992838856759
|
0.036,0.559809232121516,-0.292914000393063,0.0050056085351758,-1.18322200926002e-05,8.07198251295826e-06,0.0612960253017422,-0.00135149165469972,0.000917458508470358,3.4995458059097,0.0612960269752465,3.49954618713913
|
||||||
0.038,0.560652908725604,-0.29291387669305,0.00429177110150783,0.0684992258118965,2.44550964201284e-05,1.83017563326615e-05,3.69991232788274,0.00264072870168052,0.00196995390139287,0.0684992326222361,3.69991379469646
|
0.038,0.559809205767161,-0.292913982422651,0.0051351996818307,-1.47653251847401e-05,1.00613673642558e-05,0.0684950393634101,-0.00159505035568497,0.00108058697059765,3.69946368715748,0.0684950416938411,3.69946418883203
|
||||||
0.04,0.56079730700309,-0.292913822524914,0.00429181162788228,0.0760990343891265,3.01626403714783e-05,2.25572247825045e-05,3.89989495749864,0.00309135651105352,0.0023032591398367,0.0760990437099621,3.89989686286844
|
0.04,0.559809173060215,-0.292913960147593,0.00527958869262944,-1.82124215153401e-05,1.23943303953489e-05,0.0760938800503721,-0.00186621951225873,0.00126140530312679,3.89937217291219,0.0760938832392732,3.89937282351926
|
||||||
0.042,0.56095730486316,-0.292913756042488,0.00429186133040696,0.0840988056418911,3.68205224643425e-05,2.75147928920083e-05,4.09987482032081,0.00359332217453322,0.00267359079580281,0.0840988182033926,4.09987726674257
|
0.042,0.559809132917475,-0.29291393284533,0.00543957520203218,-2.22302032337751e-05,1.51069885767629e-05,0.0840925280550588,-0.00216647180056872,0.00146062667516489,4.09927074607359,0.0840925323503454,4.09927157878629
|
||||||
0.044,0.561133702225657,-0.292913675242824,0.00429192168705385,0.0924985336704097,4.45359290696112e-05,3.32515879657158e-05,4.29985152399642,0.00414943474719153,0.00308271395389747,0.0924985503686031,4.29985463118794
|
0.044,0.559809084139403,-0.292913899719639,0.00561595880484968,-2.6878308717615e-05,1.82368370960084e-05,0.0924909630346664,-0.00248362769933452,0.00166967401363238,4.27872692292541,0.0924909687380651,4.27872796952373
|
||||||
0.046,0.561327298997842,-0.292913577898772,0.00429199433675882,0.101298211737877,5.34182614531086e-05,3.98456487075982e-05,4.49982462345094,0.00476023793993806,0.00353062841896428,0.101298233659221,4.4998285264016
|
0.046,0.55980902540424,-0.292913859897981,0.00580953905417085,-3.21647140311132e-05,2.17856846312925e-05,0.10120743574676,-0.00274913172781943,0.00184189907423415,4.34426804258366,0.101207443202659,4.34426930290136
|
||||||
0.048,0.561538895072609,-0.292913461569778,0.00429208106964868,0.110497832164214,6.35768808293635e-05,4.73741016415729e-05,4.69979361739091,0.00542759788502155,0.0040182681800005,0.110497860609679,4.6997984692289
|
0.048,0.559808955480546,-0.2929138125769,0.00602078854783672,-3.78748356288927e-05,2.5604433392945e-05,0.109868035205001,-0.00290092068422342,0.00193541701762334,4.23678787821439,0.109868044716822,4.23678931340281
|
||||||
0.05,0.561769290326499,-0.292913323591249,0.00429218383316539,0.12009738620744,7.51286529931949e-05,5.59187214276002e-05,4.89975793999813,0.00615535560369306,0.00454798990395105,0.120097422724541,4.89976391708718
|
0.05,0.559808873904898,-0.292913757480248,0.00624901119499086,-4.37683967680069e-05,2.95273527017858e-05,0.118154587259618,-0.0029728832104392,0.00197356798958825,4.04326623543778,0.118154599055762,4.04326781003144
|
||||||
0.052,0.562019284617439,-0.292913161055166,0.00429230474453439,0.130096863924206,8.81983032441357e-05,6.55660612573771e-05,5.0997169524225,0.00694700196673946,0.00512181379860171,0.130096910342877,5.09972425613762
|
0.052,0.559808780406959,-0.292913694467489,0.00649340689687519,-4.97663684706495e-05,3.3498705351298e-05,0.126041100146752,-0.00301010266018364,0.00198718631133632,3.84325163507032,0.126041114423264,3.84325332759865
|
||||||
0.054,0.562289677782195,-0.292912970798036,0.00429244609741042,0.140496254017131,0.000102916660860153,7.6405976622007e-05,5.29966993568358,0.00780562950733475,0.00574138026530889,0.140496312487404,5.29967879389759
|
0.054,0.559808674839424,-0.292913623485426,0.00675317559557786,-5.58088074087415e-05,3.74760979471311e-05,0.133527593799899,-0.00301813474212764,0.00198024868724999,3.64324675648873,0.133527610721797,3.64324854480007
|
||||||
0.056,0.562581269633507,-0.292912749388523,0.00429261036844088,0.15129554366694,0.000119420821273475,8.85315823186127e-05,5.49961608288517,0.00873441521193062,0.00640830756949011,0.151295616700051,5.49962675238459
|
0.056,0.55980855717173,-0.292913544563098,0.00702751727207479,-6.183890743916e-05,4.1419700100298e-05,0.140614087172707,-0.00299854609198124,0.00195404343747429,3.44325110939336,0.140614106870739,3.44325296949019
|
||||||
0.058,0.562894859956863,-0.292912493114751,0.00429280022373969,0.162494718348671,0.000137854321707875,0.000102039206899967,5.69955449053471,0.00973662749731428,0.00712419062631752,0.162494808861784,5.69956725958923
|
0.058,0.559808427483794,-0.292913457806626,0.00731563194426869,-6.78029917766664e-05,4.52922716970283e-05,0.147300598237473,-0.00295289934171272,0.00190987015785682,3.2432642025357,0.147300620805728,3.24326610913568
|
||||||
0.06,0.563231248506902,-0.292912197971236,0.00429301852526848,0.174093761629079,0.000158367331262732,0.000117028344823883,5.89948414886353,0.0108156336560416,0.00789059960946968,0.174093872993876,5.89949933995976
|
0.06,0.559808285959763,-0.292913363394011,0.00761671966502468,-7.36505048060109e-05,4.90591807317253e-05,0.15358714398285,-0.00288275330689868,0.00184903496680544,3.04328554332714,0.153587169477169,3.04328747038806
|
||||||
0.062,0.563591235003379,-0.292911859645426,0.00429326833711899,0.186092654944125,0.000181116856332042,0.000133601605337846,6.09940393155733,0.0119749074718733,0.00870907857723062,0.186092791039465,6.09942190430828
|
0.062,0.559808132881775,-0.292913261569903,0.00792998052020009,-7.93340050042612e-05,5.268841156425e-05,0.159473740410781,-0.00278966325734097,0.0017728460054156,2.84331463755536,0.159473768847915,2.84331655876383
|
||||||
0.064,0.563975619126678,-0.292911473503811,0.00429355293168983,0.198491377355309,0.000206266961150225,0.000151864659132805,6.29931258462611,0.0132180370121526,0.00958114429114307,0.198491542624217,6.29933373886932
|
0.064,0.559807968623743,-0.292913152640365,0.00825461462666781,-8.48091578353748e-05,5.61505647533877e-05,0.164960402533071,-0.00267518104890562,0.00168260933658404,2.64335098915363,0.164960433890531,2.64335287837763
|
||||||
0.066,0.564385200512801,-0.292911034577581,0.00429387579575552,0.21128990528263,0.000233989004380652,0.000171926182502419,6.49920871424735,0.0145487329163141,0.0105082850034369,0.211290104793881,6.49923349334611
|
0.066,0.559807793645143,-0.292913036967644,0.00858982213033238,-9.00347291998837e-05,5.94188489105862e-05,0.170047144367396,-0.00254085526230074,0.00157962513208653,2.44339409995359,0.170047178583939,2.44339593165927
|
||||||
0.068,0.564820778747809,-0.292910537547793,0.00429424063641984,0.224488212212298,0.000264461892815482,0.000193897799146553,6.69909077360974,0.0159708370313371,0.0114919593069071,0.224488451726861,6.69911966797334
|
0.068,0.559807608484826,-0.292912914964969,0.00893480320413739,-9.49725788845778e-05,6.24690652817339e-05,0.174733978932886,-0.00238823143206001,0.00146518393945305,2.24344346956561,0.174734015909591,2.24344521919969
|
||||||
0.07,0.56528315336165,-0.29290997673001,0.00429465138695211,0.238086268377069,0.000297872352506001,0.000217894019730047,6.89895704867465,0.0174883313941443,0.0125335951504587,0.238086554419732,6.89899059951526
|
0.07,0.559807413754828,-0.292912787091383,0.00928875804606392,-9.95876549281237e-05,6.52795846683984e-05,0.179020918245658,-0.0022188522755262,0.00134056322639853,2.04349859530758,0.179020957847521,2.04350023964747
|
||||||
0.0720000000000001,0.565773123821317,-0.292909346058383,0.00429511221249876,0.252084040406997,0.000334415218392059,0.000244032179748388,7.0988056425289,0.0191053476789049,0.0136345891296047,0.252084380343486,7.09884444587503
|
0.0720000000000001,0.559807210134206,-0.29291265384663,0.00965088687712003,-0.000103847987986683,6.7831318187328e-05,0.182907973314116,-0.00203425765121778,0.00120702442832354,1.84355897213297,0.182908015372126,1.84356048960812
|
||||||
0.0740000000000001,0.566291489523278,-0.292908639069136,0.0042956275156711,0.266481490947184,0.000374293743221621,0.000272432376248466,7.29863445856486,0.0208261771508788,0.014796305796913,0.266481893067128,7.29867916955324
|
0.0740000000000001,0.559806998362876,-0.29291251576611,0.0100203899393204,-0.000107724685532995,7.01076823816926e-05,0.18639515413419,-0.00183598489189585,0.00106581003744832,1.64362409268547,0.186395198447824,1.64362546367708
|
||||||
0.0760000000000001,0.566839049785106,-0.29290784888341,0.00429620194200375,0.281278578241256,0.000417719926995574,0.00030321740293604,7.49844118208552,0.0226552812308822,0.0160200773246035,0.281279051847366,7.49849251955626
|
0.0760000000000001,0.559806779235464,-0.292912373415901,0.0103964674936568,-0.000111191927554266,7.20945583371212e-05,0.189482469684858,-0.0016255689225253,0.000918140882766315,1.44369344735103,0.189482516024944,1.44369465448249
|
||||||
0.0780000000000001,0.567416603836243,-0.292906968189428,0.00429684038528284,0.296475255675527,0.000464914868145149,0.00033651268554688,7.69326379170681,0.0245802433615494,0.0172948895291874,0.296475811179413,7.6933224987878
|
0.0780000000000001,0.559806553595166,-0.292912227387877,0.0107783198180598,-0.000114226961223096,7.37802459127578e-05,0.192169927923594,-0.00140454227415265,0.000765213854087009,1.24376652437842,0.192169976035495,1.24376755282312
|
||||||
0.0800000000000001,0.568024950807808,-0.292905989223938,0.00429754799274594,0.312051633408083,0.000516040900441772,0.00037239696105279,7.80657881532115,0.0263271762758476,0.0184215440852953,0.312052282302758,7.80664494346439
|
0.0800000000000001,0.559806322327619,-0.292912078294917,0.0111651472053512,-0.000116810096650877,7.51554137534693e-05,0.194457535782372,-0.00117443541003403,0.000608199858531666,1.04384281008479,0.19445758538943,1.04384364795276
|
||||||
0.0820000000000001,0.568664810369875,-0.292904904025827,0.00429832997312705,0.327701570936811,0.00057022357324854,0.000410198861888061,7.74832860281349,0.027525988616911,0.0191341843740894,0.327702323782551,7.74840112115
|
0.0820000000000001,0.559806086354779,-0.292911926766222,0.0115561499611893,-0.000118924702863232,7.62130453468845e-05,0.196345299163934,-0.000936776670124039,0.000448241926215287,0.843921789023954,0.196345349971136,0.843922427987754
|
||||||
0.0840000000000001,0.569335757091555,-0.292903708329645,0.00429918878819349,0.343044947819337,0.000626144854909416,0.000448933698549147,7.57158478418422,0.0282752689630127,0.0195077700581789,0.343045813009308,7.57166270960464
|
0.0840000000000001,0.559805846628808,-0.292911773442736,0.0119505284020069,-0.000120557203331373,7.69483814583304e-05,0.197833222938468,-0.000693092486181434,0.000286453628178806,0.644002944286473,0.197833274636281,0.644003380955815
|
||||||
0.0860000000000001,0.570036990161153,-0.292902399446407,0.00430012570792125,0.357987910073548,0.000683324649100591,0.000488229942120777,7.37137318761875,0.0288619774503617,0.0197522572308733,0.357988895162796,7.37145615442109
|
0.0860000000000001,0.559805604125966,-0.292911618972696,0.0123474828529432,-0.000121697072807958,7.73588598595997e-05,0.198921310941079,-0.000444907499730362,0.000123917771877036,0.444085757754682,0.198921363209406,0.444085997909017
|
||||||
0.0880000000000001,0.570767708731849,-0.292900975031048,0.00430114170796198,0.372530440569812,0.000741592764710863,0.000527942727472641,7.17115326223649,0.0293644548468585,0.0199254662439779,0.372531552803908,7.17124106455072
|
0.0880000000000001,0.559805359840516,-0.292911464007296,0.0127462136457712,-0.000122336833330294,7.74440525458386e-05,0.199609565969486,-0.000196202408486723,-3.67662289502135e-05,0.2461099028149,0.199609618481697,0.246109983768843
|
||||||
0.0900000000000001,0.571527111923432,-0.292899433075348,0.00430223747883114,0.386672523122494,0.000800782468488025,0.000567931807096688,6.97092551914246,0.0297843931879038,0.0200297169969734,0.386673769393548,6.97101792373769
|
0.0900000000000001,0.559805114778632,-0.292911309196486,0.0131459211168211,-0.000122481882441905,7.72117949437989e-05,0.199905750552339,4.69950467429924e-06,-0.00016523175189187,0.0870502566792038,0.199905802985723,0.0870504136206856
|
||||||
0.0920000000000001,0.572314398824339,-0.292897771901174,0.00430341343519036,0.400414142646382,0.000860730337462478,0.000608061595460535,6.77069054578342,0.0301234165424324,0.0200673501791343,0.400415529452661,6.77078729436455
|
0.0920000000000001,0.559804869912987,-0.292911155160117,0.0135458366479806,-0.000122318035311597,7.67831255382711e-05,0.199957766996203,9.82884745814871e-05,-0.000224601264670054,0.0130049113153743,0.199957819150585,0.0130072220198272
|
||||||
0.0940000000000001,0.573128768494017,-0.292895990153998,0.00430466972521298,0.413755285305628,0.000921276134657755,0.000648201207813225,6.57044900202045,0.0303830922920855,0.0200407243708053,0.413756818714645,6.57054981345413
|
0.0940000000000001,0.559804625506491,-0.292911002063983,0.0139457521848059,-0.000122088728543579,7.63133898851186e-05,0.199957770197601,0.000114519255189904,-0.000234676850868753,1.78492637337157e-06,0.199957822032016,0.000261134199416859
|
||||||
0.0960000000000001,0.573969419965562,-0.292894086796636,0.00430600624002161,0.426695938654464,0.00098226270663082,0.000688224492943756,6.37020161622925,0.0305649416054709,0.0199522131221277,0.426697624269449,6.3703061887066
|
0.0960000000000001,0.559804381558072,-0.292910849906557,0.014345667728771,-0.000121859958290837,7.58444181347961e-05,0.199957774135909,0.000114251323679593,-0.000234295319256894,2.15339465009512e-06,0.199957825652342,0.000260676617088583
|
||||||
0.0980000000000001,0.574835552248635,-0.292892061103172,0.00430742262318476,0.439236091770545,0.00104353590107964,0.000728010060301736,6.16994918151148,0.0306704492220033,0.0198042019823249,0.439237934700189,6.17005719465434
|
0.0980000000000001,0.559804138066658,-0.292910698686311,0.0147455832813496,-0.000121631723248861,7.53762086080911e-05,0.199957778811179,0.000113984127692035,-0.000233914620312303,2.52190282545861e-06,0.199957830011604,0.000260220658202657
|
||||||
0.1,0.575726364332644,-0.292889912653031,0.00430891828026282,0.45137573538051,0.00110494450351883,0.000767441300873056,5.96969255203111,0.0307010727049194,0.0195990853390365,0.451377740211901,5.96980366894817
|
0.1,0.559803895031179,-0.292910548401723,0.0151454988440157,-0.000121404021780069,7.49087596535469e-05,0.19995778422352,0.000113717694982807,-0.000233534701993276,2.89047431822897e-06,0.199957835109901,0.000259766291171652
|
||||||
0.102,0.576641055190157,-0.292887641325158,0.00431049238838825,0.463114861978669,0.00116634019189932,0.000806406401657882,5.76943263956573,0.0306582507089703,0.0193392632533151,0.463117032753331,5.76954650886239
|
0.102,0.559803652450571,-0.292910399051272,0.0155454144182437,-0.000121176852468929,7.4442069800118e-05,0.199957790373076,0.000113451942285181,-0.000233155553891473,3.25909698534188e-06,0.199957840947372,0.000259313472908523
|
||||||
0.104,0.577578823780559,-0.292885247292264,0.00431214390586945,0.474453465938773,0.00122757750635471,0.000844798353886316,5.56917040976655,0.0305434104778956,0.0190271381263554,0.474455806131727,5.56928666751211
|
0.104,0.55980341032377,-0.292910250633443,0.015945330005508,-0.000120950214010929,7.3976137437981e-05,0.199957797259908,0.000113186841843582,-0.000232777203762468,3.62776302054168e-06,0.199957847524066,0.000258862218994065
|
||||||
0.106,0.578538869053912,-0.292882731015132,0.0043138715818038,0.485391543617735,0.0012885138338109,0.000882514954163304,5.36890687867497,0.0303579748943405,0.0186651113480082,0.485394056119512,5.36902515033267
|
0.106,0.559803168649715,-0.292910103146723,0.0163452456072833,-0.000120724105101555,7.35109609850681e-05,0.199957804884129,0.000112922435291374,-0.0002323996099729,3.99648543425446e-06,0.199957854840089,0.000258412513248713
|
||||||
0.108,0.57952038995503,-0.292880093236928,0.00431567396568611,0.495929093453473,0.00134900940593208,0.000919458799278349,5.1686431093087,0.0301033685791429,0.0182555799574379,0.495931780554991,5.16876301163089
|
0.108,0.559802927427349,-0.292909956589599,0.0167451612250445,-0.000120498524269763,7.30465389980894e-05,0.19995781324585,0.000112658736506344,-0.000232022758644978,4.36525815494803e-06,0.199957862895544,0.000257964352031809
|
||||||
0.11,0.580522585427726,-0.292877334977508,0.00431754941700091,0.50606611605497,0.00140892730812747,0.000955537273993056,4.96838020799805,0.029781023171832,0.0178009331320422,0.506068979435219,4.96850135088925
|
0.11,0.559802686655618,-0.292909810960567,0.0171450768602667,-0.00012027347015553,7.25828699504882e-05,0.199957822345161,0.000112395703855128,-0.000231646635900917,4.73407077428156e-06,0.199957871690513,0.000257517707343393
|
||||||
0.112,0.58154465441925,-0.292874457527696,0.00431949611478208,0.515802614285465,0.0014681334986194,0.000990662531806518,4.76811932086096,0.029392382049076,0.0173035487015249,0.515805655001903,4.76824130921326
|
0.112,0.559802446333469,-0.29290966625812,0.0175449925144252,-0.000120048941454343,7.21199524544857e-05,0.199957832182133,0.000112133330398834,-0.00023127124867961,5.1029180880846e-06,0.199957881225057,0.000257072585129518
|
||||||
0.114,0.582585795884868,-0.292871462443514,0.00432151206712814,0.525138593338414,0.00152649683632378,0.00102475146879916,4.5678616301531,0.0289389044186294,0.0167657896784495,0.525141811820019,4.56798406565932
|
0.114,0.559802206459852,-0.292909522480757,0.0179449081889952,-0.000119824936833934,7.16577849557697e-05,0.199957842756834,0.000111871609198566,-0.000230896607389397,5.47182351512409e-06,0.199957891499236,0.000256628995051593
|
||||||
0.116,0.583645208792603,-0.292868351540351,0.00432359512065728,0.534074060806077,0.00158388911629392,0.00105772569052032,4.36760835072214,0.0284220686361247,0.0161900008278232,0.534077456848969,4.36773083367212
|
0.116,0.559801967033721,-0.29290937962698,0.0183448238854525,-0.000119601455017548,7.11963660249281e-05,0.199957854069427,0.000111610554132113,-0.000230522646110787,5.840770575527e-06,0.199957902513206,0.000256186886402314
|
||||||
0.118,0.584722092128092,-0.292865126887049,0.00432574296989022,0.542609026741303,0.00164018511086827,0.00108951147211045,4.16736072635787,0.0278433749043016,0.0155785052566303,0.542612599506858,4.1674828574263
|
0.118,0.559801728054032,-0.292909237695293,0.0187447396052729,-0.000119378494617406,7.07356943713266e-05,0.199957866119916,0.000111350151321687,-0.000230149364843779,6.20973367865262e-06,0.199957914266962,0.000255746255358152
|
||||||
0.12,0.585815644899568,-0.292861790799907,0.00432795316654572,0.550743503711509,0.00169526261591113,0.00112003971154684,3.96712002594806,0.0272043475697814,0.0149336010406633,0.550747251726889,3.96724140798678
|
0.12,0.559801489519743,-0.292909096684202,0.0191446553499322,-0.000119156054412262,7.0275768565553e-05,0.199957878908361,0.000111090400767289,-0.00022977680175229,6.57873061582492e-06,0.199957926760556,0.00025530713946669
|
||||||
0.122,0.586925066142938,-0.292858345836585,0.0043302231287364,0.558477506845095,0.0017490025011474,0.0011492458762731,3.76688753972501,0.0265065367745247,0.0142575579129358,0.558481428006112,3.76700777957585
|
0.122,0.559801251429814,-0.292908956592218,0.0195445711209064,-0.000118934133014337,6.98165871643174e-05,0.199957892434838,0.000110831288591024,-0.000229404925611237,6.94777022719472e-06,0.199957939994055,0.000254869507663381
|
||||||
0.124,0.588049554926949,-0.292854794789903,0.00433255015005081,0.565811053870409,0.00180128876300923,0.00117706994319858,3.53708533862344,0.0255557283494761,0.0134253458289682,0.565815145446639,3.53720313635886
|
0.124,0.559801013783211,-0.292908817417854,0.0199444869196715,-0.000118712729257897,6.9358148863108e-05,0.199957906699442,0.000110572759281952,-0.000229033698256826,7.31685996513411e-06,0.199957953967547,0.000254433304565603
|
||||||
0.126,0.58918831035842,-0.292851140681533,0.0043349314085092,0.572625848199589,0.0018512254145453,0.00120294725958897,3.2094859855123,0.0238896577207921,0.0121411166884012,0.572630104119529,3.20959785855804
|
0.126,0.559800776578897,-0.292908679159623,0.0203444027477041,-0.000118491841977209,6.89004523712901e-05,0.199957921702278,0.000110314882229118,-0.000228663116219666,7.68595716238443e-06,0.199957968681129,0.000253998558850271
|
||||||
0.128,0.590340058319747,-0.292847389888244,0.00433736193908917,0.578648997812458,0.0018968473938924,0.00122563440995219,2.78101720087942,0.0214605917515914,0.0103842094307031,0.578653404793495,2.7811193898125
|
0.128,0.559800539815843,-0.292908541816044,0.0207443186064806,-0.000118271469728981,6.84434963982294e-05,0.199957937443271,0.000110057664370993,-0.000228293169091178,8.05507032602958e-06,0.199957984134717,0.000253565267137376
|
||||||
0.13,0.59150290634967,-0.292843553291958,0.00433983394614901,0.583749917003106,0.00193706778155167,0.00124448409731179,2.33201049612552,0.0187851663079053,0.00849918868964238,0.583754457433425,2.33210164287949
|
0.13,0.559800303493018,-0.292908405385637,0.0211442344974772,-0.000118051611319725,6.79872796949254e-05,0.199957953922559,0.00010980104325764,-0.00022792387421866,8.42422789859575e-06,0.199958000328443,0.000253133421647552
|
||||||
0.132,0.59267505798776,-0.292839641617118,0.00434233987547841,0.58797703979696,0.00197198805912402,0.00125963116471076,1.90736690201809,0.0161709208801319,0.00668790649943629,0.587981695919161,1.90744717507184
|
0.132,0.559800067609397,-0.292908269866925,0.0215441504221709,-0.00011783226555595,6.75318009013547e-05,0.199957971140183,0.000109544998072586,-0.000227555214254993,8.79339396436806e-06,0.199958017262337,0.000252702999417837
|
||||||
0.134,0.593854814508858,-0.292835665339721,0.00434487247080785,0.591379384611179,0.0020017514650722,0.00127123572330953,1.50724616745923,0.0136369137024306,0.00496156059032887,0.591384138773005,1.50731602254449
|
0.134,0.559799832163956,-0.292908135258434,0.021944066382038,-0.000117613431327435,6.70770588379054e-05,0.199957989096135,0.000109289549632407,-0.00022718714062786,9.1625812839724e-06,0.199958034936387,0.000252273968972827
|
||||||
0.136,0.595040575526204,-0.292831634611258,0.00434742481837165,0.594006024466797,0.00202653571393374,0.00127947740707207,1.13156082520716,0.0111986669174002,0.00332859781404515,0.594010859338686,1.13162113397004
|
0.136,0.559799597155672,-0.29290800155869,0.0223439823785554,-0.000117395107357421,6.66230523388433e-05,0.199958007790508,0.000109034739570468,-0.00022681966721505,9.53179722651409e-06,0.199958053350674,0.000251846363934668
|
||||||
0.138,0.596230838606725,-0.292827559196865,0.00434999038043614,0.595905627912007,0.0020465461327418,0.00128455011456571,0.780010843692835,0.00886839884514655,0.00179496988626793,0.595910526670971,0.780063322233123
|
0.138,0.559799362583527,-0.292907868766224,0.0227438984132,-0.000117177292369153,6.61697801690452e-05,0.199958027223324,0.000108780512375617,-0.00022645279748601,9.90101403641751e-06,0.199958072505216,0.000251420165143711
|
||||||
0.14,0.597424198037852,-0.292823448426727,0.00435256301882991,0.597126067841569,0.00206200930931433,0.00128665728661714,0.452116556103055,0.00665529550220034,0.000364406937784778,0.597131014322065,0.45216568429407
|
0.14,0.559799128446503,-0.292907736879569,0.0231438144874487,-0.000116959985307918,6.57172411488993e-05,0.199958047394564,0.000108526833353384,-0.000226086517562951,1.02702395199383e-05,0.199958092399984,0.00025099534816656
|
||||||
0.142,0.598619342878091,-0.292819311159628,0.00435513700958261,0.59771409413642,0.0020731673147506,0.00128600774231685,0.147249351892253,0.00456580540389439,-0.000961303344218511,0.597719072949784,0.147323257891599
|
0.142,0.559798894743585,-0.29290760589726,0.0235437306027782,-0.000116743185035739,6.52654340987934e-05,0.199958068304282,0.000108273751076027,-0.000225720803159746,1.06394866875026e-05,0.199958113035026,0.000250571915481619
|
||||||
0.144,0.599815054414398,-0.292815155757468,0.00435770704979918,0.597715065249138,0.0020802725309299,0.00128281207324027,-0.135340179480137,0.00260394424772547,-0.00218204085442736,0.597720061873783,0.135382812829588
|
0.144,0.559798661473763,-0.292907475817833,0.0239436467606658,-0.000116526890303614,6.48143579362603e-05,0.199958089952511,0.000108021272482439,-0.000225355636929159,1.10087173751938e-05,0.199958134410365,0.000250149855612029
|
||||||
0.146,0.601010203139088,-0.292810990069504,0.00436026825787557,0.597172733418499,0.0020835830917415,0.00127727957889914,-0.396496804250246,0.000771599058951854,-0.00329908979215115,0.597177734263548,0.396511279964671
|
0.146,0.559798428636024,-0.292907346639828,0.0243435629625883,-0.000116311099945809,6.43640115510768e-05,0.199958112339152,0.000107769335122576,-0.000224991025810084,1.13779502278199e-05,0.199958156525896,0.000249729151360474
|
||||||
0.148,0.602203745348072,-0.292806821425101,0.00436281616811478,0.596129078032137,0.00208335892716571,0.00126961571407166,-0.63713793364839,-0.000931176580287739,-0.00431489211808605,0.596134070477377,0.637153224803543
|
0.148,0.559798196229363,-0.292907218361787,0.0247434792100224,-0.000116095812963124,6.39143938330199e-05,0.199958135464312,0.000107517952874225,-0.000224626952455287,1.17472082408754e-05,0.199958179381718,0.000249309796961668
|
||||||
0.15,0.603394719451216,-0.292802656633796,0.00436534672073186,0.594624181683905,0.00207985838542035,0.0012600200104268,-0.858233595635304,-0.0025058817555712,-0.00523282103672556,0.594629154099077,0.858253206540167
|
0.15,0.559797964252772,-0.292907090982253,0.0251433955044455,-0.000115881028134312,6.34655037412556e-05,0.199958159327985,0.000107267139615175,-0.000224263389109191,1.21164614799718e-05,0.199958202977819,0.000248891774823431
|
||||||
0.152,0.604582242074808,-0.292798501991559,0.00436785624815648,0.592696143649595,0.00207333540014343,0.00124868442992476,-1.06078897545159,-0.00395530648858444,-0.00605697668062954,0.592701085395994,1.06081364143546
|
0.152,0.55979773270525,-0.292906964499772,0.0255433118473344,-0.000115666744404663,6.30173402765832e-05,0.199958183930157,0.000107016881467636,-0.00022390035658848,1.24857069128126e-05,0.199958227314176,0.000248475100315141
|
||||||
0.154,0.605765504025815,-0.292794363292195,0.00437034145845155,0.590381025782099,0.00206403715946601,0.00123579210370428,-1.24582937224837,-0.00528329199833699,-0.00679200462712359,0.590385927199356,1.24585908884511
|
0.154,0.559797501585795,-0.292906838912892,0.0259432282401662,-0.000115452960608442,6.25699023149017e-05,0.199958209270812,0.000106767171492716,-0.000223537854893152,1.28549289268864e-05,0.199958252390765,0.000248059772386621
|
||||||
0.156,0.606943766177936,-0.292790245842921,0.0043727994165713,0.587712826160602,0.00205220223215008,0.00122151641141627,-1.41438739407335,-0.00649451362133568,-0.00744293712513083,0.587717678541344,1.4144218877456
|
0.156,0.559797270893408,-0.292906714220163,0.0263431446844176,-0.000115239675718692,6.21231888570106e-05,0.199958235349873,0.000106517974995945,-0.000223175828512056,1.3224138797896e-05,0.199958278207502,0.000247645729372072
|
||||||
0.158,0.608116355330457,-0.292786154483267,0.00437522752409722,0.584723476205806,0.00203805910498067,0.00120602035520376,-1.56749219931695,-0.00759428737950873,-0.00801505640676824,0.584728271760665,1.56753108717164
|
0.158,0.559797040627092,-0.292906590420136,0.0267430611815657,-0.000115026888708458,6.16771990008535e-05,0.199958262167368,0.000106269340549581,-0.000222814287853534,1.35933391279264e-05,0.199958304764408,0.000247233004433403
|
||||||
0.16,0.609282660082759,-0.292782093606502,0.00437762349799212,0.581442857363334,0.00202182508263204,0.00118945618578919,-1.70616059021189,-0.00858840009873573,-0.00851377856842666,0.581447589178527,1.70620344760933
|
0.16,0.559796810785853,-0.292906467511367,0.0271429777330871,-0.000114814598356494,6.12319317055964e-05,0.19995828972323,0.000106021233459153,-0.000222453222509244,1.39625143044664e-05,0.199958332061409,0.00024682157514012
|
||||||
0.162,0.61044212675991,-0.292778067182936,0.00437998534884038,0.577898833844958,0.00200370550458573,0.00117196524093005,-1.83138976599106,-0.00948296169714368,-0.00894455677493549,0.577903495834415,1.83143615958494
|
0.162,0.559796581368698,-0.292906345492409,0.0275428943404586,-0.000114602803774622,6.07873861108165e-05,0.199958318017425,0.00010577363984687,-0.000222092608193058,1.4331685581348e-05,0.199958360098463,0.000246411417576486
|
||||||
0.164,0.611594255418139,-0.292774078784483,0.00438231135895584,0.57411729829937,0.00198389323584347,0.00115367795868945,-1.94415154979727,-0.0102842786092738,-0.00931280186560606,0.574121885153119,1.94420105525231
|
0.164,0.559796352374638,-0.292906224361822,0.0279428110051568,-0.000114391503797107,6.03435612728242e-05,0.199958347049972,0.000105526594407209,-0.000221732483068893,1.47008277912031e-05,0.199958388875582,0.00024600258232959
|
||||||
0.166,0.612738595953108,-0.292770131609993,0.00438460006067513,0.570122227645769,0.00196256839014863,0.00113471403346763,-2.04538791484521,-0.0109987470138517,-0.00962381845395765,0.570126734776048,2.04544012684614
|
0.166,0.559796123802683,-0.292906104118164,0.0283427277286585,-0.000114180697396993,5.9900456178541e-05,0.199958376820736,0.000105280027751231,-0.000221372788156149,1.50699175360813e-05,0.199958418392624,0.000245594987721393
|
||||||
0.168,0.613874744328722,-0.292766228510923,0.00438685021508971,0.565935746639989,0.00193989824778806,0.00111518268487362,-2.13600764745189,-0.0116327639396174,-0.00988275497635493,0.565940170126308,2.13606218542807
|
0.168,0.559795895651848,-0.292905984759997,0.0287426445124397,-0.000113970383686102,5.94580701201996e-05,0.199958407329642,0.000105033967634505,-0.000221013485290911,1.54390025070006e-05,0.199958448649507,0.000245188616856274
|
||||||
0.17,0.615002338939668,-0.292762372017001,0.00438906079141463,0.561578197055961,0.00191603733439016,0.00109518301356221,-2.21688399747174,-0.012192654604698,-0.0100945658169232,0.561582533590143,2.21694050874886
|
0.17,0.559795667921149,-0.292905866285884,0.029142561357977,-0.000113760561526455,5.90164022373773e-05,0.199958438576746,0.000104788455690397,-0.00022065464039267,1.58080597223442e-05,0.199958479646279,0.00024478354831357
|
||||||
0.172,0.616121057116946,-0.292758564361585,0.00439123094714396,0.557068210650102,0.00189112762936927,0.00107480442160593,-2.28885318117461,-0.0126846143241876,-0.0102639837393226,0.557072457482114,2.28891134248924
|
0.172,0.559795440609602,-0.292905748694388,0.0295424782667467,-0.00011355122986334,5.85754515586289e-05,0.199958470561881,0.000104543429468862,-0.000220296236114192,1.61770449466636e-05,0.199958511382767,0.000244379739492449
|
||||||
0.174,0.617230611782268,-0.292754807506484,0.00439336000910105,0.552422784331263,0.00186529887709341,0.00105412707860492,-2.35271361595512,-0.0131146631367207,-0.0103955012167867,0.552426939216494,2.35277313388592
|
0.174,0.559795213716229,-0.292905631984078,0.0299423952402246,-0.000113342387808579,5.81352172929205e-05,0.199958503284926,0.000104298861214325,-0.000219938199597092,1.65459972112369e-05,0.199958543858841,0.000243977118017918
|
||||||
0.176,0.618330748254271,-0.292751103166077,0.00439544745545838,0.547657356186281,0.00183866897682239,0.00103322241673878,-2.40922577914026,-0.0134886117657273,-0.0104933592605036,0.547661417334758,2.40928638980715
|
0.176,0.559794987240051,-0.292905516153519,0.0303423122798864,-0.000113134034418483,5.76956987602406e-05,0.19995853674587,0.000104054806437936,-0.000219580544719155,1.69149208528729e-05,0.199958577074485,0.000243575723152896
|
||||||
0.178,0.619421241207013,-0.292747452830577,0.00439749289876801,0.542785881214702,0.0018113444300305,0.0010121536415629,-2.45911259656728,-0.0138120372812633,-0.0105615424392247,0.542789847242613,2.45917406483324
|
0.178,0.559794761180091,-0.292905401201283,0.030742229387208,-0.000112926168582827,5.72568951140439e-05,0.199958570944609,0.000103811258200803,-0.000219223306174852,1.72837889833577e-05,0.199958611029588,0.000243175584015106
|
||||||
0.18,0.62050189177913,-0.292743857788357,0.00439949607002463,0.537820905800012,0.00178342082769733,0.000990976246981883,-2.50306028001801,-0.0140902669948373,-0.0106037790700841,0.537824775683788,2.50312239835738
|
0.18,0.559794535535377,-0.292905287125939,0.0311421465636649,-0.000112718789385679,5.68188055355411e-05,0.199958605881026,0.000103568140175092,-0.000218866418044692,1.76526024700529e-05,0.199958645724024,0.0002427766112726
|
||||||
0.182,0.621572524830214,-0.292740319147266,0.00440145680375593,0.53277364009463,0.00175498336205115,0.000969738525282564,-2.54171954315596,-0.0143283695255847,-0.0106235454313749,0.532777413127744,2.54178213030774
|
0.182,0.559794310304934,-0.29290517392606,0.0315420638107321,-0.000112511896022127,5.63814294418651e-05,0.199958641555019,0.000103325507871954,-0.000218509880328676,1.80213673844909e-05,0.199958681157686,0.000242378831709076
|
||||||
0.184,0.622632986339508,-0.292736837854908,0.00440337502412576,0.527654027627388,0.00172610734959499,0.000948482065256383,-2.57570713703414,-0.0145311520108326,-0.010624073308596,0.527657703379961,2.57577003652909
|
0.184,0.559794085487793,-0.292905061600221,0.031941981129885,-0.000112305487354192,5.59447660142264e-05,0.199958677966495,0.000103083389046965,-0.000218153703435142,1.83900715836072e-05,0.199958717330473,0.000241982268260974
|
||||||
0.186,0.623683140940723,-0.292733414717868,0.00440525073201696,0.522470811546493,0.00169685875400782,0.00092724223204818,-2.60560765735773,-0.0147031622328708,-0.0106083601469214,0.522474389827711,2.60567073598448
|
0.186,0.559793861082984,-0.292904950146996,0.0323418985225981,-0.000112099562465939,5.55088146281246e-05,0.199958715115305,0.000102841707372292,-0.000217797859608515,1.8758701189614e-05,0.199958754242229,0.000241586864907055
|
||||||
0.188,0.624722869585694,-0.292730050419892,0.00440708399305395,0.517231596997958,0.00166729470066351,0.000906048624668698,-2.63197558438705,-0.0148486948813031,-0.010579181248041,0.517235077821281,2.63203873064685
|
0.188,0.559793637089543,-0.292904839564962,0.0327418159903462,-0.000111894120524703,5.50735745757924e-05,0.1999587530013,0.000102600476725723,-0.00021744236619603,1.91272601091086e-05,0.199958791892799,0.000241192646074783
|
||||||
0.19,0.625752067328715,-0.292726745539065,0.00440887492651564,0.511942909208945,0.00163746397448261,0.000884925507056016,-2.65533752635133,-0.014971801420155,-0.0105391033773314,0.511946292760031,2.65540064893932
|
0.19,0.559793413506502,-0.292904729852698,0.0331417335346033,-0.000111689160559036,5.46390451633405e-05,0.199958791624346,0.000102359704046151,-0.000217087178094877,1.94957583063426e-05,0.199958830282042,0.000240799577444712
|
||||||
0.192,0.62677064122253,-0.292723500563994,0.00441062369508217,0.506610246892552,0.00160740749498289,0.000863892211159372,-2.6761946458273,-0.0150763027374767,-0.0104904993069102,0.506613533499787,2.67625767216736
|
0.192,0.5597931903329,-0.292904621008782,0.0335416511568436,-0.000111484681708518,5.42052258634129e-05,0.199958830984333,0.000102119396272471,-0.000216732288366161,1.98641892865114e-05,0.199958869409841,0.000240407657805439
|
||||||
0.194,0.627778508316285,-0.292720315909085,0.00441233049536027,0.501238130625636,0.0015771587635327,0.000842963509828375,-2.69502525702958,-0.0151658041576407,-0.0104355634064634,0.501241320733164,2.69508813188488
|
0.194,0.559792967567776,-0.292904513031795,0.0339415688585407,-0.000111280682973946,5.37721160098758e-05,0.199958871081103,0.000101879546465788,-0.000216377707418225,2.02325326631447e-05,0.199958909276031,0.000240016894475382
|
||||||
0.196,0.628775593745033,-0.29271719192894,0.00441399554912149,0.495830145864434,0.00154674427835233,0.000822149957533518,-2.71228759101544,-0.0152437124693871,-0.0103763276148444,0.495833240007526,2.71235027518957
|
0.196,0.559792745210169,-0.292904405920318,0.034341486641168,-0.000111077163522655,5.333971503374e-05,0.199958911914464,0.000101640106053846,-0.000216023407495491,2.06007893036042e-05,0.199958949880414,0.00023962724441209
|
||||||
0.198,0.629761828899743,-0.292714128931972,0.00441561909519041,0.490388980261574,0.00151618391365515,0.000801458199368998,-2.72842273402879,-0.015313254660837,-0.0103146776727486,0.490391979044205,2.7284852031684
|
0.198,0.559792523259121,-0.292904299672934,0.0347414045061985,-0.000110874122549731,5.29080223798938e-05,0.19995895348426,0.000101401095853326,-0.000215669385128514,2.09689583405281e-05,0.199958991222827,0.000239238715796281
|
||||||
0.2,0.630737149666079,-0.292711127193286,0.00441720138191896,0.484916454928319,0.00148549125970898,0.000780891246842524,-2.74385775392988,-0.0153774979486099,-0.0102523696745779,0.484919359002783,2.74391999743582
|
0.2,0.559792301713678,-0.292904194288228,0.035141322455105,-0.000110671559139241,5.24770374932259e-05,0.199958995790297,0.000101162543619804,-0.000215315633378399,2.13370284982139e-05,0.199959033303068,0.000238851315662911
|
||||||
0.202,0.631701494719456,-0.292708186966933,0.00441874266017778,0.479413549245855,0.00145467392186072,0.000760448720670686,-2.75900903947551,-0.0154393712051282,-0.0101910467382657,0.479416359294281,2.7590710595279
|
0.202,0.559792080572885,-0.292904089764784,0.0355412404893597,-0.000110469472375252,5.20467598463802e-05,0.199959038832374,0.000100924421597703,-0.000214962141836805,2.1705008450279e-05,0.199959076120932,0.000238465026135332
|
||||||
0.204,0.632654803863062,-0.292705308497598,0.00442024317680165,0.473880418770417,0.00142373377488847,0.000740127059889461,-2.77428588835864,-0.0155016878361502,-0.0101322558936773,0.473883135488015,2.77434769906029
|
0.204,0.559791859835789,-0.292903986101189,0.0359411586104345,-0.000110267861452851,5.16171889258787e-05,0.199959082610331,0.000100686715909237,-0.000214608896625945,2.20729077377024e-05,0.19995911967625,0.000238079832257145
|
||||||
0.206,0.633597016394538,-0.292702492031833,0.00442170316841733,0.46831640569242,0.00139266717051611,0.000719919697095977,-2.79009439309306,-0.0155671697893433,-0.0100774650681548,0.468319029772318,2.79015601973201
|
0.206,0.559791639501439,-0.292903883296029,0.036341076819801,-0.000110066725511615,5.11883242598765e-05,0.199959127124005,0.000100449440432193,-0.000214255869990243,2.24406942680999e-05,0.199959163968853,0.000237695714449485
|
||||||
0.208,0.634528069485832,-0.292699737828916,0.00442312285559003,0.462720041198044,0.00136146509573109,0.000699817199616842,-2.80684168894179,-0.0156384730408409,-0.0100280804112007,0.462722573317576,2.80690316737457
|
0.208,0.559791419568887,-0.292903781347892,0.0367409951189305,-0.000109866063691122,5.07601654459177e-05,0.199959172373108,0.000100212567410995,-0.000213903075807486,2.28083602352158e-05,0.199959208998447,0.000237312675185347
|
||||||
0.21,0.63544789655933,-0.29269704617145,0.0044245024372158,0.457089038936653,0.00133011327835275,0.000679807375451174,-2.82494064696159,-0.0157182148685652,-0.00998546400773899,0.457091479744957,2.8250020231189
|
0.21,0.559791200037184,-0.292903680255367,0.0371409135092935,-0.000109665875241971,5.03327119566465e-05,0.199959218357446,9.99760829678563e-05,-0.000213550524486017,2.31759281904553e-05,0.199959254764832,0.000236930722620216
|
||||||
0.212,0.636356425641579,-0.292694417375803,0.00442584208509184,0.451420278610198,0.00129859223625683,0.000659875343585886,-2.84481511775986,-0.0158090031274205,-0.00995095225664318,0.451422628717008,2.844876447276
|
0.212,0.559790980905386,-0.292903580017044,0.0375408319923603,-0.00010946615935925,4.99059633479737e-05,0.199959265076821,9.97400287361393e-05,-0.000213198143167446,2.35433773171367e-05,0.199959301267802,0.000236549809126598
|
||||||
0.214,0.637253577673771,-0.292691851802505,0.00442714193859015,0.445709778465613,0.00126687726584307,0.000640003566424601,-2.86690586023819,-0.0159134679600381,-0.00992587512703424,0.445712038431135,2.86696720820584
|
0.214,0.559790762172547,-0.292903480631514,0.0379407505696008,-0.000109266915127026,4.94799193839767e-05,0.199959312530955,9.95043908380565e-05,-0.000212845935321225,2.39107006763661e-05,0.199959348507074,0.000236169933703794
|
||||||
0.216,0.638139264755441,-0.292689349866739,0.00442840209935753,0.439952655169245,0.00123493836441668,0.000620171843077749,-2.89167732679674,-0.0160342965363491,-0.00991157651959728,0.439954825495013,2.89173876764912
|
0.216,0.559790543837725,-0.292903382097366,0.0383406692424841,-0.000109068141795898,4.90545796066888e-05,0.199959360719624,9.92691345791385e-05,-0.000212493946050163,2.42779017375905e-05,0.199959396482416,0.000235791125152837
|
||||||
0.218,0.639013388294448,-0.292686912049048,0.00442962262596246,0.434143069158427,0.00120274007969767,0.000600357260346212,-2.91962552304708,-0.0161742717032232,-0.00990943639991858,0.434145150279072,2.91968714057223
|
0.218,0.55979032589998,-0.292903284413195,0.0387405880124792,-0.00010886983858871,4.86299435997761e-05,0.199959409642562,9.90342807760668e-05,-0.000212142137190341,2.46449726945541e-05,0.199959445193557,0.000235413359475696
|
||||||
0.22,0.639875837032075,-0.292684538906421,0.00443080352839892,0.428274153077057,0.00117024127760379,0.000580534097478074,-2.95128722165028,-0.0163363154739859,-0.00992089508721621,0.428276145352921,2.95134910914294
|
0.22,0.559790108358371,-0.292903187577592,0.0391405068810544,-0.000108672004672794,4.82060110579274e-05,0.199959459299514,9.8799801673266e-05,-0.000211790484455632,2.50119161493423e-05,0.199959494640235,0.000235036605800223
|
||||||
0.222,0.640726484906756,-0.292682231083937,0.00443194476235237,0.422337920271825,0.00113739481780173,0.000560673679997347,-2.9872508911094,-0.0165235385304885,-0.00994748022235117,0.422339823982392,2.98731315166694
|
0.222,0.559789891211961,-0.292903091589151,0.0395404258496773,-0.000108474639382017,4.77827816619536e-05,0.199959509690227,9.85657042096299e-05,-0.000211438980907141,2.53787225609758e-05,0.19995954482219,0.000234660862208034
|
||||||
0.224,0.641565188713162,-0.292679989327149,0.00443304622311891,0.416325149512619,0.00110414712348183,0.00054074417658867,-3.0281698084264,-0.0167392975314317,-0.00999083754442406,0.416326964850752,3.02823255539958
|
0.224,0.559789674459813,-0.292902996446465,0.0399403449198153,-0.000108277741855955,4.73602551342988e-05,0.199959560814405,9.83320092018402e-05,-0.000211087605728188,2.57453806537522e-05,0.199959595739121,0.000234286119842249
|
||||||
0.226,0.642391785504806,-0.292677814495443,0.00443410773905872,0.41022524103812,0.001070437627676,0.000520710329819651,-3.07477797034659,-0.0169872622565736,-0.0100527665436792,0.410226968105153,3.07484132795871
|
0.226,0.559789458100994,-0.29290290214813,0.0403402640929349,-0.000108081311345209,4.69384312390408e-05,0.19995961267175,9.80986888943213e-05,-0.000210736358918773,2.61118834887774e-05,0.199959647390723,0.000233912368617946
|
||||||
0.228,0.643206089677315,-0.292675707576639,0.00443512906443819,0.404026037631233,0.00103619807445554,0.000500533110413953,-3.12790961573549,-0.0172714952305364,-0.0101352621191542,0.404027676432987,3.1279737198858
|
0.228,0.559789242134568,-0.29290280869274,0.0407401833705023,-0.000107885347100378,4.65173096986237e-05,0.199959665261939,9.78657363481793e-05,-0.000210385240478894,2.6478239739669e-05,0.199959699776667,0.000233539608936139
|
||||||
0.23,0.644007889655331,-0.292673669703145,0.00443610987150038,0.397713602575178,0.00100135164675386,0.000480169281343034,-3.24299114641546,-0.0178931514223379,-0.0103852196954926,0.397715153019074,3.24305713692883
|
0.23,0.559789026559605,-0.292902716078892,0.0411401027539827,-0.000107689848399817,4.60968902771252e-05,0.199959718584708,9.76331446245204e-05,-0.000210034236530765,2.6844455477959e-05,0.199959752896683,0.000233167828471772
|
||||||
0.232,0.644796944087615,-0.292671702170052,0.00443704974156356,0.391054073045571,0.000964625468766188,0.000458992231631982,-3.48803197061653,-0.0192045270797081,-0.0109712057685257,0.391055532145621,3.48810209272312
|
0.232,0.559788811375174,-0.292902624305179,0.0415400222448411,-0.00010749481452188,4.56771727525007e-05,0.199959772639761,9.74009206622383e-05,-0.000209683340135491,2.7210500776198e-05,0.199959806750467,0.000232797022808968
|
||||||
0.234,0.645572105947514,-0.29266981120127,0.00443794584042691,0.383761474692712,0.000924533538435023,0.000436284458268931,-3.81744986249071,-0.0209166987619191,-0.0117453952865748,0.38376283635172,3.81752523439308
|
0.234,0.559788596580347,-0.292902533370201,0.0419399418445417,-0.000107300244717168,4.52581569165833e-05,0.199959827426712,9.71690852780149e-05,-0.000209332530476391,2.75763734763901e-05,0.199959861337628,0.000232427183916866
|
||||||
0.236,0.646331989986386,-0.292668004035898,0.00443879487939663,0.375784273595608,0.000880958673718512,0.000412010650485683,-4.15583939317176,-0.0225877199444557,-0.0124885191589083,0.375785532082782,4.1559195408527
|
0.236,0.559788382174196,-0.292902443272552,0.042339861554548,-0.000107106138180768,4.48398426305951e-05,0.199959882945254,9.69375898995927e-05,-0.000208981790206231,2.79420818080633e-05,0.199959916657855,0.000232058279122101
|
||||||
0.238,0.647075243041896,-0.292666287366575,0.00443959388302885,0.367138117120025,0.0008341826586572,0.000386330381633298,-4.48659888150487,-0.0241136120376905,-0.013150406701079,0.367139268063645,4.48668295325207
|
0.238,0.559788168155794,-0.29290235401083,0.0427397813763227,-0.000106912494357569,4.44222297557583e-05,0.199959939195039,9.6706420649184e-05,-0.000208631115855562,2.83076175347507e-05,0.199959972710789,0.000231690300850958
|
||||||
0.24,0.647800542454866,-0.292664667305263,0.00444034020092317,0.357837878069589,0.00078450422556775,0.000359409023681367,-4.8101073447937,-0.0254859793130668,-0.0137282024480906,0.357838918513725,4.81019445211129
|
0.24,0.559787954524218,-0.292902265583633,0.0431397013113281,-0.000106719312498171,4.40053181671729e-05,0.199959996175725,9.64756538546218e-05,-0.000208280500485491,2.86729706852617e-05,0.199960029496086,0.000231323275778901
|
||||||
0.242,0.648506594554174,-0.292663149349673,0.00444103151912358,0.34789768774085,0.000732238741404933,0.000331417571840936,-5.12672772421533,-0.0266965778372707,-0.0142191293791421,0.347898616189561,5.12681695100836
|
0.242,0.559787741278544,-0.292902177989557,0.0435396213610256,-0.000106526591742151,4.35891077538164e-05,0.199960053886922,9.62452201269669e-05,-0.000207929937157125,2.90381369089099e-05,0.199960087013348,0.000230957170398745
|
||||||
0.244,0.64919213320583,-0.292661738350298,0.00444166587121053,0.337330967172727,0.000677717914218667,0.000302532506164798,-5.43680772863151,-0.0277373094041688,-0.0146204729130697,0.337331783621372,5.43689814091349
|
0.244,0.559787528417851,-0.292902091227202,0.0439395415268758,-0.000106334331617663,4.31735984185444e-05,0.199960112328272,9.60150986495378e-05,-0.000207579415462122,2.9403130534511e-05,0.199960145262212,0.000230591970756803
|
||||||
0.246,0.649855918422865,-0.292660438478016,0.00444224164914823,0.326150456826324,0.000621289503788258,0.000272935680188657,-5.74068056843153,-0.0286002237413752,-0.0149295700793343,0.326151162779704,5.74077122463769
|
0.246,0.559787315941218,-0.292902005295164,0.0443394618103387,-0.000106142531347553,4.27587900919679e-05,0.199960171499444,9.57853379944086e-05,-0.000207228900705939,2.97679254510075e-05,0.199960204242339,0.000230227664819308
|
||||||
0.248,0.650496735033135,-0.292659253192282,0.00444275761393129,0.314368244899001,0.000563317019253166,0.000242814225847461,-6.03838544029712,-0.0292761991003969,-0.0151431480219924,0.314368843376202,6.03847539834005
|
0.248,0.559787103847726,-0.292901920192041,0.0447393822128736,-0.000105951190265686,4.23446828157206e-05,0.199960231399974,9.55559034674766e-05,-0.000206878417174856,3.01325010082511e-05,0.199960263953262,0.00022986425950389
|
||||||
0.25,0.651113391402461,-0.292658185209939,0.00444321290605162,0.301996915065135,0.000504184707386671,0.000212363088100688,-6.2815889930046,-0.0295358003749036,-0.0151497336680841,0.301997410600089,6.28167669933518
|
0.25,0.559786892136457,-0.292901835916432,0.0451393027359386,-0.000105760307733683,4.19312764232685e-05,0.199960292029448,9.5326815885605e-05,-0.000206527971807831,3.0496879417641e-05,0.199960324394557,0.000229501774764725
|
||||||
0.252,0.651704722693396,-0.292657236453453,0.00444360706628369,0.289241888926983,0.000445173817753552,0.000182215291175125,-6.38575044342777,-0.0290196092260506,-0.0147757748718631,0.28924228890705,6.38583347629584
|
0.252,0.559786680806495,-0.292901752466936,0.0455392233809914,-0.000105569883002143,4.15185709284893e-05,0.199960353387492,9.5098075248062e-05,-0.000206177474398954,3.08610572860579e-05,0.199960385565848,0.000229140131191005
|
||||||
0.254,0.652270358958169,-0.292656404514668,0.00444394176721633,0.276453913291424,0.000388106270482469,0.000153259988613236,-6.36131525394432,-0.0278534719178047,-0.0140882115565524,0.276454228199251,6.36139183305568
|
0.254,0.559786469856925,-0.292901669842149,0.0459391441494886,-0.000105379915432691,4.11065665256726e-05,0.199960415473677,9.48696399216686e-05,-0.00020582695270388,3.12250286391147e-05,0.199960447466697,0.000228779337903898
|
||||||
0.256,0.652810538346561,-0.292655684028371,0.00444422010623814,0.263796627911206,0.000333759930082333,0.000125862444948915,-6.29038651493024,-0.0264768041588481,-0.0133063366714037,0.26379686907613,6.29045630991666
|
0.256,0.559786259286833,-0.29290158804067,0.0463390650428861,-0.000105190404442457,4.06952631176738e-05,0.199960478287606,9.46415099067898e-05,-0.000205476444886665,3.1588783672154e-05,0.199960510096704,0.000228419430116148
|
||||||
0.258,0.653325545469814,-0.292655069474948,0.00444444521699612,0.251292367231703,0.000282199053847076,0.000100034641927621,-6.20872279795403,-0.0250742151867988,-0.012521394110801,0.251292545596062,6.20878605553548
|
0.258,0.559786049095307,-0.292901507061096,0.046738986062639,-0.000105001349393063,4.0284660746126e-05,0.199960541828812,9.44137129588184e-05,-0.000205125888497193,3.19523010480771e-05,0.199960573455392,0.00022806036233572
|
||||||
0.26,0.653815707815488,-0.292654555232156,0.00444462024480585,0.238961736719389,0.000233463069335138,7.57768685057113e-05,-6.11715776478726,-0.0236575990568421,-0.0117389371912316,0.238961862779577,6.11721477503746
|
0.26,0.559785839281436,-0.292901426902027,0.0471389072102013,-0.000104812749590621,3.9874759563685e-05,0.19996060609681,9.41862490777544e-05,-0.000204775276596569,3.23155825016075e-05,0.199960637542274,0.000227702130628935
|
||||||
0.262,0.654281392416692,-0.292654135622671,0.00444474832447014,0.226823736172554,0.000187568657619708,5.30788931626946e-05,-6.01646532420729,-0.0222378222468344,-0.010963948533782,0.226823819936634,6.01651641120461
|
0.262,0.559785629844309,-0.292901347562058,0.0475388284870263,-0.000104624604396752,3.94655596397397e-05,0.199960671091142,9.39590905080222e-05,-0.000204424616123688,3.26786427778946e-05,0.199960702356883,0.000227344733961922
|
||||||
0.264,0.654723002760178,-0.292653804957525,0.0044448325603785,0.21489587542256,0.0001445117803478,3.19210743705833e-05,-5.90736336019553,-0.0208247533904637,-0.0102008706273637,0.214895926383536,5.90740887339754
|
0.264,0.559785420783018,-0.292901269039788,0.0479387498945659,-0.000104436913228589,3.90570610991902e-05,0.199960736811382,9.3732223371834e-05,-0.000204073875853527,3.30414758054065e-05,0.199960767898789,0.000226988139838864
|
||||||
0.266,0.655140975918382,-0.292653557575549,0.00444487600876763,0.203194282731772,0.000104269644057853,1.22754106532397e-05,-5.79051730298373,-0.0194272960739316,-0.00945363570151873,0.203194309855674,5.79055760935117
|
0.266,0.559785212096656,-0.292901191333814,0.0483386714342718,-0.000104249675503265,3.86492641363256e-05,0.199960803257045,9.35056754247653e-05,-0.000203723055786087,3.34040607674612e-05,0.199960834167502,0.000226632358835226
|
||||||
0.268,0.655535779891105,-0.292653387878949,0.00444488166202112,0.191733806210625,6.68025960520734e-05,-5.89346843549165e-06,-5.66654353790357,-0.0180534238738983,-0.00872569482814055,0.191733817938655,5.66657901478665
|
0.268,0.559785003784316,-0.292901114442731,0.0487385931075941,-0.00010406289052689,3.82421688760459e-05,0.199960870427625,9.32794397279223e-05,-0.000203372176738048,3.37663902949536e-05,0.199960901162507,0.000226277407755786
|
||||||
0.27,0.655907911143224,-0.292653290365165,0.00444485243489388,0.180528108580158,3.20559485622595e-05,-2.26273686593226e-05,-5.53601264977054,-0.0167102170399447,-0.00802004624170237,0.180528112844263,5.53604367855914
|
0.27,0.559784795845094,-0.292901038365138,0.0491385149159823,-0.000103876557744353,3.78357754293734e-05,0.199960938322606,9.30534815868355e-05,-0.000203021176259366,3.41284656785179e-05,0.199960968883285,0.000225923218405585
|
||||||
0.272,0.656257892325426,-0.292653259655155,0.00444479115254648,0.169589755611543,-3.82721077052394e-08,-3.79736534023012e-05,-5.39945250146305,-0.0154039004676698,-0.00733926263686567,0.169589759862979,5.39947946199273
|
0.272,0.559784588278085,-0.29290096309963,0.0495384368608845,-0.000103690676600543,3.74300841710084e-05,0.199961006941487,9.28278287570804e-05,-0.000202670037002805,3.44902908316902e-05,0.199961037329329,0.000225569789316138
|
||||||
0.274,0.656586270165671,-0.292653290518253,0.00444470054028027,0.158930298574306,-2.95596533084197e-05,-5.19844192067853e-05,-5.25735114796643,-0.0141398825773131,-0.0066855172856095,0.158930309825001,5.2573744136636
|
0.274,0.559784381082387,-0.292900888644801,0.0499383589437482,-0.000103505246429325,3.70250952813622e-05,0.199961076283769,9.2602488177551e-05,-0.000202318817948965,3.48518436332767e-05,0.199961106500132,0.000225217175005767
|
||||||
0.276,0.656893613519723,-0.292653377893768,0.00444458321486965,0.148560351019677,-5.65978024169577e-05,-6.47157225447392e-05,-5.11015958893495,-0.0129227947336108,-0.00606060934077445,0.148560375896555,5.11017952267756
|
0.276,0.559784174257099,-0.292900814999249,0.0503382811660196,-0.000103320266647833,3.66208088992126e-05,0.199961146348862,9.23774182148839e-05,-0.000201967477464482,3.52131214811923e-05,0.1999611763951,0.000224865322524089
|
||||||
0.278,0.657180511569749,-0.292653516909463,0.0044444416773901,0.138489660218566,-8.12508322428628e-05,-7.62268565698831e-05,-4.958294362839,-0.0117565308009604,-0.0054659880640781,0.138489705031404,4.95831131350211
|
0.278,0.559783967801321,-0.292900742161566,0.0507382035291437,-0.000103135736756465,3.62172253715043e-05,0.199961217136255,9.21526396857607e-05,-0.000201615970446545,3.55741382532248e-05,0.199961247013716,0.000224514204122178
|
||||||
0.28,0.657447572160597,-0.292653702897097,0.00444427830744337,0.128727173568321,-0.000103623925620799,-8.65796748010516e-05,-4.80213998686751,-0.0106442868651191,-0.00490277600115329,0.128727244392346,4.80215428651842
|
0.28,0.559783761714152,-0.292900670130347,0.0511381260345646,-0.00010295165608909,3.58143450174264e-05,0.199961288645415,9.19281664679693e-05,-0.000201264303834048,3.59348809389481e-05,0.19996131835544,0.000224163831730417
|
||||||
0.282,0.657695420264023,-0.292653931405166,0.00444409535869089,0.119281100271096,-0.000123827979703339,-9.58379605744963e-05,-4.64205124851152,-0.00958860089245171,-0.00437179127881631,0.119281203046274,4.64206321021519
|
0.282,0.559783555994696,-0.292900598904186,0.0515380486837253,-0.000102768024090594,3.54121681561681e-05,0.199961360875779,9.17039430503585e-05,-0.000200912481096438,3.62953261195953e-05,0.199961390419706,0.000223814183932649
|
||||||
0.284,0.657924696561682,-0.292654198209016,0.00444389495560107,0.110158968574275,-0.000141978329190606,-0.000104066839916317,-4.47835535392903,-0.00859139197284529,-0.00387356898987056,0.110159109224346,4.47836527012007
|
0.284,0.559783350642056,-0.292900528481674,0.0519379714780677,-0.000102584840316888,3.50106950930406e-05,0.199961433826719,9.14800110662916e-05,-0.000200560495294821,3.66554842035071e-05,0.199961463205878,0.000223465275199048
|
||||||
0.286,0.65813605613832,-0.292654499318482,0.00444367909133123,0.10136767885538,-0.00015819354759472,-0.000111332236533979,-4.31135515083225,-0.00747888871666101,-0.00329858683163069,0.101367863431133,4.31136289948541
|
0.286,0.559783145655335,-0.292900458861405,0.0523378944190322,-0.000102402104046328,3.46099261749888e-05,0.199961507497716,9.12563982713443e-05,-0.000200208332551408,3.70153573556186e-05,0.199961536713431,0.000223117106759293
|
||||||
0.288,0.658330167277103,-0.292654830983206,0.00444344962665494,0.0929135479709463,-0.00017189388405725,-0.00011726118724284,-4.14133516891956,-0.00516546321341348,-0.0019710992612415,0.0929137809705469,4.14133885942367
|
0.288,0.55978294103364,-0.29290039004197,0.0527378175080586,-0.000102219814723803,3.4209861762835e-05,0.199961581888149,9.10330075210019e-05,-0.00019985596164118,3.73749165297199e-05,0.199961610941741,0.000222769607997687
|
||||||
0.29,0.658507710330203,-0.292655186894019,0.00444321004658225,0.0848023381797013,-0.000178855400448374,-0.000119216633578945,-3.96855250228006,-0.00110280999957024,0.000437273408454563,0.08480261058838,3.96855267959885
|
0.29,0.559782736776076,-0.292900322021958,0.0531377407465848,-0.000102037972016244,3.38105023284241e-05,0.199961656997382,9.08098596319461e-05,-0.000199503375625243,3.77341738619363e-05,0.199961685890164,0.000222422785184619
|
||||||
0.292,0.658669376629822,-0.292655546404808,0.00444297276012062,0.0770393379618261,-0.000176305124055531,-0.000115512093609021,-3.79323007748677,0.00311144602443968,0.00291497610424573,0.0770396262980098,3.79323247362093
|
0.292,0.559782532881752,-0.29290025479996,0.0535376641360481,-0.000101856575285275,3.3411848260334e-05,0.199961732824844,9.05870517486917e-05,-0.000199150598789721,3.80931228366465e-05,0.199961761558124,0.000222076700602005
|
||||||
0.294,0.658815867682051,-0.292655892114515,0.00444274799820782,0.0696294178697542,-0.000166409616350616,-0.000107556729161962,-3.61557744982948,0.00616594225330557,0.00464983206018703,0.0696296997946369,3.61558569743514
|
0.294,0.559782329349775,-0.292900188374565,0.0539375876778842,-0.00010167562380925,3.30138999332652e-05,0.199961809369873,9.03645006045117e-05,-0.000198797592970701,3.84517469947942e-05,0.199961837944953,0.000221731285089405
|
||||||
0.296,0.658947894301301,-0.292656212043273,0.00444254253320397,0.0625770281625082,-0.000151641355042309,-9.69127653682732e-05,-3.43579736439281,0.00809787469718824,0.00568232356220471,0.0625772869405185,3.43581160623574
|
0.296,0.559782126179256,-0.292900122744361,0.0543375113735276,-0.000101495117282857,3.26166578884512e-05,0.199961886631832,9.01421784438305e-05,-0.000198444326943159,3.88100545659075e-05,0.199961915050009,0.000221386502673337
|
||||||
0.298,0.659066175794701,-0.292656498679935,0.00444236034714635,0.055886228412183,-0.000134018117561863,-8.48274349131427e-05,-3.25407695360435,0.00912359962926266,0.00616046968906352,0.0558864534810381,3.25409557503094
|
0.298,0.559781923369306,-0.292900057907934,0.0547374352244115,-0.000101315055095474,3.22201226254925e-05,0.199961964610092,8.99201407777993e-05,-0.000198090821523777,3.91680455430476e-05,0.199961992872656,0.000221042396569361
|
||||||
0.3,0.65917143921495,-0.292656748115743,0.00444220322346432,0.0495607203480907,-0.000115146956525258,-7.22708866120191e-05,-3.07058759879685,0.00943726555582834,0.00621366078902562,0.0495609068049032,3.07060838816131
|
0.3,0.559781720919036,-0.29289999386387,0.055137359231968,-0.000101135436719746,3.18242946023561e-05,0.199962043304014,8.96983459730548e-05,-0.00019773708365145,3.95256978188984e-05,0.199962071412253,0.00022069895402868
|
||||||
0.302,0.659264418676093,-0.292656959267761,0.0044420712635999,0.0436038780169956,-9.62690553385492e-05,-5.99727917570402e-05,-2.88548622605355,0.00921074156529087,0.00595352606276577,0.0436040255319139,2.88550706860641
|
0.302,0.559781518827559,-0.292899930610755,0.0555372833976276,-0.000100956261711582,3.14291742908867e-05,0.199962122712883,8.94768148462787e-05,-0.00019738306475392,3.98830014153306e-05,0.199962150668075,0.000220356140029228
|
||||||
0.304,0.659345854727018,-0.292657133191965,0.00444196333229729,0.0380187754438765,-7.83039902640947e-05,-4.8456782360956e-05,-2.69891650991893,0.0085941273056389,0.00547511430377261,0.0380188869619635,2.69893574644039
|
0.304,0.559781317093989,-0.292899868147173,0.0559372077228195,-0.000100777529460361,3.10347623433404e-05,0.19996220283602,8.92555543363648e-05,-0.000197028740545058,4.0239974977152e-05,0.19996223063944,0.000220013940846541
|
||||||
0.306,0.659416493777869,-0.292657272483722,0.00444187743647045,0.0328082119773198,-6.18925461159935e-05,-3.80723345419498e-05,-2.51100998653608,0.00771658791379191,0.00485819388797853,0.0328082924477742,2.51102654312152
|
0.306,0.559781115717441,-0.292899806471706,0.0563371322089717,-0.000100599239494237,3.06410593287065e-05,0.199962283672783,8.90345366877376e-05,-0.000196674138780439,4.0596608540111e-05,0.199962311325699,0.000219672370163356
|
||||||
0.308,0.659477087574927,-0.292657380762149,0.00444181104295913,0.0279747354977322,-4.7437638608927e-05,-2.90240068090419e-05,-2.3218870795344,0.00668735189446322,0.00416855671769161,0.0279747907747423,2.3219004517096
|
0.308,0.559780914697031,-0.292899745582936,0.0567370568575106,-0.00010042139131361,3.02480657882187e-05,0.199962365222454,8.88137341448213e-05,-0.000196319252521171,4.09528700048844e-05,0.199962392726131,0.000219331406426109
|
||||||
0.31,0.65952839271986,-0.292657462234277,0.00444176134044322,0.0235206636591822,-3.51431385381406e-05,-2.13981076711833e-05,-2.13165804343468,0.00559678021289089,0.00345926595441553,0.0235206996470678,2.13166819758832
|
0.31,0.559780714031876,-0.292899685479443,0.0571369816698615,-0.000100243984557657,2.98557823186218e-05,0.199962447484263,8.85931952798734e-05,-0.000195964054011677,4.13087728051708e-05,0.199962474839958,0.000218991048733181
|
||||||
0.312,0.659571170229564,-0.292657521334703,0.00444172545052844,0.0194481033239935,-2.50505177573634e-05,-1.51869429913798e-05,-1.94042382944959,0.00451746504440131,0.00277182454593016,0.019448125387101,1.94043106767479
|
0.312,0.559780513721093,-0.292899626159806,0.0575369066474477,-0.00010006701853249,2.9464209572172e-05,0.199962530457545,8.83729617262573e-05,-0.000195608518965828,4.16643160944252e-05,0.199962557666511,0.000218651293826246
|
||||||
0.314,0.659606185133156,-0.292657562436348,0.00444170059267125,0.0157589683413839,-1.70732783605354e-05,-1.03108094874626e-05,-1.74827687830781,0.00350534936494062,0.00213726428915928,0.0157589809630688,1.74828169886849
|
0.314,0.559780313763802,-0.292899567622604,0.0579368317916917,-9.98904927107524e-05,2.90733482427585e-05,0.199962614141527,8.81529155227766e-05,-0.000195252661261413,4.20194768771531e-05,0.19996264120501,0.000218312103837281
|
||||||
0.316,0.659634206102929,-0.292657589627817,0.00444168420729049,0.0124549958107622,-1.10291202976009e-05,-6.63788583474267e-06,-1.55530184532681,0.00260087700681976,0.0015771675406645,0.0124550024628311,1.55530481967222
|
0.316,0.559780114159122,-0.292899509866413,0.0583367571040138,-9.97144068703991e-05,2.86831989271263e-05,0.199962698535453,8.7933077486113e-05,-0.000194896467020643,4.23742776978208e-05,0.199962725454694,0.000217973480918481
|
||||||
0.318,0.659656005116399,-0.292657606552829,0.00444167404112791,0.00953776096007663,-6.66977033325632e-06,-4.00213932480464e-06,-1.36157626250133,0.0018301916336616,0.00110463931231319,0.00953776413183495,1.36157794063965
|
0.318,0.559779914906174,-0.292899452889809,0.0587366825858335,-9.95387604008079e-05,2.82937623746759e-05,0.199962783638638,8.77135308829934e-05,-0.00019453990154905,4.27287085921768e-05,0.199962810414873,0.000217635427567828
|
||||||
0.32,0.65967235714677,-0.292657616306898,0.00444166819873319,0.00700869076075694,-3.70835376295453e-06,-2.2193285854899e-06,-1.16717114195114,0.00120640369222213,0.000725247538239936,0.00700869209319589,1.1671719907526
|
0.32,0.55977971600408,-0.292899396691364,0.0591366082385684,-9.93635527468672e-05,2.79050393209301e-05,0.199962869450287,8.74942202022665e-05,-0.000194182985663316,4.30827266223454e-05,0.199962896084747,0.000217297933315386
|
||||||
0.322,0.659684039879442,-0.292657621386244,0.00444166516381357,0.00486907639227207,-1.84415556436779e-06,-1.10114917184489e-06,-0.972151525127638,0.000730939860721368,0.000437947266125615,0.00486907686602096,0.972151898562607
|
0.322,0.559779517451963,-0.292899341269652,0.0595365340636346,-9.91887835199988e-05,2.75170304320227e-05,0.199962955969544,8.72751246272473e-05,-0.000193825702016204,4.3436350870285e-05,0.199962982463454,0.000216960979712257
|
||||||
0.324,0.659691833452339,-0.29265762368352,0.00444166379413651,0.00312008466024638,-7.84594320069053e-07,-4.67539520987436e-07,-0.776576982282339,0.000394983445256569,0.00023600066258872,0.00312008479392567,0.776577118590922
|
0.324,0.559779319248946,-0.292899286623242,0.0599364600624465,-9.90144522483582e-05,2.71297365128653e-05,0.199963043195691,8.70562649746241e-05,-0.000193468015913245,4.37896021526773e-05,0.19996306955027,0.000216624550107852
|
||||||
0.326,0.659696520218083,-0.292657624524621,0.00444166329365549,0.00176276846314271,-2.64221783341511e-07,-1.57146521490015e-07,-0.580502066020726,0.000181006279409423,0.00010790048542153,0.00176276848994946,0.580502104268468
|
0.326,0.559779121394154,-0.292899232750705,0.0603363862364174,-9.88405584601003e-05,2.67431583683697e-05,0.199963131127953,8.68376343055032e-05,-0.000193109930823887,4.41424353667119e-05,0.199963157344415,0.000216288637507122
|
||||||
0.328,0.659698884526191,-0.292657624740408,0.00444166316555042,0.000798076396163471,-6.05692024313597e-08,-3.5937579301315e-08,-0.38397672320195,6.43856704063416e-05,3.83010342192013e-05,0.000798076399271029,0.383976730510315
|
0.328,0.559778923886713,-0.292899179650609,0.0607363125869583,-9.86671017111362e-05,2.63572967895697e-05,0.199963219765432,8.66192256809838e-05,-0.000192751446748129,4.44948587488558e-05,0.199963245844987,0.000215953242476585
|
||||||
0.33,0.659699712523667,-0.292657624766898,0.00444166314990517,0.000226861570334913,-6.67910171614494e-09,-3.94238461320917e-09,-0.194553548701903,1.51281660809577e-05,8.97662673360332e-06,0.000226861570467489,0.194553549497163
|
0.33,0.559778726725747,-0.292899127321518,0.0611362391154791,-9.84940815573764e-05,2.59721525813772e-05,0.199963309107388,8.64010599177511e-05,-0.000192392563685972,4.48468822841774e-05,0.199963335051238,0.000215618377155526
|
||||||
0.332,0.659699791972473,-0.292657624767124,0.00444166314978088,1.9862201355858e-05,-5.6538107529036e-11,-3.10723669016965e-11,-0.0567153925837282,1.66977542903623e-06,9.85596153302291e-07,1.98622013559628e-05,0.0567153926168722
|
0.332,0.559778529910386,-0.292899075761998,0.0615361658233879,-9.83214974714652e-05,2.55877265348259e-05,0.199963399152961,8.61831161991233e-05,-0.000192033233065158,4.51984625976509e-05,0.199963424962305,0.00021528398254501
|
||||||
0.334,0.659699791972473,-0.292657624767124,0.00444166314978088,0,0,0,-0.009931100677929,2.8269053764518e-08,1.55361834508483e-08,0,0.00993110067798139
|
0.334,0.559778333439758,-0.292899024970612,0.061936092712091,-9.81493490925799e-05,2.52040196491165e-05,0.199963489901238,8.59653806473125e-05,-0.000191673447946794,4.55496257031895e-05,0.199963515577267,0.000214950054011043
|
||||||
|
0.336,0.55977813731299,-0.29289897494592,0.0623360197829929,-9.79776359488759e-05,2.48210327430387e-05,0.199963581351464,8.57478879567885e-05,-0.000191313225678113,4.59003733424556e-05,0.199963606895366,0.000214616623031375
|
||||||
|
0.338,0.559777941529214,-0.292898925686481,0.0627359470374968,-9.78063575407528e-05,2.44387667464041e-05,0.199963673502732,8.55306173108693e-05,-0.000190952552381328,4.62506621543013e-05,0.199963698915688,0.000214283661318901
|
||||||
|
0.34,0.55977774608756,-0.292898877190853,0.0631358744770038,-9.76355134796324e-05,2.40572225335134e-05,0.199963766354113,8.53135340150856e-05,-0.000190591424586994,4.66005155505544e-05,0.1999637916373,0.000213951158589573
|
||||||
|
0.342,0.55977755098716,-0.292898829457591,0.0635358021029133,-9.74651034046924e-05,2.36764010480561e-05,0.199963859904794,8.5096658886119e-05,-0.00019022978331451,4.69499335242762e-05,0.199963885059384,0.000213619072349358
|
||||||
|
0.344,0.559777356227146,-0.292898782485249,0.063935729916623,-9.72951268440879e-05,2.32963034002553e-05,0.199963954153847,8.4880026618439e-05,-0.000189867645911112,4.72988896313419e-05,0.199963979181005,0.000213287427765755
|
||||||
|
0.346,0.559777161806652,-0.292898736272377,0.0643356579195287,-9.71255832982187e-05,2.29169304644117e-05,0.199964049100352,8.46636233342578e-05,-0.000189505026254588,4.76473816998779e-05,0.199964074001239,0.000212956232767888
|
||||||
|
0.348,0.559776967724813,-0.292898690817527,0.0647355861130244,-9.69564723507509e-05,2.2538283295237e-05,0.199964144743374,8.44474351557877e-05,-0.000189141889650468,4.79954079951605e-05,0.199964169519143,0.000212625452177209
|
||||||
|
0.35,0.559776773980763,-0.292898646119244,0.0651355144985022,-9.67877935575955e-05,2.21603629058098e-05,0.199964241081984,8.42314135107713e-05,-0.000188778232629305,4.83429737213603e-05,0.199964265733787,0.00021229506646385
|
||||||
|
0.352,0.559776580573639,-0.292898602176075,0.0655354430773523,-9.66195466967078e-05,2.17831703647198e-05,0.199964338115269,8.40156000325719e-05,-0.000188414027435524,4.86900650006894e-05,0.199964362644249,0.000211965066020509
|
||||||
|
0.354,0.559776387502576,-0.292898558986563,0.0659353718509632,-9.64517311574652e-05,2.14067067960677e-05,0.199964435842244,8.3800050232341e-05,-0.000188049274069124,4.90366670879982e-05,0.199964460249542,0.000211635471072234
|
||||||
|
0.356,0.559776194766714,-0.292898516549248,0.0663353008207213,-9.62843464957785e-05,2.10309732684433e-05,0.199964534261937,8.35846530877759e-05,-0.000187683969060658,4.93827851874573e-05,0.199964558548685,0.000211306237359517
|
||||||
|
0.358,0.55977600236519,-0.29289847486267,0.066735229988011,-9.61173925451141e-05,2.06559709198251e-05,0.199964633373385,8.33694710489218e-05,-0.000187318095062893,4.97284071560022e-05,0.199964657540713,0.000210977373002986
|
||||||
|
0.36,0.559775810297144,-0.292898433925364,0.0671351593542148,-9.59508686115828e-05,2.02817008881917e-05,0.199964733175566,8.31545388102483e-05,-0.000186951659014722,5.00735321262713e-05,0.199964757224596,0.000210648899243986
|
||||||
|
0.362,0.559775618561716,-0.292898393735866,0.0675350889207132,-9.57847743898731e-05,1.99081642837662e-05,0.199964833667514,8.29397384105589e-05,-0.000186584626221675,5.04181765781375e-05,0.199964857599365,0.000210320744291566
|
||||||
|
0.364,0.559775427158046,-0.292898354292707,0.0679350186888849,-9.56191096579405e-05,1.9535362383305e-05,0.199964934848272,8.27251531165806e-05,-0.00018621697586707,5.07622980108757e-05,0.199964958664057,0.000209992914067556
|
||||||
|
0.366,0.559775236085277,-0.292898315594417,0.0683349486601063,-9.54538737774068e-05,1.91632963802979e-05,0.199965036716706,8.25108106838889e-05,-0.000185848735706484,5.11058799446129e-05,0.199965060417533,0.000209665441616696
|
||||||
|
0.368,0.559775045342551,-0.292898277639522,0.0687348788357517,-9.5289066415205e-05,1.8791967440479e-05,0.199965139271792,8.22966417235448e-05,-0.000185479871045446,5.14489596759037e-05,0.199965162858762,0.00020933827947545
|
||||||
|
0.37,0.559774854929012,-0.292898240426547,0.0691348092171935,-9.51246872105126e-05,1.84213768961161e-05,0.199965242512544,8.20826878689118e-05,-0.000185110357597828,5.17915189901518e-05,0.199965265986756,0.000209011419728895
|
||||||
|
0.372,0.559774664843802,-0.292898203954014,0.0695347398058019,-9.49607356637293e-05,1.80515260100877e-05,0.199965346437868,8.18689074866263e-05,-0.000184740216180312,5.21335448769311e-05,0.199965369800412,0.000208684862864649
|
||||||
|
0.374,0.559774475086069,-0.292898168220443,0.069934670602945,-9.47972115805661e-05,1.76824160313948e-05,0.199965451046724,8.16553005766884e-05,-0.000184369425976216,5.24750338667945e-05,0.199965474298687,0.000208358591198899
|
||||||
|
0.376,0.559774285654956,-0.29289813322435,0.0703346016099888,-9.46341144614226e-05,1.73140483061829e-05,0.199965556338003,8.1441950405825e-05,-0.00018399796269941,5.28159755514012e-05,0.199965579480467,0.00020803261483932
|
||||||
|
0.378,0.559774096549611,-0.29289809896425,0.070734532828297,-9.44714437789428e-05,1.69464241805972e-05,0.199965662310626,8.12287598295213e-05,-0.000183625833288791,5.31563699307513e-05,0.199965685344667,0.000207706903444878
|
||||||
|
0.38,0.559773907769181,-0.292898065438653,0.0711344642592313,-9.43091994221045e-05,1.65795449730277e-05,0.199965768963483,8.10157288477775e-05,-0.000183253003049888,5.34962048617804e-05,0.199965791890172,0.00020738142487251
|
||||||
|
0.382,0.559773719312813,-0.29289803264607,0.0715343959041509,-9.41473808635517e-05,1.62134121683977e-05,0.199965876295446,8.08029615440019e-05,-0.000182879475452147,5.38354864160206e-05,0.199965899115848,0.00020705622601985
|
||||||
|
0.384,0.559773531179658,-0.292898000585005,0.0719343277644131,-9.39859875759285e-05,1.58480270712191e-05,0.199965984305429,8.0590367712574e-05,-0.000182505281720591,5.41742137261103e-05,0.199966007020605,0.000206731300621851
|
||||||
|
0.386,0.559773343368863,-0.292897969253961,0.0723342598413726,-9.38250193927014e-05,1.54833910415153e-05,0.199966092992301,8.03779057201303e-05,-0.000182130335119046,5.45123685774528e-05,0.199966115603307,0.000206406552770144
|
||||||
|
0.388,0.55977315587958,-0.29289793865144,0.0727341921363823,-9.3664475953048e-05,1.51195057307429e-05,0.199966202354903,8.01656727111854e-05,-0.000181754642586407,5.48499457658779e-05,0.199966224862789,0.000206082026711378
|
||||||
|
0.39,0.559772968710959,-0.292897908775939,0.0731341246507922,-9.35043567018567e-05,1.47563724711697e-05,0.199966312392084,7.99536617468454e-05,-0.000181378249225483,5.51869348830447e-05,0.199966334797894,0.000205757758299938
|
||||||
|
0.392,0.559772781862153,-0.292897879625951,0.0735340573859506,-9.33446613060606e-05,1.4393992733841e-05,0.199966423102642,7.97418103770652e-05,-0.000181001089116783,5.55233333268678e-05,0.199966445407418,0.000205433666002921
|
||||||
|
0.394,0.559772595332314,-0.292897851199968,0.0739339903432028,-9.31853894603484e-05,1.40323681147025e-05,0.199966534485417,7.95301255407387e-05,-0.000180623165729754,5.58591402299857e-05,0.199966556690192,0.000205109756993657
|
||||||
|
0.396,0.559772409120595,-0.292897823496478,0.0743339235238923,-9.30265408038976e-05,1.3671500070922e-05,0.199966646539203,7.93186488712293e-05,-0.000180244475594948,5.61943477861426e-05,0.199966668645007,0.000204786043871073
|
||||||
|
0.398,0.559772223226151,-0.292897796513967,0.0747338569293596,-9.28681148648635e-05,1.33113902123227e-05,0.199966759262808,7.91073734296432e-05,-0.000179864997895684,5.65289638015942e-05,0.199966781270664,0.000204462509393369
|
||||||
|
0.4,0.559772037648136,-0.292897770250917,0.0751337905609435,-9.27101113101791e-05,1.29520400793392e-05,0.199966872655058,7.88962506437229e-05,-0.000179484749979197,5.68629770006379e-05,0.199966894565987,0.000204139148607285
|
||||||
|
0.402,0.559771852385706,-0.292897744705807,0.0755337244199799,-9.25525298622886e-05,1.25934512124059e-05,0.199966986714716,7.86853429635136e-05,-0.000179103683273229,5.71963683013154e-05,0.19996700852973,0.00020381593928391
|
||||||
|
0.404,0.559771667438016,-0.292897719877112,0.0759336585078024,-9.2395369938325e-05,1.22356253462463e-05,0.199967101440532,7.84746434501215e-05,-0.000178721780430546,5.7529127295286e-05,0.199967123160641,0.000203492862165348
|
||||||
|
0.406,0.559771482804226,-0.292897695763306,0.076333592825742,-9.22386312884881e-05,1.18785640906838e-05,0.199967216831225,7.82640688368196e-05,-0.00017833907267617,5.78612583193582e-05,0.199967238457432,0.00020316991541119
|
||||||
|
0.408,0.559771298483491,-0.292897672362856,0.0767335273751273,-9.20823136629777e-05,1.15222690555416e-05,0.199967332885565,7.80536885125471e-05,-0.000177955528785079,5.81927700471496e-05,0.199967354418869,0.000202847102521458
|
||||||
|
0.41,0.559771114474971,-0.292897649674229,0.0771334621572843,-9.19264165344379e-05,1.11667419755434e-05,0.199967449602305,7.78435371717733e-05,-0.000177571152226719,5.8523659009213e-05,0.199967471043699,0.000202524440614866
|
||||||
|
0.412,0.559770930777825,-0.292897627695888,0.0775333971735365,-9.17709395142906e-05,1.08119844466348e-05,0.199967566980201,7.76335384866655e-05,-0.000177185911776067,5.88538991846965e-05,0.199967588330673,0.000202201867150428
|
||||||
|
0.414,0.559770747391213,-0.292897606426292,0.0779333324252051,-9.16158823804913e-05,1.04579983284392e-05,0.199967685017902,7.74237132739052e-05,-0.000176799783146996,5.91834740937269e-05,0.199967706278435,0.00020187936572059
|
||||||
|
0.416,0.559770564314296,-0.292897585863895,0.0783332679136081,-9.1461244661195e-05,1.01047853140468e-05,0.199967803714097,7.72141239835377e-05,-0.000176412811442317,5.9512404552986e-05,0.199967824885669,0.000201557007516995
|
||||||
|
0.418,0.559770381546234,-0.29289756600715,0.0787332036400614,-9.13070258845571e-05,9.75234708266991e-06,0.19996792306752,7.700469428773e-05,-0.000176024934211982,5.9840686225665e-05,0.199967944151104,0.000201234709070374
|
||||||
|
0.42,0.559770199086192,-0.292897546854506,0.0791331396058782,-9.11532258840441e-05,9.40068557719886e-06,0.199968043076842,7.67954033698003e-05,-0.000175636141047652,6.0168306101338e-05,0.199968064073405,0.000200912451281511
|
||||||
|
0.422,0.559770016933331,-0.292897528404408,0.0795330758123688,-9.09998442710779e-05,9.0498025184793e-06,0.199968163740745,7.65863206186878e-05,-0.000175246459704903,6.04952485674936e-05,0.199968184651249,0.000200590282028451
|
||||||
|
0.424,0.559769835086815,-0.292897510655296,0.0799330122608412,-9.08468806015693e-05,8.69969973837924e-06,0.199968285057837,7.63774460343924e-05,-0.000174855841611476,6.08215049505145e-05,0.199968305883239,0.000200268157910436
|
||||||
|
0.426,0.559769653545809,-0.292897493605609,0.0803329489526002,-9.06943344869403e-05,8.3503791520334e-06,0.199968407026765,7.61687588002324e-05,-0.00017446430064516,6.11471030059762e-05,0.199968427768018,0.000199946093292158
|
||||||
|
0.428,0.559769472309477,-0.29289747725378,0.0807328858889482,-9.05422055663684e-05,8.0018425357986e-06,0.199968529646249,7.59602380995261e-05,-0.000174071840275403,6.1472012376218e-05,0.199968550304299,0.000199624075839023
|
||||||
|
0.43,0.559769291376986,-0.292897461598239,0.0811328230711852,-9.03904935345422e-05,7.65409179093179e-06,0.199968652914814,7.57518908711673e-05,-0.000173678401521604,6.17962096424728e-05,0.199968673490604,0.000199302051298609
|
||||||
|
0.432,0.559769110747503,-0.292897446637413,0.0815327605006075,-9.02391980028837e-05,7.30712892971219e-06,0.199968776831087,7.55437379318379e-05,-0.000173283994792106,6.21197390401895e-05,0.199968797325553,0.000198980052191786
|
||||||
|
0.434,0.559768930420194,-0.292897432369723,0.0819326981785095,-9.00883185828149e-05,6.96095581176336e-06,0.19996890139377,7.53357515259622e-05,-0.000172888637434143,6.24425693443453e-05,0.199968921807844,0.000198658075290534
|
||||||
|
0.436,0.559768750394229,-0.292897418793589,0.0823326361061826,-8.99378549967799e-05,6.61557437997561e-06,0.199969026601365,7.51279594091158e-05,-0.000172492284344905,6.27646719320029e-05,0.199969046935972,0.000198336084680104
|
||||||
|
0.438,0.559768570668774,-0.292897405907426,0.082732574284915,-8.97878067451784e-05,6.27098667438374e-06,0.199969152452458,7.49203823979804e-05,-0.000172094935524391,6.30860728240145e-05,0.19996917270852,0.000198014098276261
|
||||||
|
0.44,0.559768391243002,-0.292897393709643,0.0831325127159924,-8.9638173467188e-05,5.92719463787805e-06,0.199969278945656,7.47129580425109e-05,-0.000171696590972603,6.34067650814862e-05,0.199969299124089,0.000197692092176632
|
||||||
|
0.442,0.55976821211608,-0.292897382198647,0.0835324514006976,-8.94889549130084e-05,5.58420031049333e-06,0.199969406079518,7.45057210371768e-05,-0.000171297212525623,6.37267330919066e-05,0.199969426181233,0.000197370043311757
|
||||||
|
0.444,0.559768033287182,-0.292897371372841,0.0839323903403105,-8.93401505830393e-05,5.24200578777556e-06,0.199969533852588,7.42986921986599e-05,-0.000170896810591791,6.40459707837437e-05,0.199969553878491,0.000197047968541952
|
||||||
|
0.446,0.559767854755478,-0.292897361230624,0.0843323295361079,-8.91917601442137e-05,4.90061306812617e-06,0.199969662263401,7.40918090769149e-05,-0.000170495395579451,6.436446948338e-05,0.199969682214392,0.000196725852439277
|
||||||
|
0.448,0.559767676520141,-0.292897351770389,0.0847322689893641,-8.90437833467316e-05,4.56002420545775e-06,0.199969791310466,7.38851202441992e-05,-0.000170092929324683,6.46822300581772e-05,0.19996981118744,0.00019640368246306
|
||||||
|
0.45,0.559767498580345,-0.292897342990527,0.0851322087013498,-8.88962196632369e-05,4.22024135082743e-06,0.199969920992322,7.36786395783006e-05,-0.000169689397949701,6.49992611817529e-05,0.19996994079617,0.000196081456698013
|
||||||
|
0.452,0.559767320935263,-0.292897334889424,0.0855321486733334,-8.87490687884184e-05,3.88126661365895e-06,0.199970051307511,7.34723254458557e-05,-0.000169284794515611,6.53155472415956e-05,0.199970071039118,0.00019575915041725
|
||||||
|
0.454,0.55976714358407,-0.292897327465461,0.0859320889065799,-8.86023303614535e-05,3.54310217276499e-06,0.199970182254511,7.32662264191219e-05,-0.000168879115552967,6.56310656863001e-05,0.199970201914757,0.00019543677337382
|
||||||
|
0.456,0.559766966525941,-0.292897320717015,0.0863320294023514,-8.84560038827419e-05,3.20575015144708e-06,0.199970313831774,7.30602939258417e-05,-0.000168472361061766,6.59458234547605e-05,0.199970333421534,0.000195114311677496
|
||||||
|
0.458,0.559766789760054,-0.29289731464246,0.086731970161907,-8.83100891857501e-05,2.86921272851792e-06,0.199970446037804,7.28545349049092e-05,-0.000168064492878095,6.62598370268496e-05,0.199970465557949,0.000194791742703346
|
||||||
|
0.46,0.559766613285585,-0.292897309240164,0.0871319111865026,-8.81645857431223e-05,2.5334921799347e-06,0.199970578871122,7.26489979285815e-05,-0.000167655517940845,6.65730760449068e-05,0.199970598322514,0.000194469082504446
|
||||||
|
0.462,0.559766437101711,-0.292897304508491,0.0875318524773914,-8.80194931940358e-05,2.19859065675454e-06,0.199970712330109,7.24436205468137e-05,-0.000167245432780571,6.68855240290588e-05,0.199970731713609,0.000194146301197147
|
||||||
|
0.464,0.559766261207612,-0.292897300445802,0.0879317940358231,-8.7874811260935e-05,1.86451044881242e-06,0.199970846413218,7.22384305151812e-05,-0.000166834216580591,6.71972043980728e-05,0.19997086572968,0.000193823401436134
|
||||||
|
0.466,0.559766085602466,-0.29289729705045,0.0883317358630443,-8.77305394719751e-05,1.53125379043217e-06,0.199970981118926,7.20334625281537e-05,-0.000166421858932564,6.75081136825017e-05,0.199971000369199,0.000193500388287297
|
||||||
|
0.468,0.559765910285454,-0.292897294320786,0.0887316779602988,-8.75866774108224e-05,1.19882301308216e-06,0.199971116445673,7.18286749523677e-05,-0.000166008339019807,6.78182275962169e-05,0.1999711356306,0.000193177222166125
|
||||||
|
0.47,0.559765735255756,-0.292897292255158,0.089131620328827,-8.74432247721656e-05,8.67220434352944e-07,0.199971252391837,7.16240539100354e-05,-0.000165593681128451,6.81275426697713e-05,0.199971271512258,0.000192853919841937
|
||||||
|
0.472,0.559765560512555,-0.292897290851905,0.0895315629698661,-8.73001811951823e-05,5.36448288568358e-07,0.199971388955843,7.14196479734141e-05,-0.00016517784362513,6.84360623726121e-05,0.199971408012592,0.00019253046713277
|
||||||
|
0.474,0.559765386055032,-0.292897290109364,0.0899315058846504,-8.7157546180272e-05,2.06509059852422e-07,0.199971526136086,7.12154363258221e-05,-0.000164760819570952,6.8743773694313e-05,0.199971545129991,0.000192206848105118
|
||||||
|
0.476,0.55976521188237,-0.292897290025868,0.0903314490744105,-8.7015319449879e-05,-1.22594989715452e-07,0.199971663930938,7.10113842727899e-05,-0.000164342626313152,6.9050683573768e-05,0.199971682862822,0.000191883069659224
|
||||||
|
0.478,0.559765037993754,-0.292897290599744,0.0907313925403741,-8.68735006431808e-05,-4.50861445400185e-07,0.19997180233882,7.08075612032565e-05,-0.000163923215279471,6.93567668574868e-05,0.199971821209501,0.00019155910925883
|
||||||
|
0.48,0.559764864388367,-0.292897291829314,0.0911313362837657,-8.6732089205066e-05,-7.78287850833336e-07,0.199971941358005,7.06039463005403e-05,-0.000163502603817145,6.966203395381e-05,0.199971960168296,0.000191234980227932
|
||||||
|
0.482,0.559764691065397,-0.292897293712896,0.0915312803058062,-8.65910848579786e-05,-1.10487186066876e-06,0.199972080986956,7.04005048701716e-05,-0.000163080767640044,6.996651088359e-05,0.199972099737665,0.000190910661057115
|
||||||
|
0.484,0.559764518024028,-0.292897296248802,0.0919312246077136,-8.64504871855853e-05,-1.43061092139351e-06,0.199972221224049,7.01972646677262e-05,-0.000162657692870382,7.02701377988667e-05,0.199972239915978,0.000190586130877927
|
||||||
|
0.486,0.559764345263448,-0.292897299435339,0.0923311691907023,-8.63102957993077e-05,-1.75550263215029e-06,0.199972362067507,6.99942118154161e-05,-0.000162233382977605,7.0572919036449e-05,0.199972380701454,0.000190261391620436
|
||||||
|
0.488,0.559764172782845,-0.292897303270812,0.0927311140559836,-8.61705103383236e-05,-2.07954445330394e-06,0.199972503515725,6.97913671299232e-05,-0.000161807813675585,7.08748745456566e-05,0.199972522092482,0.000189936440248308
|
||||||
|
0.49,0.559764000581407,-0.292897307753517,0.0931310592047652,-8.6031130330788e-05,-2.40273388685263e-06,0.199972645567006,6.95887167334596e-05,-0.000161381016189343,7.11759783056375e-05,0.199972664087359,0.00018961129125313
|
||||||
|
0.492,0.559763828658324,-0.292897312881748,0.0935310046382516,-8.58921554713898e-05,-2.72506851806131e-06,0.199972788219638,6.93862675649192e-05,-0.000160952952354964,7.14762433268178e-05,0.199972806684371,0.000189285922240626
|
||||||
|
0.494,0.559763657012785,-0.292897318653791,0.0939309503576438,-8.57535852605284e-05,-3.04654569627249e-06,0.199972931471979,6.91840404409837e-05,-0.000160523559722403,7.17756574661332e-05,0.199972949881867,0.000188960285992552
|
||||||
|
0.496,0.559763485643982,-0.29289732506793,0.0943308963641395,-8.56154193096258e-05,-3.36716275695092e-06,0.199973075322268,6.89819937279916e-05,-0.000160092890333376,7.20742162133025e-05,0.199973093678083,0.000188634412652477
|
||||||
|
0.498,0.559763314551108,-0.292897332122442,0.0947308426589329,-8.54776572856164e-05,-3.686917257606e-06,0.199973219768844,6.87801551821157e-05,-0.000159660954596202,7.23719147111011e-05,0.199973238071352,0.000188308322196331
|
||||||
|
0.5,0.559763143733353,-0.2928973398156,0.0951307892432149,-8.53402986888974e-05,-4.00580657533572e-06,0.199973364809927,6.85785386814401e-05,-0.000159227690060815,7.26687323163176e-05,0.199973383059889,0.000187981961651232
|
||||||
|
0.502,0.559762973189913,-0.292897348145669,0.0955307361181726,-8.52033431308906e-05,-4.32382801784925e-06,0.199973510443773,6.83771164691965e-05,-0.00015879310713561,7.29646865496591e-05,0.199973528641945,0.000187655339422339
|
||||||
|
0.504,0.559762802919981,-0.292897357110912,0.09593068328499,-8.50667902230206e-05,-4.64097900387816e-06,0.199973656668673,6.81758885456851e-05,-0.000158357205820581,7.32597697783443e-05,0.199973674815806,0.000187328455612786
|
||||||
|
0.506,0.559762632922752,-0.292897366709585,0.0963306307448473,-8.49306395767079e-05,-4.95725684113157e-06,0.199973803482852,6.79748757281828e-05,-0.000157919951421226,7.35539745430613e-05,0.199973821579692,0.000187001288653917
|
||||||
|
0.508,0.559762463197423,-0.292897376939939,0.0967305784989214,-8.47948907201078e-05,-5.27265880956306e-06,0.199973950884571,6.77740918941793e-05,-0.000157481350876454,7.38472937314438e-05,0.199973968931857,0.000186673849795335
|
||||||
|
0.51,0.559762293743189,-0.29289738780022,0.0971305265483856,-8.46595432091312e-05,-5.58718224463738e-06,0.199974098872027,6.75735023492052e-05,-0.000157041411125158,7.41397169351509e-05,0.199974116870494,0.000186346131312521
|
||||||
|
0.512,0.55976212455925,-0.292897399288668,0.0975304748944095,-8.4524596710711e-05,-5.9008244540637e-06,0.199974247443439,6.73731070932603e-05,-0.000156600100942316,7.44312346132036e-05,0.199974265393818,0.00018601810627084
|
||||||
|
0.514,0.559761955644802,-0.292897411403518,0.0979304235381593,-8.43900507807581e-05,-6.21358264840665e-06,0.199974396596966,6.7172961637496e-05,-0.000156157406450141,7.47218606433896e-05,0.19997441449998,0.000185689791917588
|
||||||
|
0.516,0.559761786999047,-0.292897424142999,0.0983303724807974,-8.4255904864161e-05,-6.52545407986426e-06,0.199974546330882,6.69730382263367e-05,-0.000155713331118079,7.50116054340499e-05,0.199974564187251,0.000185361188728786
|
||||||
|
0.518,0.559761618621183,-0.292897437505334,0.0987303217234828,-8.41221586278528e-05,-6.83643597287897e-06,0.199974696643387,6.67732952264188e-05,-0.000155267868007236,7.53004290865444e-05,0.199974714453826,0.000185032263163819
|
||||||
|
0.52,0.559761450510412,-0.292897451488742,0.0991302712673709,-8.39888116832554e-05,-7.14652555189321e-06,0.199974847532598,6.65737742711024e-05,-0.00015482099630093,7.55883359376818e-05,0.199974865297815,0.00018470301796706
|
||||||
|
0.522,0.559761282665936,-0.292897466091436,0.0995302211136132,-8.38558635307684e-05,-7.45571995808269e-06,0.199974998996731,6.63744822992883e-05,-0.000154372712529715,7.58753355284413e-05,0.199975016717429,0.000184373460172103
|
||||||
|
0.524,0.559761115086958,-0.292897481311622,0.0999301712633578,-8.37233137540582e-05,-7.76401640201207e-06,0.19997515103394,6.61754123720825e-05,-0.00015392300628525,7.61613931643534e-05,0.199975168710819,0.0001840435678725
|
||||||
|
0.526,0.559760947772681,-0.292897497147502,0.100330121717749,-8.35911618812801e-05,-8.07141198322369e-06,0.199975303642304,6.59765506116904e-05,-0.000153471853281406,7.64465279273762e-05,0.199975321276055,0.000183713327258524
|
||||||
|
0.528,0.55976078072231,-0.29289751359727,0.100730072477927,-8.34594075516115e-05,-8.37790381513769e-06,0.199975456820052,6.5777931712585e-05,-0.000153019288212652,7.67307545626594e-05,0.199975474411365,0.000183382789708433
|
||||||
|
0.53,0.559760613935051,-0.292897530659117,0.101130023545029,-8.33280501544297e-05,-8.6834891360743e-06,0.199975610565322,6.55795487358723e-05,-0.000152565279853966,7.70140323042012e-05,0.199975628114879,0.000183051913404565
|
||||||
|
0.532,0.55976044741011,-0.292897548331227,0.101529974920188,-8.3197089356668e-05,-8.98816493455356e-06,0.199975764876181,6.53813392315072e-05,-0.000152109786571985,7.72963741624277e-05,0.199975782384659,0.000182720650582627
|
||||||
|
0.534,0.559760281146694,-0.292897566611777,0.101929926604534,-8.30665247975037e-05,-9.29192828236224e-06,0.199975919750819,6.51833795273226e-05,-0.000151652836122285,7.75777792699772e-05,0.19997593721889,0.00018238905533775
|
||||||
|
0.536,0.559760115144011,-0.29289758549894,0.102329878599192,-8.29363558385587e-05,-9.5947762790427e-06,0.199976075187298,6.49856904400003e-05,-0.000151194414627076,7.78582207386357e-05,0.199976092615629,0.000182057116073429
|
||||||
|
0.538,0.55975994940127,-0.292897604990882,0.102729830905283,-8.28065820357437e-05,-9.89670594087055e-06,0.199976231183702,6.47881956417073e-05,-0.000150734515147466,7.81377081093825e-05,0.199976248572954,0.000181724807827211
|
||||||
|
0.54,0.559759783917682,-0.292897625085764,0.103129783523926,-8.26772030559918e-05,-1.01977143396326e-05,0.199976387738131,6.45909228880192e-05,-0.000150273113397325,7.84162561273671e-05,0.199976405088962,0.000181392130906179
|
||||||
|
0.542,0.559759618692458,-0.292897645781739,0.103529736456236,-8.25482183441916e-05,-1.04977983944598e-05,0.199976544848726,6.43939207511934e-05,-0.000149810195498867,7.86938431085459e-05,0.199976562161786,0.000181059086069471
|
||||||
|
0.544,0.559759453724809,-0.292897667076957,0.103929689703321,-8.24196273729871e-05,-1.0796955121628e-05,0.199976702513503,6.41971198422908e-05,-0.00014934578573822,7.89704465015139e-05,0.199976719789438,0.000180725663187219
|
||||||
|
0.546,0.559759289013948,-0.29289768896956,0.10432964326629,-8.22914298648225e-05,-1.10951815374127e-05,0.199976860730512,6.40005340390992e-05,-0.000148879870237595,7.92460966639318e-05,0.199976877969962,0.000180391873308423
|
||||||
|
0.548,0.55975912455909,-0.292897711457683,0.104729597146243,-8.21636252368307e-05,-1.13924746025784e-05,0.19997701949789,6.38042396694515e-05,-0.000148412414302523,7.95207823200971e-05,0.19997703670149,0.000180057714468725
|
||||||
|
0.55,0.559758960359447,-0.292897734539458,0.105129551344281,-8.20362129061446e-05,-1.16888311946228e-05,0.199977178813641,6.36081742833027e-05,-0.000147943417933005,7.9794469642902e-05,0.199977195982022,0.000179723154131422
|
||||||
|
0.552,0.559758796414238,-0.292897758213008,0.105529505861498,-8.19091925396975e-05,-1.19842482743104e-05,0.199977338675768,6.3412324002865e-05,-0.000147472891537381,8.00671820511133e-05,0.199977355809554,0.000179388210915452
|
||||||
|
0.554,0.559758632722677,-0.292897782476451,0.105929460698984,-8.17825636101332e-05,-1.22787227607723e-05,0.19997749908237,6.32167374003955e-05,-0.000147000786543394,8.03389160752842e-05,0.199977516182179,0.000179052865288659
|
||||||
|
0.556,0.559758469283984,-0.292897807327899,0.106329415857827,-8.16563255900959e-05,-1.2572251420484e-05,0.199977660031433,6.30214075370005e-05,-0.000146527123767725,8.06096422251156e-05,0.199977677097881,0.000178717123486386
|
||||||
|
0.558,0.559758306097375,-0.292897832765457,0.10672937133911,-8.15304779799852e-05,-1.28648312558432e-05,0.199977821520938,6.28263066571044e-05,-0.000146051930965951,8.08793865214596e-05,0.199977838554633,0.000178381014996392
|
||||||
|
0.56,0.559758143162072,-0.292897858787224,0.107129327143911,-8.14050203634675e-05,-1.31564591443478e-05,0.199977983548979,6.2631434760707e-05,-0.00014557515262692,8.11481359538901e-05,0.199978000550524,0.000178044493459716
|
||||||
|
0.562,0.559757980477294,-0.292897885391294,0.107529283273306,-8.12799522409424e-05,-1.34471318663509e-05,0.199978146113482,6.24368404200659e-05,-0.000145096771403397,8.1415880981428e-05,0.199978163083476,0.000177707562555206
|
||||||
|
0.564,0.559757818042263,-0.292897912575752,0.107929239728365,-8.11552730017872e-05,-1.37368462299614e-05,0.199978309212503,6.22425028184991e-05,-0.000144616794234276,8.16826294103289e-05,0.199978326151537,0.000177370229404753
|
||||||
|
0.566,0.559757655856202,-0.292897940338678,0.108329196510156,-8.10309822296684e-05,-1.4025599043288e-05,0.199978472844,6.20483942004312e-05,-0.000144135224589003,8.19483474134852e-05,0.199978489752663,0.000177032476777499
|
||||||
|
0.568,0.559757493918334,-0.292897968678148,0.108729153619741,-8.09070794249855e-05,-1.43133871283174e-05,0.199978637005892,6.18545492603317e-05,-0.000143652048589792,8.22130427971523e-05,0.199978653884766,0.000176694314379975
|
||||||
|
0.57,0.559757332227884,-0.292897997592227,0.10912911105818,-8.0783564032627e-05,-1.46002072376472e-05,0.199978801696171,6.16609679982005e-05,-0.000143167245419962,8.2476723367586e-05,0.199978818545832,0.000176355734335654
|
||||||
|
0.572,0.559757170784078,-0.292898027078977,0.109529068826526,-8.06604355529927e-05,-1.48860561099973e-05,0.199978966912786,6.14676573529315e-05,-0.000142680846304532,8.27394038699358e-05,0.199978983733805,0.000176016776914553
|
||||||
|
0.574,0.559757009586142,-0.292898057136451,0.109929026925831,-8.05376934032153e-05,-1.51709306228653e-05,0.199979132653787,6.12745965078431e-05,-0.000142192813079589,8.30010738958608e-05,0.199979149446731,0.000175677404741054
|
||||||
|
0.576,0.559756848633304,-0.292898087762699,0.110328985357141,-8.04153371669613e-05,-1.54548273623156e-05,0.199979298917081,6.10817646462535e-05,-0.000141703111050662,8.3261684005742e-05,0.199979315682511,0.000175337564934638
|
||||||
|
0.578,0.559756687924793,-0.292898118955761,0.110728944121499,-8.02933663446303e-05,-1.5737743067068e-05,0.199979465700523,6.08892242182079e-05,-0.000141211788790008,8.35212489447289e-05,0.199979482438994,0.000174997331249526
|
||||||
|
0.58,0.559756527459839,-0.292898150713672,0.111128903219943,-8.01717802700885e-05,-1.60196745174756e-05,0.199979633002077,6.06969752237063e-05,-0.000140718801194817,8.37797869274181e-05,0.199979649714139,0.000174656681832151
|
||||||
|
0.582,0.559756367237672,-0.292898183034459,0.111528862653507,-8.00505784437355e-05,-1.63006182718472e-05,0.19997980081967,6.05049690904912e-05,-0.000140224144795642,8.40372849433834e-05,0.199979817505868,0.00017431559691825
|
||||||
|
0.584,0.559756207257525,-0.292898215916145,0.111928822423222,-7.99297603937265e-05,-1.65805710966582e-05,0.199979969151217,6.03132266352446e-05,-0.000139727847348059,8.42937403905396e-05,0.19997998581209,0.000173974111007082
|
||||||
|
0.586,0.55975604751863,-0.292898249356743,0.112328782530112,-7.98093255371945e-05,-1.68595296612395e-05,0.199980137994632,6.01217756135419e-05,-0.000139229874157598,8.45491489320781e-05,0.199980154630714,0.00017363220998998
|
||||||
|
0.588,0.559755888020223,-0.292898283354263,0.1127287429752,-7.96892732912723e-05,-1.71374905932886e-05,0.199980307347813,5.99305743920197e-05,-0.000138730211346471,8.48034906186789e-05,0.199980323959632,0.000173289864990155
|
||||||
|
0.59,0.559755728761537,-0.292898317906706,0.113128703759503,-7.95696032396264e-05,-1.74144505066254e-05,0.199980477208594,5.97396368484659e-05,-0.000138228858914679,8.50567758586828e-05,0.199980493796675,0.000172947092392775
|
||||||
|
0.592,0.55975556974181,-0.292898353012065,0.113528664884035,-7.94503147438785e-05,-1.76904060289473e-05,0.199980647574916,5.95490115551378e-05,-0.000137725806453881,8.53090176625159e-05,0.199980664139776,0.000172603913730568
|
||||||
|
0.594,0.559755410960278,-0.29289838866833,0.113928626349803,-7.93314071934059e-05,-1.79653537324409e-05,0.199980818444665,5.93586707564597e-05,-0.000137221043555735,8.55601856725174e-05,0.199980834986816,0.000172260302916297
|
||||||
|
0.596,0.559755252416181,-0.29289842487348,0.114328588157813,-7.92128800608526e-05,-1.82392902031703e-05,0.199980989815659,5.9168586696856e-05,-0.000136714591036924,8.58102781539637e-05,0.199981006335608,0.000171916272909103
|
||||||
|
0.598,0.559755094108758,-0.292898461625491,0.114728550309066,-7.90947328466184e-05,-1.85122120965886e-05,0.199981161685778,5.89787871319025e-05,-0.000136206428080765,8.60593037804724e-05,0.199981178184028,0.000171571827959168
|
||||||
|
0.6,0.55975493603725,-0.292898498922329,0.115128512804556,-7.8976964912325e-05,-1.87841159154933e-05,0.199981334052874,5.8789272061599e-05,-0.000135696537340024,8.63072400006381e-05,0.199981350529921,0.000171226950075428
|
||||||
|
0.602,0.559754778200898,-0.292898536761954,0.115528475645277,-7.8859575758372e-05,-1.90549982459487e-05,0.199981506914738,5.86000414859455e-05,-0.000135184932692489,8.65541032943339e-05,0.199981523371073,0.000170881665740692
|
||||||
|
0.604,0.559754620598947,-0.292898575142322,0.115928438832215,-7.87425647463812e-05,-1.93248556462633e-05,0.199981680269287,5.84111231605177e-05,-0.00013467157944369,8.67999066719859e-05,0.199981696705396,0.000170535971035429
|
||||||
|
0.606,0.559754463230639,-0.292898614061377,0.116328402366354,-7.862593126573e-05,-1.95936845637234e-05,0.199981854114364,5.82224754519522e-05,-0.00013415646371584,8.70445980918898e-05,0.199981870530727,0.000170189821850401
|
||||||
|
0.608,0.559754306095221,-0.29289865351706,0.116728366248673,-7.85096748445734e-05,-1.98614815011266e-05,0.199982028447679,5.80341261158245e-05,-0.00013363961673396,8.72881905644717e-05,0.199982044844771,0.00016984326647485
|
||||||
|
0.61,0.55975414919194,-0.292898693507303,0.117128330480145,-7.83937947612667e-05,-2.01282430306593e-05,0.199982203267127,5.78460612743469e-05,-0.000133121045436946,8.75306979675194e-05,0.199982219645416,0.000169496320402131
|
||||||
|
0.612,0.559753992520042,-0.292898734030032,0.117528295061741,-7.8278290599476e-05,-2.03939656828744e-05,0.199982378570471,5.76582809275194e-05,-0.00013260071166088,8.77721046885215e-05,0.199982394930424,0.000169148953452102
|
||||||
|
0.614,0.559753836078777,-0.292898775083166,0.117928259994427,-7.81631616375566e-05,-2.06586458773028e-05,0.199982554355545,5.74708405864932e-05,-0.00013207859458908,8.80124315441599e-05,0.199982570697619,0.000168801187118634
|
||||||
|
0.616,0.559753679867396,-0.292898816664615,0.118328225279163,-7.80484072371301e-05,-2.09222800612307e-05,0.199982730620197,5.72836708623292e-05,-0.00013155470116044,8.82516386357945e-05,0.199982746944846,0.000168452990673301
|
||||||
|
0.618,0.559753523885149,-0.292898858772286,0.118728190916908,-7.79340269541073e-05,-2.11848646819446e-05,0.1999829073621,5.7096799510603e-05,-0.000131029041783303,8.84897120856375e-05,0.19998292366977,0.000168104382602012
|
||||||
|
0.62,0.559753368131288,-0.292898901404074,0.119128156908612,-7.78200200390877e-05,-2.1446396228364e-05,0.199983084579046,5.69102542868904e-05,-0.000130501630335455,8.87266995985846e-05,0.199983100870182,0.000167755416558953
|
||||||
|
0.622,0.559753212605068,-0.292898944557871,0.119528123255224,-7.77063859369597e-05,-2.17068712032864e-05,0.199983262268898,5.67239866189339e-05,-0.000129972425183533,8.89625725516984e-05,0.199983278543936,0.00016740603717026
|
||||||
|
0.624,0.559753057305744,-0.292898988231559,0.119928089957687,-7.75931240926119e-05,-2.19662859290981e-05,0.199983440429336,5.6538038140097e-05,-0.000129441402041408,8.91973057914885e-05,0.199983456688708,0.000167056235081594
|
||||||
|
0.626,0.559752902232572,-0.292899032423015,0.120328057016941,-7.74802337843993e-05,-2.2224636811452e-05,0.199983619058121,5.63524227281675e-05,-0.000128908599072996,8.94309331450626e-05,0.199983635302254,0.000166706071471597
|
||||||
|
0.628,0.559752747384809,-0.292899077130106,0.12072802443392,-7.73677144016992e-05,-2.24819203253901e-05,0.199983798153069,5.61671056886758e-05,-0.000128374005869958,8.96634329283773e-05,0.199983814382383,0.000166355523951098
|
||||||
|
0.63,0.559752592761714,-0.292899122350696,0.121127992209554,-7.72555653616446e-05,-2.27381328349318e-05,0.199983977711853,5.5982093960516e-05,-0.000127837591207269,8.98947886615597e-05,0.199983993926764,0.000166004571016546
|
||||||
|
0.632,0.559752438362548,-0.292899168082638,0.121527960344767,-7.71437860258572e-05,-2.29932706902191e-05,0.199984157732223,5.57973944825818e-05,-0.000127299365493272,9.01250133550357e-05,0.199984173933141,0.000165653239383599
|
||||||
|
0.634,0.55975228418657,-0.292899214323779,0.121927928840482,-7.70323757837143e-05,-2.32473302969049e-05,0.199984338211907,5.56130141937671e-05,-0.000126759339136306,9.03540966004645e-05,0.199984354399237,0.000165301543182377
|
||||||
|
0.636,0.559752130233045,-0.292899261071959,0.122327897697615,-7.69213339690821e-05,-2.35003080467644e-05,0.19998451914861,5.54289669718599e-05,-0.000126217498258585,9.05820479388252e-05,0.199984535322751,0.000164949491223875
|
||||||
|
0.638,0.559751976501234,-0.292899308325011,0.122727866917077,-7.68106599158268e-05,-2.37522002899393e-05,0.199984700540098,5.52452389390722e-05,-0.000125673835921214,9.0808860431224e-05,0.199984716701445,0.000164597079540935
|
||||||
|
0.64,0.559751822990405,-0.29289935608076,0.123127836499775,-7.67003530133258e-05,-2.40030033904492e-05,0.199984882384051,5.50618300954042e-05,-0.000125128331307511,9.10345149957025e-05,0.199984898532992,0.000164244291680899
|
||||||
|
0.642,0.559751669699822,-0.292899404337024,0.123527806446613,-7.65904125954452e-05,-2.42527136151693e-05,0.199985064678158,5.48787543186435e-05,-0.000124580994825818,9.12590272447721e-05,0.199985080815076,0.000163891159008101
|
||||||
|
0.644,0.559751516628755,-0.292899453091614,0.123927776758488,-7.64808379960513e-05,-2.45013273697525e-05,0.19998524742016,5.46959769143207e-05,-0.000124031833415028,9.14823789638363e-05,0.199985263545433,0.000163537675328311
|
||||||
|
0.646,0.55975136377647,-0.292899502342334,0.124327747436294,-7.6371628687788e-05,-2.47488409488294e-05,0.199985430607674,5.4513546454693e-05,-0.000123480826258459,9.17045640813629e-05,0.199985446721674,0.000163183848079068
|
||||||
|
0.648,0.55975121114224,-0.292899552086978,0.124727718480919,-7.62627838102325e-05,-2.49952506747863e-05,0.199985614238417,5.43314837564423e-05,-0.000122927990703347,9.19255956077779e-05,0.199985630341511,0.000162829715203901
|
||||||
|
0.65,0.559751058725335,-0.292899602323337,0.125127689893247,-7.61543027527622e-05,-2.52405529116428e-05,0.199985798310057,5.41497124917356e-05,-0.000122373292055222,9.21454527263998e-05,0.199985814402607,0.000162475224048233
|
||||||
|
0.652,0.559750906525029,-0.29289965304919,0.125527661674159,-7.60461849602655e-05,-2.54847438430072e-05,0.199985982820228,5.39682742939362e-05,-0.000121816726844637,9.23641493150162e-05,0.19998599890259,0.000162120404786359
|
||||||
|
0.654,0.559750754540595,-0.292899704262312,0.125927633824528,-7.59384296555864e-05,-2.57278198190214e-05,0.199986167766654,5.3787183040832e-05,-0.000121258340174402,9.25816680263924e-05,0.199986183839179,0.000161765297192779
|
||||||
|
0.656,0.55975060277131,-0.292899755960469,0.126327606345226,-7.58310362281022e-05,-2.59697772037048e-05,0.1999863531469,5.36064317935291e-05,-0.000120698107758388,9.27980071258049e-05,0.199986369209934,0.000161409890876026
|
||||||
|
0.658,0.55975045121645,-0.292899808141421,0.126727579237116,-7.57240039284123e-05,-2.62106122500549e-05,0.199986538958682,5.34260413687093e-05,-0.000120135991432679,9.3013189164659e-05,0.199986555012565,0.000161054188683264
|
||||||
|
0.66,0.559750299875294,-0.292899860802918,0.12712755250106,-7.56173320626274e-05,-2.64503211694356e-05,0.199986725199656,5.32459840107968e-05,-0.00011957199813617,9.3227179448485e-05,0.199986741244722,0.000160698178395009
|
||||||
|
0.662,0.559750148747122,-0.292899913942705,0.127527526137915,-7.55110199923691e-05,-2.66889002425996e-05,0.1999869118674,5.30662527808978e-05,-0.000119006145216094,9.34399797120066e-05,0.199986927903978,0.000160341883461497
|
||||||
|
0.664,0.559749997831214,-0.292899967558519,0.12792750014853,-7.54050670515038e-05,-2.69263457502999e-05,0.199987098959575,5.2886868495694e-05,-0.000118438453489134,9.36515916899471e-05,0.199987114987989,0.00015998533917281
|
||||||
|
0.666,0.559749847126854,-0.292900021648088,0.128327474533753,-7.52994725183864e-05,-2.71626540565561e-05,0.199987286473767,5.27078519718671e-05,-0.00011786889866916,9.38620032392422e-05,0.199987302494335,0.000159628539381442
|
||||||
|
0.668,0.559749696633324,-0.292900076209135,0.128727449294425,-7.51942356436163e-05,-2.73978213449766e-05,0.199987474407588,5.25291962705232e-05,-0.000117297435653363,9.40712230335094e-05,0.199987490420625,0.000159271465977752
|
||||||
|
0.67,0.559749546349911,-0.292900131239374,0.129127424431383,-7.50893557333043e-05,-2.76318437991696e-05,0.199987662758659,5.23508666971928e-05,-0.000116724088727871,9.42792510727485e-05,0.199987678764471,0.000158914138188323
|
||||||
|
0.672,0.559749396275901,-0.292900186736511,0.12952739994546,-7.49848321768275e-05,-2.78647176998881e-05,0.199987851524592,5.21728840685575e-05,-0.000116148878709366,9.44860821527892e-05,0.199987867523482,0.000158556587936477
|
||||||
|
0.674,0.559749246410583,-0.292900242698245,0.129927375837482,-7.488066419703e-05,-2.8096439314007e-05,0.199988040702988,5.19952969568748e-05,-0.0001155718021284,9.46916937222263e-05,0.199988056695253,0.000158198828101929
|
||||||
|
0.676,0.559749096753245,-0.292900299122268,0.130327352108272,-7.4776850989e-05,-2.83270049084017e-05,0.199988230291367,5.18180498509934e-05,-0.000114992838168293,9.48960892505068e-05,0.199988246277299,0.000157840840327842
|
||||||
|
0.678,0.559748947303179,-0.292900356006264,0.130727328758647,-7.46733919976261e-05,-2.85564106666802e-05,0.199988420287345,5.16411358120194e-05,-0.000114411986829043,9.50992791459714e-05,0.199988436267229,0.000157482642002882
|
||||||
|
0.68,0.559748798059677,-0.29290041334791,0.131127305789421,-7.4570286445752e-05,-2.87846528557178e-05,0.199988610688484,5.14646172899979e-05,-0.000113829255049546,9.53012599391733e-05,0.199988626662603,0.0001571242701938
|
||||||
|
0.682,0.559748649022033,-0.292900471144876,0.131527283201401,-7.44675335284661e-05,-2.90117276868784e-05,0.199988801492384,5.12884734682472e-05,-0.000113244628952014,9.55020246912185e-05,0.199988817461013,0.000156765717608489
|
||||||
|
0.684,0.559748500189543,-0.292900529394821,0.13192726099539,-7.4365132551879e-05,-2.92376313715259e-05,0.199988992696583,5.11126765911917e-05,-0.000112658122414233,9.57015577895958e-05,0.199989008659991,0.000156406989669808
|
||||||
|
0.686,0.559748351561503,-0.292900588095401,0.132327239172187,-7.42630828221013e-05,-2.94623601765353e-05,0.199989184298616,5.09372335977253e-05,-0.000112069738905651,9.58998609690286e-05,0.199989200257068,0.000156048106296902
|
||||||
|
0.688000000000001,0.559748203137211,-0.292900647244262,0.132727217732585,-7.41613836174881e-05,-2.96859103271485e-05,0.199989376296027,5.07621653045298e-05,-0.000111479447201246,9.60969324947935e-05,0.199989392249784,0.000155689065157476
|
||||||
|
0.690000000000001,0.559748054915968,-0.292900706839042,0.133127196677371,-7.40600341608832e-05,-2.99082779653403e-05,0.199989568686345,5.05874855893928e-05,-0.000110887264648252,9.62927914488486e-05,0.199989584635661,0.000155329909690439
|
||||||
|
0.692000000000001,0.559747906897075,-0.292900766877374,0.13352717600733,-7.39590336751305e-05,-3.01294593857415e-05,0.199989761467192,5.04131805745267e-05,-0.000110293208593903,9.6487411810342e-05,0.199989777412315,0.000154970646496156
|
||||||
|
0.694000000000001,0.559747759079834,-0.29290082735688,0.13392715572324,-7.38583814385851e-05,-3.03494507997159e-05,0.199989954635993,5.02392225043557e-05,-0.000109697261690966,9.66807710278682e-05,0.199989970577167,0.000154611255045943
|
||||||
|
0.696000000000001,0.559747611463549,-0.292900888275177,0.134327135825874,-7.37580767851131e-05,-3.05682484325054e-05,0.199990148190276,5.00656530122434e-05,-0.0001090994135311,9.68728985917266e-05,0.19999016412774,0.000154251775114373
|
||||||
|
0.698000000000001,0.559747464047526,-0.292900949629874,0.134727116316001,-7.36581188265361e-05,-3.07858484538403e-05,0.199990342127587,4.98924790370836e-05,-0.00010849966758375,9.70637823588526e-05,0.199990358061573,0.000153892219348662
|
||||||
|
0.700000000000001,0.559747316831074,-0.292901011418571,0.135127097194385,-7.35585068689647e-05,-3.10022471028404e-05,0.199990536445406,4.97196658844067e-05,-0.000107898041196153,9.72534101861821e-05,0.199990552376142,0.000153532596742403
|
||||||
|
0.702000000000001,0.559747169813499,-0.292901073638862,0.135527078461783,-7.34592401629985e-05,-3.12174406186249e-05,0.199990731141228,4.95472551875764e-05,-0.000107294517021073,9.74417994209497e-05,0.199990747068937,0.000153172935448142
|
||||||
|
0.704000000000001,0.559747022994113,-0.292901136288333,0.13592706011895,-7.33603178482144e-05,-3.14314251709246e-05,0.199990926212604,4.93752261299107e-05,-0.000106689115875191,9.76289361853676e-05,0.199990942137502,0.000152813250676427
|
||||||
|
0.706000000000001,0.559746876372228,-0.292901199364563,0.136327042166633,-7.32617392584788e-05,-3.16441970821257e-05,0.199991121656973,4.92035509558341e-05,-0.000106081813472381,9.78147909891368e-05,0.199991137579273,0.000152453513939498
|
||||||
|
0.708000000000001,0.559746729947156,-0.292901262865122,0.136727024605577,-7.31635036443911e-05,-3.18557524248142e-05,0.199991317471768,4.90322712987101e-05,-0.000105472602873746,9.79993759753216e-05,0.199991333391676,0.000152093758179702
|
||||||
|
0.710000000000001,0.559746583718213,-0.292901326787572,0.13712700743652,-7.3065610173284e-05,-3.20660874936207e-05,0.199991513654476,4.88614079752203e-05,-0.000104861539590439,9.81827171647741e-05,0.199991529572195,0.000151734062176086
|
||||||
|
0.712000000000001,0.559746437684715,-0.292901391129472,0.137526990660195,-7.29680580124902e-05,-3.22751985831759e-05,0.199991710202636,4.8690940168683e-05,-0.000104248561172415,9.8364805883877e-05,0.19999172611836,0.000151374387521806
|
||||||
|
0.714000000000001,0.559746291845981,-0.292901455888367,0.137926974277331,-7.28708464126093e-05,-3.24830817383104e-05,0.1999919071137,4.85208331846287e-05,-0.000103633688436355,9.85455952950964e-05,0.19999192302762,0.000151014724394408
|
||||||
|
0.716000000000001,0.55974614620133,-0.292901521061799,0.13832695828865,-7.27739746797517e-05,-3.26897333369214e-05,0.199992104385017,4.8351114778633e-05,-0.000103016969954517,9.87251010109435e-05,0.19999212029732,0.000150655142522807
|
||||||
|
0.718000000000001,0.559746000750082,-0.2929015866473,0.138726942694871,-7.26774419534947e-05,-3.28951496181284e-05,0.199992302014104,4.81818127062716e-05,-0.000102398350215749,9.89033421133766e-05,0.199992317924969,0.000150295642930076
|
||||||
|
0.720000000000001,0.559745855491562,-0.292901652642397,0.139126927496707,-7.25812474289266e-05,-3.30993267377843e-05,0.199992499998386,4.80128992119688e-05,-0.000101777836158945,9.90802977857141e-05,0.199992515907989,0.000149936225887013
|
||||||
|
0.722000000000001,0.559745710425092,-0.292901719044607,0.139526912694865,-7.24853903566468e-05,-3.33022609627642e-05,0.199992698335295,4.78443881735124e-05,-0.00010115544513134,9.92559767015732e-05,0.199992714243806,0.000149576931611798
|
||||||
|
0.724000000000001,0.55974556555,-0.292901785851441,0.139926898290048,-7.23898698762326e-05,-3.35039485183097e-05,0.199992897022293,4.76762865297963e-05,-0.000100531184071828,9.94303563095488e-05,0.199992912929877,0.00014921777046987
|
||||||
|
0.726000000000001,0.559745420865613,-0.292901853060401,0.140326884282954,-7.22946852105277e-05,-3.37043856990515e-05,0.19999309605672,4.75085942808206e-05,-9.99050356331742e-05,9.96034262013e-05,0.199993111963537,0.000148858742391716
|
||||||
|
0.728000000000001,0.559745276371259,-0.292901920668984,0.140726870674275,-7.21998354991093e-05,-3.39035686608424e-05,0.199993295435997,4.73412836710096e-05,-9.92770067542724e-05,9.97752123976791e-05,0.199993311342201,0.000148499879524223
|
||||||
|
0.730000000000001,0.559745132066271,-0.292901988674676,0.141126857464698,-7.21053200758436e-05,-3.41014937260686e-05,0.19999349515757,4.71743408225755e-05,-9.86471321295922e-05,9.99457201028563e-05,0.199993511063309,0.000148141223419804
|
||||||
|
0.732000000000001,0.559744987949979,-0.292902057074959,0.141526844654905,-7.2011138135819e-05,-3.42981571893608e-05,0.199993695218878,4.7007862880033e-05,-9.80153701257684e-05,0.000100114912887639,0.199993711124298,0.00014778277212158
|
||||||
|
0.734000000000001,0.559744844021718,-0.292902125867305,0.141926832245573,-7.19172886243235e-05,-3.44935552065717e-05,0.199993895617222,4.68418012711247e-05,-9.73817415594862e-05,0.000100282771670068,0.199993911522461,0.000147424530622665
|
||||||
|
0.736000000000001,0.559744700280825,-0.292902195049179,0.142326820237374,-7.18237709307345e-05,-3.46876841555987e-05,0.199994096349965,4.66760935458054e-05,-9.67462672474272e-05,0.000100449348491849,0.199994112255157,0.000147066548023146
|
||||||
|
0.738000000000001,0.559744556726635,-0.292902264618041,0.142726808630973,-7.17305842501403e-05,-3.48805402755614e-05,0.199994297414616,4.65108229708022e-05,-9.61089124951186e-05,0.000100614615597405,0.19999431331989,0.000146708829271552
|
||||||
|
0.740000000000001,0.559744413358488,-0.29290233457134,0.143126797427032,-7.16377276388513e-05,-3.50721198055792e-05,0.199994498808427,4.63459964850088e-05,-9.54697154664785e-05,0.000100778546965885,0.199994514713908,0.000146351404127169
|
||||||
|
0.742000000000001,0.559744270175724,-0.29290240490652,0.143526786626207,-7.15452002642002e-05,-3.52624191374273e-05,0.199994700528803,4.61815516383801e-05,-9.48286761615068e-05,0.000100941175557034,0.199994716434609,0.000145994295974563
|
||||||
|
0.744000000000001,0.559744127177687,-0.292902475621017,0.143926776229147,-7.14530014322978e-05,-3.54514345102252e-05,0.199994902573129,4.60175092475978e-05,-9.41857598857342e-05,0.000101102458002766,0.199994918479373,0.000145637479849134
|
||||||
|
0.746000000000001,0.559743984363718,-0.292902546712258,0.144326766236499,-7.13611302272098e-05,-3.56391621769702e-05,0.199995104938635,4.58539109460254e-05,-9.35410013336301e-05,0.000101262416854486,0.199995120845426,0.000145281028172146
|
||||||
|
0.748000000000001,0.559743841733166,-0.292902618177666,0.144726756648902,-7.12695857885137e-05,-3.58255985155597e-05,0.199995307622797,4.56907151002994e-05,-9.2894435199664e-05,0.000101421065989982,0.199995323530238,0.000144924981159169
|
||||||
|
0.750000000000001,0.559743699285375,-0.292902690014653,0.145126747466991,-7.11783673668086e-05,-3.60107399177689e-05,0.199995510622899,4.55279286493137e-05,-9.22460198504726e-05,0.000101578353367548,0.199995526531089,0.000144569299431841
|
||||||
|
0.752000000000001,0.559743557019696,-0.292902762220625,0.145526738691394,-7.10874740739164e-05,-3.61945825949616e-05,0.19999571393621,4.5365579348644e-05,-9.1595737938821e-05,0.00010173432062055,0.199995729845242,0.000144214031877346
|
||||||
|
0.754000000000001,0.559743414935479,-0.292902834792983,0.145926730322735,-7.09969050494141e-05,-3.63771228695242e-05,0.199995917560182,4.52036741371841e-05,-9.09436553842013e-05,0.000101888959075369,0.199995933470145,0.000143859238812123
|
||||||
|
0.756000000000001,0.559743273032076,-0.292902907729117,0.146326722361634,-7.09066593773677e-05,-3.65583572164984e-05,0.199996121492046,4.50421644426768e-05,-9.02897721866135e-05,0.000102042227098642,0.199996137403024,0.000143504897653155
|
||||||
|
0.758000000000001,0.559743131308841,-0.292902981026412,0.146726714808704,-7.08167363916434e-05,-3.67382819582706e-05,0.19999632572909,4.48810363873342e-05,-8.96340536515882e-05,0.000102194145507051,0.199996341641161,0.000143151019476402
|
||||||
|
0.760000000000001,0.55974298976513,-0.292903054682245,0.147126707664551,-7.07271352318183e-05,-3.69168934311048e-05,0.199996530268628,4.47203871156709e-05,-8.89765240652539e-05,0.000102344735117277,0.199996546181865,0.000142797687883018
|
||||||
|
0.762000000000001,0.559742848400301,-0.292903128693985,0.147526700929778,-7.06378548431807e-05,-3.70941880545317e-05,0.199996735108031,4.45601749943236e-05,-8.83171938359516e-05,0.000102493961234851,0.199996751022503,0.000142444894651205
|
||||||
|
0.764000000000001,0.559742707213711,-0.292903203058997,0.147926694604983,-7.0548894531841e-05,-3.72701622064486e-05,0.199996940244473,4.44003583899288e-05,-8.76560490858934e-05,0.00010264179783892,0.199996956160245,0.000142092622715286
|
||||||
|
0.766000000000001,0.559742566204722,-0.292903277774634,0.148326688690756,-7.0460253409621e-05,-3.74448122508752e-05,0.199997145675222,4.42409997525317e-05,-8.69931106317611e-05,0.00010278829697119,0.199997161592352,0.00014174096567588
|
||||||
|
0.768000000000001,0.559742425372697,-0.292903352838246,0.148726683187684,-7.03719305328309e-05,-3.76181346489756e-05,0.199997351397661,4.40820574487688e-05,-8.63283992902363e-05,0.000102933430876084,0.199997367316203,0.000141389927168991
|
||||||
|
0.770000000000001,0.559742284717,-0.292903428247173,0.149126678096347,-7.02839251798259e-05,-3.77901258480362e-05,0.199997557408946,4.39235314786401e-05,-8.56619011835313e-05,0.000103077187410538,0.199997573328949,0.000141039513954067
|
||||||
|
0.772000000000001,0.559742144236997,-0.292903503998749,0.14952667341732,-7.01962364069163e-05,-3.79607822537098e-05,0.199997763706411,4.37654495977213e-05,-8.49936267199868e-05,0.000103219578717617,0.19999777962792,0.000140689774298452
|
||||||
|
0.774000000000001,0.559742003932055,-0.292903580090302,0.149926669151172,-7.0108863381435e-05,-3.81301003549161e-05,0.19999797028726,4.36078048671184e-05,-8.43235897773908e-05,0.000103360582245915,0.199997986210315,0.000140340722530878
|
||||||
|
0.776000000000001,0.559741863801543,-0.292903656519151,0.150326665298469,-7.00218051874479e-05,-3.82980766128193e-05,0.19999817714874,4.34505764701498e-05,-8.36517660696145e-05,0.00010350021187322,0.199998193073374,0.000139992372720642
|
||||||
|
0.778000000000001,0.559741723844834,-0.292903733282608,0.150726661859767,-6.99350610755544e-05,-3.84647074191946e-05,0.199998384288108,4.32937852234971e-05,-8.29782111078092e-05,0.00010363844678285,0.199998400214352,0.000139644774371231
|
||||||
|
0.780000000000001,0.559741584061299,-0.29290381037798,0.151126658835621,-6.98486300465539e-05,-3.86299894572506e-05,0.199998591702527,4.31374796994177e-05,-8.23029214225279e-05,0.000103775307791487,0.199998607630406,0.000139297981093476
|
||||||
|
0.782000000000001,0.559741444450314,-0.292903887802566,0.151526656226577,-6.97625111567567e-05,-3.87939191048847e-05,0.199998799389339,4.29815766311847e-05,-8.1625865788748e-05,0.000103910777551896,0.199998815318874,0.000138951961435976
|
||||||
|
0.784000000000001,0.559741305011254,-0.292903965553657,0.151926654033178,-6.96767037400291e-05,-3.89564929204056e-05,0.199999007345637,4.28260898965859e-05,-8.0947092778727e-05,0.000104044810961268,0.199999023276844,0.000138606740431785
|
||||||
|
0.786000000000001,0.559741165743499,-0.292904043628538,0.15232665225596,-6.95912067971704e-05,-3.91177074759996e-05,0.199999215568583,4.26710611289848e-05,-8.0266578106336e-05,0.000104177475673817,0.199999231501473,0.000138262393500701
|
||||||
|
0.788000000000001,0.559741026646427,-0.292904122024487,0.152726650895453,-6.95060194955132e-05,-3.92775592328309e-05,0.19999942405554,4.25164833894875e-05,-7.95843668743856e-05,0.000104308754342308,0.199999439990119,0.000137918958243779
|
||||||
|
0.790000000000001,0.559740887719421,-0.292904200738775,0.153126649952182,-6.94211408636124e-05,-3.94360449434971e-05,0.1999996328036,4.23623497392e-05,-7.89004590828756e-05,0.000104438594925038,0.19999964873987,0.000137576419595914
|
||||||
|
0.792000000000001,0.559740748961864,-0.292904279768667,0.153526649426667,-6.93365700965564e-05,-3.95931610691624e-05,0.19999984180992,4.22086324225468e-05,-7.82148200373366e-05,0.000104567032116476,0.199999857747877,0.00013723480218262
|
||||||
|
0.794000000000001,0.55974061037314,-0.292904359111419,0.153926649319422,-6.92523063339223e-05,-3.97489042236465e-05,0.200000051071729,4.2055386950679e-05,-7.7527494840579e-05,0.000104694058977728,0.200000067011367,0.000136894170851279
|
||||||
|
0.796000000000001,0.559740471952638,-0.292904438764283,0.154326649630954,-6.91683485487537e-05,-3.99032710485247e-05,0.200000260586155,4.19025716902332e-05,-7.68384973703905e-05,0.000104819663365729,0.200000276527463,0.000136554538630173
|
||||||
|
0.798000000000001,0.559740333699746,-0.292904518724503,0.154726650361766,-6.90846960471613e-05,-4.0056258213128e-05,0.200000470350382,4.17501866412095e-05,-7.61478310962182e-05,0.000104943836606863,0.200000486293342,0.000136215928242633
|
||||||
|
0.800000000000001,0.559740195613854,-0.292904598989316,0.155126651512356,-6.90013478021888e-05,-4.02078623729096e-05,0.200000680361502,4.15982734369713e-05,-7.54554960180619e-05,0.000105066580435853,0.200000696306092,0.00013587838149151
|
||||||
|
0.802000000000001,0.559740057694355,-0.292904679555953,0.155526653083212,-6.89183029534134e-05,-4.03580801972003e-05,0.200000890616704,4.14467765663673e-05,-7.47615129526035e-05,0.00010518791046521,0.2000009065629,0.000135541933049303
|
||||||
|
0.804000000000001,0.559739919940642,-0.292904760421637,0.155926655074822,-6.88355606959234e-05,-4.050690842472e-05,0.200001101113144,4.12957446016548e-05,-7.40658818998429e-05,0.000105307797204634,0.200001117060915,0.000135206603151987
|
||||||
|
0.806000000000001,0.559739782352112,-0.292904841583586,0.156326657487665,-6.87531199750068e-05,-4.06543437247997e-05,0.200001311847893,4.114517060394e-05,-7.33686063292271e-05,0.000105426252797192,0.200001327797206,0.000134872429493866
|
||||||
|
0.808000000000001,0.559739644928162,-0.292904923039012,0.156726660322214,-6.86709800135076e-05,-4.08003828500369e-05,0.200001522818155,4.09950129398561e-05,-7.26697139963316e-05,0.000105543254691476,0.20000153876897,0.000134539425556665
|
||||||
|
0.810000000000001,0.559739507668192,-0.292905004785118,0.157126663578938,-6.85891399232474e-05,-4.0945022580785e-05,0.200001734020912,4.0845327120561e-05,-7.19692222483914e-05,0.000105658795948593,0.200001749973185,0.000134207640840343
|
||||||
|
0.812000000000001,0.559739370571603,-0.292905086819102,0.157526667258298,-6.85075987050254e-05,-4.10882597390305e-05,0.200001945453339,4.06961131460548e-05,-7.12671172076184e-05,0.000105772906058843,0.200001961407023,0.00013387712006319
|
||||||
|
0.814000000000001,0.559739233637797,-0.292905169138157,0.157926671360751,-6.84263554706632e-05,-4.12300910496155e-05,0.200002157112536,4.05473155051794e-05,-7.05634092823536e-05,0.000105885539919415,0.200002173067579,0.000133547845689294
|
||||||
|
0.816000000000001,0.559739096866181,-0.292905251739466,0.158326675886748,-6.83454094430047e-05,-4.13705133761599e-05,0.200002368995498,4.039895501462e-05,-6.98581401059605e-05,0.000105996728755331,0.200002384951845,0.000133219900210774
|
||||||
|
0.818000000000001,0.55973896025616,-0.29290533462021,0.158726680836733,-6.82647596506047e-05,-4.15095236100393e-05,0.200002581099451,4.02510941244216e-05,-6.91512923312042e-05,0.000106106472566592,0.200002597057039,0.000132893323119762
|
||||||
|
0.820000000000001,0.559738823807142,-0.292905417777561,0.159126686211146,-6.8184405066507e-05,-4.16471185454847e-05,0.200002793421389,4.01036703845392e-05,-6.84428798358727e-05,0.00010621472798511,0.200002809380154,0.000132568098045836
|
||||||
|
0.822000000000001,0.559738687518539,-0.292905501208685,0.159526692010418,-6.81043449690665e-05,-4.17832951293828e-05,0.200003005958363,3.99566352227154e-05,-6.77329199672005e-05,0.000106321514092844,0.200003021918236,0.000132244264543303
|
||||||
|
0.824000000000001,0.559738551389762,-0.292905584910741,0.159926698234979,-6.80245785256161e-05,-4.19180502253535e-05,0.200003218707445,3.98100927223588e-05,-6.702141966408e-05,0.000106426808338389,0.200003234668353,0.000131921869716312
|
||||||
|
0.826000000000001,0.559738415420225,-0.292905668880885,0.160326704885248,-6.79451045981771e-05,-4.20513808080391e-05,0.200003431665596,3.9664063700151e-05,-6.6308410151537e-05,0.000106530631538426,0.200003447627461,0.000131600982754727
|
||||||
|
0.828000000000001,0.559738279609344,-0.292905753116265,0.160726711961641,-6.78659222708155e-05,-4.21832838659597e-05,0.200003644829971,3.95184301948958e-05,-6.55938810212308e-05,0.000106632983692956,0.200003660792712,0.000131281593392823
|
||||||
|
0.830000000000001,0.559738143956536,-0.292905837614021,0.161126719464568,-6.77870308773975e-05,-4.2313756332124e-05,0.200003858197531,3.93732338399566e-05,-6.48778600287336e-05,0.000106733830107508,0.200003874161061,0.000130963730682744
|
||||||
|
0.832000000000001,0.55973800846122,-0.29290592237129,0.161526727394431,-6.77084293354557e-05,-4.24427953060746e-05,0.200004071765292,3.92285370853784e-05,-6.41603541129409e-05,0.000106833195068212,0.200004087729522,0.00013064746737017
|
||||||
|
0.834000000000001,0.559737873122819,-0.292906007385202,0.161926735751629,-6.7630116729056e-05,-4.25703977485758e-05,0.200004285530311,3.90842636033284e-05,-6.34413563349589e-05,0.000106931057758386,0.200004301495147,0.000130332791224469
|
||||||
|
0.836000000000001,0.559737737940754,-0.292906092652881,0.162326744536553,-6.75520922810424e-05,-4.26965607314144e-05,0.200004499489523,3.89404342104882e-05,-6.27209187364918e-05,0.000107027412973859,0.200004515454866,0.00013001976077323
|
||||||
|
0.838000000000001,0.55973760291445,-0.292906178171445,0.162726753749587,-6.7474354992214e-05,-4.28212814235218e-05,0.200004713639963,3.87970974791152e-05,-6.19990482564336e-05,0.000107122272857696,0.200004729605713,0.000129708434959744
|
||||||
|
0.840000000000001,0.559737468043334,-0.292906263938007,0.163126763391113,-6.73969038911259e-05,-4.29445569244402e-05,0.200004927978614,3.86542187147398e-05,-6.12757136697616e-05,0.000107215611389044,0.200004943944664,0.000129398798432258
|
||||||
|
0.842000000000001,0.559737333326834,-0.292906349949673,0.163526773461502,-6.73197381173551e-05,-4.30663842782008e-05,0.200005142502409,3.85117493451048e-05,-6.05509392626046e-05,0.000107307426833181,0.200005158468649,0.000129090878596291
|
||||||
|
0.844000000000001,0.559737198764381,-0.292906436203544,0.163926783961122,-6.72428568937455e-05,-4.31867606814906e-05,0.200005357208321,3.83697518202552e-05,-5.98248013627955e-05,0.00010739773653734,0.200005373174638,0.000128784775987652
|
||||||
|
0.846000000000001,0.559737064355406,-0.292906522696715,0.164326794890335,-6.71662591100741e-05,-4.3305683483652e-05,0.200005572093355,3.82282400179789e-05,-5.90972687453117e-05,0.000107486526623734,0.200005588059631,0.00012848050013003
|
||||||
|
0.848000000000001,0.559736930099345,-0.292906609426278,0.164726806249496,-6.70899439336736e-05,-4.34231497564718e-05,0.200005787154428,3.80871445493369e-05,-5.83683310018123e-05,0.000107573772806235,0.200005803120542,0.000128178037274826
|
||||||
|
0.850000000000001,0.559736795995631,-0.292906696389314,0.165126818038953,-6.70139105318767e-05,-4.35391568076593e-05,0.200006002388446,3.79465209254803e-05,-5.76380609906834e-05,0.000107659495901524,0.200006018354272,0.000127877486614665
|
||||||
|
0.852000000000001,0.559736662043703,-0.292906783582905,0.165526830259049,-6.69381578499716e-05,-4.36537020004346e-05,0.200006217792412,3.78063691464092e-05,-5.69064240174554e-05,0.000107743687235984,0.200006233757821,0.000127578857110786
|
||||||
|
0.854000000000001,0.559736528242999,-0.292906871004122,0.165926842910122,-6.68626850552911e-05,-4.37667825037291e-05,0.200006433363195,3.76666406398662e-05,-5.6173451307151e-05,0.000107826322523485,0.200006449328056,0.000127282160092404
|
||||||
|
0.856000000000001,0.559736394592962,-0.292906958650035,0.166326855992502,-6.67874912874122e-05,-4.38783958056632e-05,0.200006649097702,3.75273770392148e-05,-5.54391740847925e-05,0.000107907419111264,0.200006665061877,0.000126987468475835
|
||||||
|
0.858000000000001,0.559736261093034,-0.292907046517706,0.166726869506513,-6.67125755471342e-05,-4.39885392000682e-05,0.200006864992871,3.73885922222427e-05,-5.47035750031454e-05,0.000107986968325702,0.200006880956221,0.000126694803660853
|
||||||
|
0.860000000000001,0.55973612774266,-0.292907134604192,0.167126883452474,-6.66379369185232e-05,-4.40972101056758e-05,0.200007081045575,3.72502514944805e-05,-5.396669916502e-05,0.000108064942411223,0.200007097007956,0.000126404183607628
|
||||||
|
0.862000000000001,0.559735994541287,-0.292907222906546,0.167526897830696,-6.65635745411563e-05,-4.42044059967283e-05,0.200007297252641,3.71123617948221e-05,-5.32285396315224e-05,0.000108141353510893,0.200007313213905,0.000126115649974388
|
||||||
|
0.864000000000001,0.559735861488362,-0.292907311421816,0.167926912641484,-6.64894874713439e-05,-4.43101242642018e-05,0.200007513610989,3.69749370010552e-05,-5.24891449749098e-05,0.000108216220706669,0.200007529570986,0.00012582927612628
|
||||||
|
0.866000000000001,0.559735728583337,-0.292907400147043,0.16832692788514,-6.64156747931521e-05,-4.4414362576628e-05,0.200007730117524,3.68379493576043e-05,-5.17485221340763e-05,0.000108289504099912,0.2000077460761,0.000125545054678148
|
||||||
|
0.868000000000001,0.559735595825663,-0.292907489079266,0.168726943561954,-6.63421356739135e-05,-4.45171183527382e-05,0.200007946769005,3.67014127422571e-05,-5.10066468228931e-05,0.000108361208894792,0.200007962726003,0.000125263016531351
|
||||||
|
0.870000000000001,0.559735463214794,-0.292907578215517,0.169126959672216,-6.62688691421831e-05,-4.46183891639195e-05,0.200008163562359,3.6565375727271e-05,-5.02635641441706e-05,0.000108431352438543,0.200008179517617,0.000124983241973487
|
||||||
|
0.872000000000001,0.559735330750186,-0.292907667552823,0.169526976216204,-6.61958741710044e-05,-4.47181726093148e-05,0.200008380494415,3.64297689237069e-05,-4.95192914451436e-05,0.000108499903506143,0.200008396447768,0.000124705723003822
|
||||||
|
0.874000000000001,0.559735198431297,-0.292907757088207,0.169926993194193,-6.61231500664882e-05,-4.48164663297001e-05,0.200008597561973,3.6294585392671e-05,-4.87738668897286e-05,0.000108566856893422,0.200008613513254,0.000124430500424613
|
||||||
|
0.876000000000001,0.559735066257586,-0.292907846818688,0.170327010606452,-6.60506958294337e-05,-4.49132680768738e-05,0.200008814761843,3.61598945231023e-05,-4.80272835390316e-05,0.000108632210865656,0.200008830710879,0.000124157622293682
|
||||||
|
0.878000000000001,0.559734934228514,-0.292907936741279,0.170727028453241,-6.59785104883958e-05,-4.50085754638562e-05,0.200009032090817,3.60256546816373e-05,-4.72795240458179e-05,0.000108695975831186,0.200009048037435,0.000123887111319674
|
||||||
|
0.880000000000001,0.559734802343544,-0.29290802685299,0.171127046734815,-6.59065932107072e-05,-4.5102386173057e-05,0.200009249545746,3.58918450515943e-05,-4.65306682073674e-05,0.000108758137912224,0.200009265489769,0.00012361901223989
|
||||||
|
0.882000000000001,0.559734670602141,-0.292908117150824,0.171527065451424,-6.58349431081894e-05,-4.51946981366857e-05,0.200009467123369,3.57585142052308e-05,-4.57807333709148e-05,0.000108818679761535,0.200009483064615,0.000123353362139781
|
||||||
|
0.884000000000001,0.559734539003772,-0.292908207631782,0.171927084603308,-6.57635591538863e-05,-4.52855091065407e-05,0.200009684820465,3.5625627448077e-05,-4.50296779030967e-05,0.000108877610052738,0.20000970075875,0.000123090175050334
|
||||||
|
0.886000000000001,0.559734407547904,-0.29290829829286,0.172327104190705,-6.56924405983971e-05,-4.53748168482981e-05,0.200009902633809,3.54931778412393e-05,-4.42775503761705e-05,0.000108934927051107,0.200009918568946,0.000122829497565586
|
||||||
|
0.888000000000001,0.559734276234009,-0.29290838913105,0.172727124213844,-6.56215864425213e-05,-4.54626193080454e-05,0.200010120560173,3.53612208958686e-05,-4.35243993623935e-05,0.000108990639430262,0.200010136491972,0.00012257140272723
|
||||||
|
0.890000000000001,0.559734145061559,-0.292908480143338,0.173127144672946,-6.55509957148137e-05,-4.55489144457477e-05,0.200010338596367,3.52296802841323e-05,-4.27702248617656e-05,0.000109044709026285,0.200010354524634,0.000122315865995689
|
||||||
|
0.892000000000001,0.559734014030026,-0.292908571326708,0.173527165568229,-6.54806677213848e-05,-4.56337002074924e-05,0.200010556739009,3.50985907004997e-05,-4.2015019935393e-05,0.000109097101144706,0.200010572663549,0.000122062895457673
|
||||||
|
0.894000000000001,0.559733883138888,-0.292908662678139,0.173927186899902,-6.54106013520117e-05,-4.57169745254892e-05,0.200010774984771,3.49679799005464e-05,-4.12588192777452e-05,0.000109147881705018,0.200010790905384,0.000121812601430276
|
||||||
|
0.896000000000001,0.559733752387621,-0.292908754194606,0.174327208668168,-6.53407958017826e-05,-4.57987354846034e-05,0.200010993330536,3.48377923731213e-05,-4.05016437055039e-05,0.000109197040298881,0.20001100924702,0.000121564997142745
|
||||||
|
0.898000000000001,0.559733621775705,-0.29290884587308,0.174727230873224,-6.52712501825192e-05,-4.58789811003113e-05,0.200011211772932,3.47080697515878e-05,-3.97435140353508e-05,0.000109244517945695,0.200011227685082,0.000121320079603281
|
||||||
|
0.900000000000001,0.55973349130262,-0.29290893771053,0.17512725351526,-6.52019635227762e-05,-4.59577095407448e-05,0.200011430308608,3.45787842803702e-05,-3.89844684312024e-05,0.000109290351074653,0.200011446216216,0.000121077916810593
|
||||||
|
0.902000000000001,0.559733360967851,-0.292909029703919,0.175527276594459,-6.51329350453977e-05,-4.60349189740361e-05,0.200011648934337,3.44499498372563e-05,-3.82244895458239e-05,0.000109334534481586,0.200011664837192,0.000120838533072582
|
||||||
|
0.904000000000001,0.55973323077088,-0.292909121850206,0.175927300110997,-6.50641637234272e-05,-4.61106074989281e-05,0.200011867646746,3.43215872389279e-05,-3.74636051347909e-05,0.00010937705602343,0.200011883544636,0.000120601962855699
|
||||||
|
0.906000000000001,0.559733100711196,-0.292909214146349,0.176327324065046,-6.4995648696442e-05,-4.61847733945752e-05,0.200012086442561,3.41936479131277e-05,-3.67018707092548e-05,0.000109417893148778,0.200012102335269,0.000120368219278525
|
||||||
|
0.908000000000001,0.559732970788285,-0.2929093065893,0.176727348456768,-6.49273891317747e-05,-4.62574149817651e-05,0.200012305318318,3.40661665543251e-05,-3.59392758608745e-05,0.000109457033714566,0.200012321205626,0.000120137327599305
|
||||||
|
0.910000000000001,0.559732841001639,-0.292909399176009,0.177127373286319,-6.48593840302247e-05,-4.63285304980187e-05,0.200012524270696,3.39391154069446e-05,-3.5175834467438e-05,0.000109494524558329,0.200012540152381,0.000119909356571291
|
||||||
|
0.912000000000001,0.559732711350749,-0.292909491903422,0.17752739855385,-6.47916326701469e-05,-4.63981183196349e-05,0.200012743296417,3.38124944709861e-05,-3.44115951012025e-05,0.00010953033272032,0.200012759172257,0.000119684319965414
|
||||||
|
0.914000000000001,0.559732581835108,-0.292909584768482,0.177927424259505,-6.47241340523407e-05,-4.64661768784235e-05,0.200012962392026,3.36863592576009e-05,-3.36465473538272e-05,0.000109564432179687,0.200012978261795,0.000119462235655134
|
||||||
|
0.916000000000001,0.559732452454213,-0.292909677768129,0.178327450403418,-6.46568872331165e-05,-4.65327045090502e-05,0.200013181554145,3.35606681334255e-05,-3.28807155114408e-05,0.000109596826405878,0.200013197417613,0.000119243130856022
|
||||||
|
0.918000000000001,0.55973232320756,-0.2929097708993,0.178727476985721,-6.4589891379807e-05,-4.65976997404693e-05,0.200013400779332,3.34353933428843e-05,-3.21141585546414e-05,0.000109627511929444,0.200013416636268,0.000119027039278924
|
||||||
|
0.920000000000001,0.559732194094647,-0.292909864158928,0.179127504006536,-6.4523145659745e-05,-4.66611611432688e-05,0.200013620064193,3.33105557026591e-05,-3.13468695445351e-05,0.000109656513036516,0.200013635914364,0.000118814015178301
|
||||||
|
0.922000000000001,0.559732065114977,-0.292909957543944,0.179527531465978,-6.44566491569964e-05,-4.67230872186474e-05,0.200013839405384,3.31861829683255e-05,-3.0578848481122e-05,0.000109683814114581,0.200013855248554,0.000118604080002167
|
||||||
|
0.924000000000001,0.559731936268051,-0.292910051051277,0.179927559364157,-6.43904009278717e-05,-4.67834765371932e-05,0.20001405879945,3.30622473843078e-05,-2.98101404672124e-05,0.000109709364856658,0.200014074635379,0.000118397218776572
|
||||||
|
0.926000000000001,0.559731807553373,-0.292910144677851,0.180327587701176,-6.43244001674592e-05,-4.68423277805163e-05,0.200014278242844,3.29387420117122e-05,-2.90407906056167e-05,0.000109733184344707,0.200014294071293,0.000118193485398912
|
||||||
|
0.928000000000001,0.55973167897045,-0.292910238420588,0.180727616477129,-6.42586459598248e-05,-4.68996396996157e-05,0.200014497732187,3.28156737894325e-05,-2.82708023657818e-05,0.000109755295130132,0.200014513552914,0.000117992929965154
|
||||||
|
0.930000000000001,0.559731550518789,-0.292910332276409,0.181127645692105,-6.41931374723014e-05,-4.69554109899794e-05,0.200014717264024,3.2693021900787e-05,-2.75001757477078e-05,0.00010977567119208,0.200014733076784,0.000117795548866805
|
||||||
|
0.932000000000001,0.5597314221979,-0.292910426242232,0.181527675346185,-6.41278738722217e-05,-4.70096404026065e-05,0.200014936834872,3.25708487958209e-05,-2.6728952384758e-05,0.000109794295183319,0.200014952639417,0.000117601378995608
|
||||||
|
0.934000000000001,0.559731294007294,-0.292910520314971,0.181927705439444,-6.40628540771181e-05,-4.70623267995185e-05,0.200015156441205,3.24491336578525e-05,-2.59571600325081e-05,0.000109811165369122,0.200015172237287,0.000117410444475026
|
||||||
|
0.936000000000001,0.559731165946484,-0.292910614491539,0.18232773597195,-6.39980773375903e-05,-4.71134690427366e-05,0.200015376079533,3.23277793423671e-05,-2.51848125687459e-05,0.000109826304300897,0.200015391866901,0.000117222767488764
|
||||||
|
0.938000000000001,0.559731038014984,-0.292910708768847,0.182727766943762,-6.39335429597487e-05,-4.71630660497934e-05,0.200015595746422,3.22068621771976e-05,-2.44119308101531e-05,0.000109839668610556,0.200015611524823,0.00011703835754853
|
||||||
|
0.940000000000001,0.559730910212312,-0.292910803143803,0.183127798354935,-6.38692498888815e-05,-4.72111167659772e-05,0.200015815438208,3.20864307346014e-05,-2.36385355734114e-05,0.000109851260032823,0.200015831207387,0.000116857257935229
|
||||||
|
0.942000000000001,0.559730782537985,-0.292910897613314,0.183527830205515,-6.38051972368103e-05,-4.72576201920871e-05,0.200016035151462,3.19664086867455e-05,-2.28646719613312e-05,0.000109861101119102,0.200016050911163,0.000116679501401612
|
||||||
|
0.944000000000001,0.559730654991523,-0.292910992174284,0.183927862495541,-6.37413842541345e-05,-4.73025754538225e-05,0.200016254882612,3.18468168503116e-05,-2.20903365044655e-05,0.000109869155440201,0.200016270632576,0.000116505081552355
|
||||||
|
0.946000000000001,0.559730527572448,-0.292911086823616,0.184327895225045,-6.3677809969409e-05,-4.73459815381049e-05,0.200016474628084,3.17276621641937e-05,-2.13155465500492e-05,0.000109875436873907,0.20001649036805,0.000116334039297896
|
||||||
|
0.948000000000001,0.559730400280283,-0.29291118155821,0.184727928394053,-6.36144736054777e-05,-4.73878376400227e-05,0.20001669438436,3.16088960561345e-05,-2.05403714870211e-05,0.000109879935011881,0.200016710114067,0.000116166386226513
|
||||||
|
0.950000000000001,0.559730273114553,-0.292911276374967,0.185127962002583,-6.35513743851845e-05,-4.7428143024053e-05,0.200016914147824,3.14905948539667e-05,-1.97647974375936e-05,0.000109882634241609,0.200016929867009,0.000116002146919275
|
||||||
|
0.952000000000001,0.559730146074786,-0.292911371270782,0.185527996050645,-6.34885112260619e-05,-4.74668968297731e-05,0.200017133914897,3.1372730802115e-05,-1.89888521573422e-05,0.000109883543236711,0.200017149623294,0.00011584134762031
|
||||||
|
0.954000000000001,0.559730019160509,-0.292911466242554,0.185928030538242,-6.3425883461976e-05,-4.75040984326824e-05,0.200017353681997,3.12552345116401e-05,-1.82125738101835e-05,0.00010988263944578,0.200017369379339,0.000115683974606426
|
||||||
|
0.956000000000001,0.559729892371252,-0.292911561287176,0.186328065465373,-6.33634902880153e-05,-4.75397471250138e-05,0.200017573445454,3.11382031270568e-05,-1.74359658655643e-05,0.000109879917664646,0.200017589131474,0.000115530069270456
|
||||||
|
0.958000000000001,0.559729765706547,-0.292911656401542,0.186728100832024,-6.33013306494678e-05,-4.75738422961447e-05,0.200017793201668,3.10216158316834e-05,-1.66590699568481e-05,0.00010987538830165,0.200017808876095,0.000115379661184604
|
||||||
|
0.960000000000001,0.559729639165929,-0.292911751582545,0.187128136638179,-6.32394038246886e-05,-4.76063834048412e-05,0.200018012947008,3.09054101754746e-05,-1.58819034312696e-05,0.000109869034009558,0.200018028609571,0.000115232737834818
|
||||||
|
0.962000000000001,0.559729512748932,-0.292911846827076,0.187528172883812,-6.31777090087659e-05,-4.76373699098697e-05,0.200018232677804,3.07896139140062e-05,-1.51045009832984e-05,0.000109860853053645,0.200018248328231,0.000115089327518248
|
||||||
|
0.964000000000001,0.559729386455093,-0.292911942132025,0.187928209568891,-6.31162453690325e-05,-4.76668014087744e-05,0.20001845239042,3.06742339861721e-05,-1.43268764907223e-05,0.000109850850638082,0.200018468028437,0.000114949455877482
|
||||||
|
0.966000000000001,0.559729260283951,-0.292912037494282,0.188328246693374,-6.30550120728212e-05,-4.76946774158326e-05,0.200018672081206,3.05592981475477e-05,-1.35490403618821e-05,0.000109839018089253,0.200018687706539,0.000114813139896136
|
||||||
|
0.968000000000001,0.559729134235045,-0.292912132910735,0.188728284257215,-6.29940081764424e-05,-4.77209975702219e-05,0.200018891746492,3.04447855814516e-05,-1.27710411690351e-05,0.000109825318977963,0.200018907358864,0.000114680360787072
|
||||||
|
0.970000000000001,0.559729008307918,-0.292912228378272,0.18912832226036,-6.29332329304954e-05,-4.77457615805088e-05,0.200019111382482,3.03306685323079e-05,-1.1992910137204e-05,0.000109809753304213,0.200019126981615,0.000114551129492065
|
||||||
|
0.972000000000001,0.559728882502113,-0.292912323893781,0.189528360702745,-6.28726855023131e-05,-4.77689692107707e-05,0.200019330985505,3.02169747556924e-05,-1.12146576747296e-05,0.000109792355762472,0.200019346571121,0.000114425501939126
|
||||||
|
0.974000000000001,0.559728756817176,-0.292912419454149,0.189928399584302,-6.28123650314726e-05,-4.77906202112077e-05,0.200019550551905,3.01036764960294e-05,-1.04362941899527e-05,0.000109773100331889,0.200019566123724,0.000114303460715202
|
||||||
|
0.976000000000001,0.559728631252653,-0.292912515056262,0.190328438904953,-6.2752270796329e-05,-4.78107143875306e-05,0.200019770077907,2.9990766814425e-05,-9.65787172457765e-06,0.000109751971399952,0.200019785635648,0.000114185006925346
|
||||||
|
0.978000000000001,0.559728505808093,-0.292912610697006,0.190728478664614,-6.26924019642149e-05,-4.7829251698106e-05,0.200019989559791,2.98783012220305e-05,-8.87941109528611e-06,0.000109728965497213,0.200020005103173,0.000114070165663078
|
||||||
|
0.980000000000001,0.559728380483045,-0.292912706373269,0.191128518863192,-6.26327575914409e-05,-4.78462320319117e-05,0.200020208993769,2.97662450243763e-05,-8.10092271041895e-06,0.000109704068745886,0.20002022452251,0.000113958926771945
|
||||||
|
0.982000000000001,0.559728255277062,-0.292912802081934,0.191528559500589,-6.25733369841174e-05,-4.78616553889477e-05,0.200020428376066,2.96545635269929e-05,-7.32246555057436e-06,0.000109677295023758,0.200020443889882,0.000113851309537678
|
||||||
|
0.984000000000001,0.559728130189697,-0.29291289781989,0.191928600576696,-6.25141393373329e-05,-4.7875521894114e-05,0.200020647702949,2.95432914243498e-05,-6.54403614630538e-06,0.000109648623514147,0.200020663201556,0.000113747312565244
|
||||||
|
0.986000000000001,0.559728005220505,-0.292912993584022,0.1923286420914,-6.245516381842e-05,-4.78878315335329e-05,0.20002086697056,2.94324425942349e-05,-5.76563796705897e-06,0.00010961805248233,0.200020882453674,0.000113646947553592
|
||||||
|
0.988000000000001,0.559727880369042,-0.292913089371216,0.192728684044579,-6.2396409566956e-05,-4.78985844459822e-05,0.200021086175159,2.93219892810725e-05,-4.98735427956198e-06,0.000109585604479712,0.200021101642493,0.000113550242039782
|
||||||
|
0.990000000000001,0.559727755634867,-0.29291318517836,0.193128726436101,-6.23378758612957e-05,-4.79077809506511e-05,0.200021305312978,2.92119106681809e-05,-4.20919896160221e-06,0.000109551241342376,0.200021320764247,0.000113457161785582
|
||||||
|
0.992000000000001,0.559727631017539,-0.29291328100234,0.193528769265831,-6.22795619242832e-05,-4.79154212418286e-05,0.200021524380124,2.91022483889236e-05,-3.4311546659449e-06,0.000109514923171683,0.200021539815041,0.00011336768534698
|
||||||
|
0.994000000000001,0.559727506516619,-0.292913376840045,0.193928812533622,-6.22214668677401e-05,-4.79215055693149e-05,0.20002174337267,2.89929885655127e-05,-2.65327690374128e-06,0.000109476691600996,0.200021758790948,0.00011328185763037
|
||||||
|
0.996000000000001,0.559727382131671,-0.292913472688362,0.194328856239321,-6.21635899700212e-05,-4.79260343494436e-05,0.200021962286891,2.88841034419423e-05,-1.87560383923987e-06,0.000109436572304222,0.20002197768824,0.000113199702645828
|
||||||
|
0.998000000000001,0.559727257862259,-0.292913568544182,0.194728900382769,-6.21059304539723e-05,-4.79290079846719e-05,0.20002218111896,2.87756138357555e-05,-1.09815975790528e-06,0.000109394486177975,0.200022196503094,0.000113121154134059
|
||||||
|
1,0.559727133707949,-0.292913664404394,0.195128944963797,-6.20484875146782e-05,-4.79304269884752e-05,0.200022399864835,6.47104314581583e-05,1.17001859593062e-05,-0.0248962396563058,0.200022415231465,0.0248963265032917
|
||||||
|
1.002,0.559727009668309,-0.29291376026589,0.195528989982229,-6.18470887281397e-05,-4.78822072408347e-05,0.199922596160334,0.000208561473647326,6.05797356726379e-05,-0.124918854036565,0.199922611460676,0.124919042830152
|
||||||
|
1.004,0.559726886319594,-0.292913855933223,0.195928635348438,-6.12142416200889e-05,-4.76881080457847e-05,0.199522724448689,0.000459439777888981,0.00014546347806843,-0.299958929307967,0.199522739538045,0.299959316434937
|
||||||
|
1.006,0.559726764811343,-0.292913951018322,0.196327080880023,-6.00093296165837e-05,-4.73003533285609e-05,0.198722760443103,0.000743686244530916,0.000241945054268999,-0.500005546889836,0.198722775133022,0.500006158489317
|
||||||
|
1.008,0.559726646282276,-0.292914045134637,0.196723526390211,-5.82394966419652e-05,-4.67203278287087e-05,0.19752270226113,0.00102349224928577,0.000337419873291944,-0.700052949590204,0.197522716372489,0.700053779090221
|
||||||
|
1.01,0.559726531853356,-0.292914137899634,0.197117171689068,-5.59153606194406e-05,-4.59506738353932e-05,0.195922548644742,0.00129711919677477,0.00043125516352438,-0.900100815097448,0.195922562012248,0.900101853035709
|
||||||
|
1.012,0.559726422620833,-0.292914228937332,0.19750721658479,-5.30510198548661e-05,-4.49953071746112e-05,0.19392229900074,0.00156282526503348,0.000522810704450815,-1.10014880104481,0.193922311477356,1.10015003531072
|
||||||
|
1.014,0.559726319649277,-0.292914317880862,0.197892860885071,-4.96640595593067e-05,-4.38594310175899e-05,0.191521953440562,0.00181886569694533,0.000611439794628854,-1.30019654553948,0.191521964901829,1.30019796152887
|
||||||
|
1.016,0.559726223964595,-0.292914404375056,0.198273304398552,-4.57755570670848e-05,-4.25495479960957e-05,0.188721512818582,0.00206349316800302,0.000696490178031526,-1.5002436680768,0.188721523166807,1.50024524885338
|
||||||
|
1.018,0.559726136547048,-0.292914488079054,0.198647746936345,-4.14100868872946e-05,-4.10734703054638e-05,0.185520978768255,0.002294958015292,0.000777305032839679,-1.70028977063662,0.185520987936559,1.70029149711657
|
||||||
|
1.02,0.559726058324248,-0.292914568668937,0.199015388313625,-3.65957250059168e-05,-3.9440327864737e-05,0.181920353736035,0.00251150856361848,0.000853224046970524,-1.90033443890278,0.181920361692227,1.90033629006723
|
||||||
|
1.022,0.559725990164148,-0.292914645840366,0.199375428351289,-3.13640526328207e-05,-3.76605741175817e-05,0.177919641012644,0.0027113915071486,0.000923584472789506,-2.1003772436648,0.177919647762946,2.10037919680164
|
||||||
|
1.024,0.559725932868037,-0.292914719311234,0.199727066877676,-2.57501589773223e-05,-3.5745989973579e-05,0.173518844761376,0.00289285265187011,0.000987722077738781,-2.30041774234613,0.173518850353986,2.30041977332231
|
||||||
|
1.026,0.559725887163512,-0.292914788824326,0.200069503730335,-1.97926420253402e-05,-3.37096858066266e-05,0.16871797004326,0.00305413732498704,0.0010449723482353,-2.50045548068518,0.168717974571798,2.5004575642491
|
||||||
|
1.028,0.559725853697469,-0.292914854149977,0.200401938757849,-1.35336096773741e-05,-3.15661005806378e-05,0.163517022838636,0.00319349088839793,0.0010946715374438,-2.70048999475615,0.16351702644553,2.7004921048705
|
||||||
|
1.03,0.559725833029074,-0.292914915088728,0.200723571821689,-7.01867847174852e-06,-2.93309996568513e-05,0.157916010064235,0.00330915968238531,0.00113615756733298,-2.90052081296579,0.15791601294415,2.90052292317085
|
||||||
|
1.032,0.559725825622755,-0.292914971473976,0.201033602798106,-2.96970947832875e-07,-2.70214703113058e-05,0.151914939586772,0.00339939158766622,0.00116877119787917,-3.10054745819577,0.151914941990249,3.10054954200276
|
||||||
|
1.034,0.55972583184119,-0.292915023174609,0.201331231580036,6.57888787891636e-06,-2.46559148653347e-05,0.145513820231452,0.00346243698989834,0.00119185697075585,-3.30056945031797,0.145513822469026,3.30057148163242
|
||||||
|
1.036,0.559725851938307,-0.292915070097635,0.201615658079031,1.35527770117605e-05,-2.22540424282824e-05,0.1387126617855,0.00349654961928624,0.00120476418424831,-3.50058630869085,0.138712664232718,3.50058826226534
|
||||||
|
1.038,0.559725886052298,-0.292915112190779,0.201886082227178,2.05650863560613e-05,-1.98368581283414e-05,0.131511474996689,0.00349998735549306,0.00120684794102654,-3.70059755486033,0.13151147810069,3.70059940677611
|
||||||
|
1.04,0.559725934198652,-0.292915149445068,0.202141703979018,2.75527264337327e-05,-1.74266506641762e-05,0.123910271566059,0.00347101347664135,0.0011974700987738,-3.90060271541342,0.123910275854811,3.90060444359073
|
||||||
|
1.042,0.559725996263204,-0.292915181897382,0.202381723313443,3.44491402626268e-05,-1.50469777332462e-05,0.115909064135035,0.00340789761688053,0.00117600024163167,-4.10060132499494,0.115909070230998,4.10060290973083
|
||||||
|
1.044,0.559726071995213,-0.292915209632978,0.202605340235558,4.11843169012549e-05,-1.27226496976496e-05,0.107507866266079,0.00329489877742839,0.00113709665294781,-4.2801538298609,0.107507874907371,4.28015524912587
|
||||||
|
1.046,0.559726161000471,-0.29291523278798,0.202811754778507,4.76287353723403e-05,-1.0498591121455e-05,0.0987884488155912,0.00307491947182381,0.00106157932097672,-4.34575395964232,0.0987884608550388,4.34575517716166
|
||||||
|
1.048,0.559726262510155,-0.292915251627343,0.203000494030821,5.34839947885501e-05,-8.47633241374268e-06,0.09012485042751,0.0027336183941462,0.00094485897925156,-4.23827163429507,0.0901248666959733,4.2382726211864
|
||||||
|
1.05,0.55972637493645,-0.29291526669331,0.203172254180217,5.85632089489251e-05,-6.71915520444876e-06,0.0818353622784109,0.00235898493794462,0.000816859906105359,-4.04471370012322,0.0818353835088176,4.04471447052008
|
||||||
|
1.052,0.55972649676299,-0.292915278503964,0.203327835479934,6.29199345403286e-05,-5.20889278932124e-06,0.0739459956270171,0.00201515260034313,0.000699331623860154,-3.84465549212696,0.073946022579457,3.84465608384504
|
||||||
|
1.054,0.559726626616189,-0.292915287528881,0.203468038162725,6.66238193502977e-05,-3.92182870900814e-06,0.0664567403099031,0.00170527032078426,0.00059338974012224,-3.6446023173979,0.0664567738212738,3.64460276464259
|
||||||
|
1.056,0.559726763258268,-0.292915294191279,0.203593662441174,6.97410158234656e-05,-2.83533382883227e-06,0.0593675863574255,0.00142758697224687,0.00049848331365454,-3.4445540629778,0.0593676273886264,3.44455439487709
|
||||||
|
1.058,0.559726905580252,-0.292915298870217,0.203705508508155,7.23341672392851e-05,-1.92789545438998e-06,0.0526785240579918,0.00118034510637743,0.000414047972990827,-3.24451058548481,0.0526785737551517,3.2445108266075
|
||||||
|
1.06,0.559727052594937,-0.29291530190286,0.203804376537406,7.44623962489754e-05,-1.17914193686896e-06,0.0463895440154862,0.000961782119224263,0.000339507880142697,-3.04447171429848,0.0463896037922676,3.04447188514757
|
||||||
|
1.062,0.559727203429837,-0.292915303586784,0.203891066684217,7.61812957161822e-05,-5.69863933819192e-07,0.0405006372007979,0.000770131187988187,0.000274277423689683,-2.84443725456946,0.0405007088528734,2.84443737204967
|
||||||
|
1.064,0.55972735732012,-0.292915304182316,0.203966379086209,7.75429210009281e-05,-8.20322421102303e-08,0.0350117949972084,0.000398973742932185,0.00021421258517007,-2.64440716362356,0.0350118808668982,2.64440720239729
|
||||||
|
1.066,0.559727513601521,-0.292915303914913,0.204031113864205,7.77771906879109e-05,2.86986406861089e-07,0.0299230085463037,-0.00115535531142186,0.000141854781393613,-2.44438170280032,0.0299231096284446,2.4443819799601
|
||||||
|
1.068,0.559727668428882,-0.292915303034371,0.204086071120394,7.29214997552407e-05,4.85386883464222e-07,0.0252342681860071,-0.00401650483705662,5.56669155216126e-05,-2.24435995451258,0.0252343735540246,2.24436354916703
|
||||||
|
1.07,0.55972780528752,-0.292915301973366,0.20413205093695,6.17111713396845e-05,5.0965406894754e-07,0.0209455687282534,-0.00626615419968556,-1.15940174127971e-05,-2.04434003984142,0.0209456596429523,2.04434964311923
|
||||||
|
1.072,0.559727915273568,-0.292915300995754,0.204169853395307,4.78568829564984e-05,4.39010813813034e-07,0.0170569080266414,-0.00686163004193217,-4.41210054602514e-05,-1.84432192848992,0.0170569751686306,1.84433469300511
|
||||||
|
1.074,0.559727996715052,-0.292915300217322,0.204200278569056,3.42646511719557e-05,3.33170047106534e-07,0.0135682810142937,-0.00631623352231879,-5.29287308426162e-05,-1.64430670730048,0.0135683242834244,1.64431883930115
|
||||||
|
1.076,0.559728052332172,-0.292915299663074,0.204224126519365,2.25919488672232e-05,2.27295890442569e-07,0.0104796811974395,-0.00517427409252313,-4.84691488333854e-05,-1.44429475571785,0.0104797055515784,1.44430402507772
|
||||||
|
1.078,0.559728087082847,-0.292915299308139,0.204242197293846,1.35675548018632e-05,1.39293451772993e-07,0.00779110199142229,-0.00383122115282796,-3.79535396166641e-05,-1.24428593613682,0.00779111380604149,1.24429183496633
|
||||||
|
1.08,0.559728106602392,-0.2929152991059,0.20425529092733,7.26706425591139e-06,7.54817319759126e-08,0.00550253745289219,-0.00255506633906055,-2.60802768270451e-05,-1.04427983641311,0.00550254225212326,1.04428296250737
|
||||||
|
1.082,0.559728116151104,-0.292915299006212,0.204264207443657,3.34728944562101e-06,3.4972344464812e-08,0.00361398264576984,-0.00150598635645371,-1.56192385414311e-05,-0.844275922229352,0.00361398419607713,0.844277265532532
|
||||||
|
1.084,0.559728119991549,-0.292915298966011,0.204269746857913,1.24311883009653e-06,1.30047778101883e-08,0.00212543376397478,-0.000754516962797601,-7.88577883548135e-06,-0.644273639664044,0.00212543412755078,0.644274081524305
|
||||||
|
1.086,0.55972812112358,-0.292915298954193,0.204272709178713,3.29221594430606e-07,3.42922912288656e-09,0.00103688808711366,-0.000298867597336993,-3.12933359780664e-06,-0.444272481940274,0.00103688813938479,0.44427258247725
|
||||||
|
1.088,0.559728121308436,-0.292915298952294,0.204273894410262,4.764844074856e-08,4.87443418961675e-10,0.000348343836213682,-8.15881945337436e-05,-8.50951253905661e-07,-0.233204047222351,0.000348343839472835,0.233204061496026
|
||||||
|
1.09,0.559728121314173,-0.292915298952243,0.204274102554058,2.8688162956314e-09,2.54241072639161e-11,0.000104071898224256,-2.23898122264643e-05,-2.31009655848879e-07,-0.122135968994713,0.0001040718982638,0.122135971047168
|
||||||
|
|||||||
|
6501
data/ik_speedl_q.csv
Normal file
6501
data/ik_speedl_qd.csv
Normal file
6501
data/ik_speedl_tcp.csv
Normal file
6501
data/ik_speedl_twist.csv
Normal file
BIN
data/s_curve_acceleration.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
544
data/s_curve_acceleration.svg
Normal file
@ -0,0 +1,544 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="1920" height="1080"
|
||||||
|
viewBox="0 0 1920 1080"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
>
|
||||||
|
|
||||||
|
<title>Gnuplot</title>
|
||||||
|
<desc>Produced by GNUPLOT 5.4 patchlevel 2 </desc>
|
||||||
|
|
||||||
|
<g id="gnuplot_canvas">
|
||||||
|
|
||||||
|
<rect x="0" y="0" width="1920" height="1080" fill="none"/>
|
||||||
|
<defs>
|
||||||
|
|
||||||
|
<circle id='gpDot' r='0.5' stroke-width='0.5' stroke='currentColor'/>
|
||||||
|
<path id='gpPt0' stroke-width='0.148' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
|
||||||
|
<path id='gpPt1' stroke-width='0.148' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
|
||||||
|
<path id='gpPt2' stroke-width='0.148' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
|
||||||
|
<rect id='gpPt3' stroke-width='0.148' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||||
|
<rect id='gpPt4' stroke-width='0.148' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||||
|
<circle id='gpPt5' stroke-width='0.148' stroke='currentColor' cx='0' cy='0' r='1'/>
|
||||||
|
<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
|
||||||
|
<path id='gpPt7' stroke-width='0.148' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
|
||||||
|
<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
|
||||||
|
<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
|
||||||
|
<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
|
||||||
|
<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
|
||||||
|
<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
|
||||||
|
<path id='gpPt13' stroke-width='0.148' stroke='currentColor' d='M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z'/>
|
||||||
|
<use xlink:href='#gpPt13' id='gpPt14' fill='currentColor' stroke='none'/>
|
||||||
|
<filter id='textbox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||||
|
<feFlood flood-color='white' flood-opacity='1' result='bgnd'/>
|
||||||
|
<feComposite in='SourceGraphic' in2='bgnd' operator='atop'/>
|
||||||
|
</filter>
|
||||||
|
<filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||||
|
<feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/>
|
||||||
|
<feComposite in='SourceGraphic' in2='grey' operator='atop'/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<g fill="none" color="white" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,961.21 L1737.59,961.21 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,961.21 L259.71,961.21 '/> <g transform="translate(236.99,966.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >-6</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,814.51 L1737.59,814.51 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,814.51 L259.71,814.51 '/> <g transform="translate(236.99,819.71)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >-4</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,667.81 L1737.59,667.81 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,667.81 L259.71,667.81 '/> <g transform="translate(236.99,673.01)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >-2</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,521.11 L1737.59,521.11 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,521.11 L259.71,521.11 '/> <g transform="translate(236.99,526.31)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >0</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,374.41 L1737.59,374.41 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,374.41 L259.71,374.41 '/> <g transform="translate(236.99,379.61)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >2</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,227.71 L1737.59,227.71 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,227.71 L259.71,227.71 '/> <g transform="translate(236.99,232.91)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >4</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,81.01 L1737.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L259.71,81.01 '/> <g transform="translate(236.99,86.21)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >6</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,961.21 L249.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,961.21 L249.59,951.09 '/> <g transform="translate(249.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >0</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M497.59,961.21 L497.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M497.59,961.21 L497.59,951.09 '/> <g transform="translate(497.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >0.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M745.59,961.21 L745.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M745.59,961.21 L745.59,951.09 '/> <g transform="translate(745.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >1</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M993.59,961.21 L993.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M993.59,961.21 L993.59,951.09 '/> <g transform="translate(993.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >1.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1241.59,961.21 L1241.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1241.59,961.21 L1241.59,951.09 '/> <g transform="translate(1241.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >2</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1489.59,961.21 L1489.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1489.59,961.21 L1489.59,951.09 '/> <g transform="translate(1489.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >2.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1737.59,961.21 L1737.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1737.59,961.21 L1737.59,951.09 '/> <g transform="translate(1737.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >3</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L249.59,961.21 L1737.59,961.21 L1737.59,81.01 L249.59,81.01 Z '/></g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(192.41,521.11) rotate(270)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >acceleration [m/s</tspan><tspan font-family="Helvetica" font-size="8.8" dy="-5.50px">2</tspan><tspan font-family="Helvetica" font-size="11.0" dy="5.50px">]</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(993.59,1032.29)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >time [s]</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1534.62,145.12 L1534.62,94.51 L1724.99,94.51 L1724.99,145.12 L1534.62,145.12 Z '/></g>
|
||||||
|
<g id="gnuplot_plot_1a" ><title>gnuplot_plot_1a</title>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 0, 0)" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(216, 51, 45)' d='M249.59,521.11 L252.07,517.44 L254.55,513.77 L257.03,510.11 L259.51,506.44 L261.99,502.77 L264.47,499.10 L266.95,495.44
|
||||||
|
L269.43,491.77 L271.91,488.10 L274.39,484.43 L276.87,480.77 L279.35,477.10 L281.83,473.43 L284.31,469.76 L286.79,466.10
|
||||||
|
L289.27,462.43 L291.75,458.76 L294.23,455.09 L296.71,451.43 L299.19,447.76 L301.67,444.09 L304.15,440.42 L306.63,436.76
|
||||||
|
L309.11,433.09 L311.59,429.42 L314.07,425.75 L316.55,422.09 L319.03,418.42 L321.51,414.75 L323.99,411.08 L326.47,407.42
|
||||||
|
L328.95,403.75 L331.43,400.08 L333.91,396.41 L336.39,392.75 L338.87,389.08 L341.35,385.41 L343.83,381.74 L346.31,378.08
|
||||||
|
L348.79,374.41 L351.27,370.74 L353.75,367.07 L356.23,363.41 L358.71,359.74 L361.19,356.07 L363.67,352.40 L366.15,348.74
|
||||||
|
L368.63,345.07 L371.11,341.40 L373.59,337.73 L376.07,334.07 L378.55,330.40 L381.03,326.73 L383.51,323.06 L385.99,319.40
|
||||||
|
L388.47,315.73 L390.95,312.06 L393.43,308.39 L395.91,304.73 L398.39,301.06 L400.87,297.39 L403.35,293.72 L405.83,290.06
|
||||||
|
L408.31,286.39 L410.79,282.72 L413.27,279.05 L415.75,275.39 L418.23,271.72 L420.71,268.05 L423.19,264.38 L425.67,260.72
|
||||||
|
L428.15,257.05 L430.63,253.38 L433.11,249.71 L435.59,246.05 L438.07,242.38 L440.55,238.71 L443.03,235.04 L445.51,231.38
|
||||||
|
L447.99,227.71 L450.47,224.04 L452.95,220.37 L455.43,216.71 L457.91,213.04 L460.39,209.37 L462.87,205.70 L465.35,202.04
|
||||||
|
L467.83,198.37 L470.31,194.70 L472.79,191.03 L475.27,187.37 L477.75,183.70 L480.23,180.03 L482.71,176.36 L485.19,172.70
|
||||||
|
L487.67,169.03 L490.15,165.36 L492.63,161.69 L495.11,158.03 L497.59,154.36 L500.07,154.36 L502.55,154.36 L505.03,154.36
|
||||||
|
L507.51,154.36 L509.99,154.36 L512.47,154.36 L514.95,154.36 L517.43,154.36 L519.91,154.36 L522.39,154.36 L524.87,154.36
|
||||||
|
L527.35,154.36 L529.83,154.36 L532.31,154.36 L534.79,154.36 L537.27,154.36 L539.75,154.36 L542.23,154.36 L544.71,154.36
|
||||||
|
L547.19,154.36 L549.67,158.03 L552.15,161.69 L554.63,165.36 L557.11,169.03 L559.59,172.70 L562.07,176.36 L564.55,180.03
|
||||||
|
L567.03,183.70 L569.51,187.37 L571.99,191.03 L574.47,194.70 L576.95,198.37 L579.43,202.04 L581.91,205.70 L584.39,209.37
|
||||||
|
L586.87,213.04 L589.35,216.71 L591.83,220.37 L594.31,224.04 L596.79,227.71 L599.27,231.38 L601.75,235.04 L604.23,238.71
|
||||||
|
L606.71,242.38 L609.19,246.05 L611.67,249.71 L614.15,253.38 L616.63,257.05 L619.11,260.72 L621.59,264.38 L624.07,268.05
|
||||||
|
L626.55,271.72 L629.03,275.39 L631.51,279.05 L633.99,282.72 L636.47,286.39 L638.95,290.06 L641.43,293.72 L643.91,297.39
|
||||||
|
L646.39,301.06 L648.87,304.73 L651.35,308.39 L653.83,312.06 L656.31,315.73 L658.79,319.40 L661.27,323.06 L663.75,326.73
|
||||||
|
L666.23,330.40 L668.71,334.07 L671.19,337.73 L673.67,341.40 L676.15,345.07 L678.63,348.74 L681.11,352.40 L683.59,356.07
|
||||||
|
L686.07,359.74 L688.55,363.41 L691.03,367.07 L693.51,370.74 L695.99,374.41 L698.47,378.08 L700.95,381.74 L703.43,385.41
|
||||||
|
L705.91,389.08 L708.39,392.75 L710.87,396.41 L713.35,400.08 L715.83,403.75 L718.31,407.42 L720.79,411.08 L723.27,414.75
|
||||||
|
L725.75,418.42 L728.23,422.09 L730.71,425.75 L733.19,429.42 L735.67,433.09 L738.15,436.76 L740.63,440.42 L743.11,444.09
|
||||||
|
L745.59,447.76 L748.07,451.43 L750.55,455.09 L753.03,458.76 L755.51,462.43 L757.99,466.10 L760.47,469.76 L762.95,473.43
|
||||||
|
L765.43,477.10 L767.91,480.77 L770.39,484.43 L772.87,488.10 L775.35,491.77 L777.83,495.44 L780.31,499.10 L782.79,502.77
|
||||||
|
L785.27,506.44 L787.75,510.11 L790.23,513.77 L792.71,517.44 L795.19,521.11 L797.67,521.11 L800.15,521.11 L802.63,521.11
|
||||||
|
L805.11,521.11 L807.59,521.11 L810.07,521.11 L812.55,521.11 L815.03,521.11 L817.51,521.11 L819.99,521.11 L822.47,521.11
|
||||||
|
L824.95,521.11 L827.43,521.11 L829.91,521.11 L832.39,521.11 L834.87,521.11 L837.35,521.11 L839.83,521.11 L842.31,521.11
|
||||||
|
L844.79,521.11 L847.27,521.11 L849.75,521.11 L852.23,521.11 L854.71,521.11 L857.19,521.11 L859.67,521.11 L862.15,521.11
|
||||||
|
L864.63,521.11 L867.11,521.11 L869.59,521.11 L872.07,521.11 L874.55,521.11 L877.03,521.11 L879.51,521.11 L881.99,521.11
|
||||||
|
L884.47,521.11 L886.95,521.11 L889.43,521.11 L891.91,521.11 L894.39,521.11 L896.87,521.11 L899.35,521.11 L901.83,521.11
|
||||||
|
L904.31,521.11 L906.79,521.11 L909.27,521.11 L911.75,521.11 L914.23,521.11 L916.71,521.11 L919.19,521.11 L921.67,521.11
|
||||||
|
L924.15,521.11 L926.63,521.11 L929.11,521.11 L931.59,521.11 L934.07,521.11 L936.55,521.11 L939.03,521.11 L941.51,521.11
|
||||||
|
L943.99,521.11 L946.47,521.11 L948.95,521.11 L951.43,521.11 L953.91,521.11 L956.39,521.11 L958.87,521.11 L961.35,521.11
|
||||||
|
L963.83,521.11 L966.31,521.11 L968.79,521.11 L971.27,521.11 L973.75,521.11 L976.23,521.11 L978.71,521.11 L981.19,521.11
|
||||||
|
L983.67,521.11 L986.15,521.11 L988.63,521.11 L991.11,521.11 L993.59,521.11 L996.07,521.11 L998.55,521.11 L1001.03,521.11
|
||||||
|
L1003.51,521.11 L1005.99,521.11 L1008.47,521.11 L1010.95,521.11 L1013.43,521.11 L1015.91,521.11 L1018.39,521.11 L1020.87,521.11
|
||||||
|
L1023.35,521.11 L1025.83,521.11 L1028.31,521.11 L1030.79,521.11 L1033.27,521.11 L1035.75,521.11 L1038.23,521.11 L1040.71,521.11
|
||||||
|
L1043.19,521.11 L1045.67,521.11 L1048.15,521.11 L1050.63,521.11 L1053.11,521.11 L1055.59,521.11 L1058.07,521.11 L1060.55,521.11
|
||||||
|
L1063.03,521.11 L1065.51,521.11 L1067.99,521.11 L1070.47,521.11 L1072.95,521.11 L1075.43,521.11 L1077.91,523.55 L1080.39,527.22
|
||||||
|
L1082.87,530.89 L1085.35,534.56 L1087.83,538.22 L1090.31,541.89 L1092.79,545.56 L1095.27,549.23 L1097.75,552.89 L1100.23,556.56
|
||||||
|
L1102.71,560.23 L1105.19,563.90 L1107.67,567.56 L1110.15,571.23 L1112.63,574.90 L1115.11,578.57 L1117.59,582.23 L1120.07,585.90
|
||||||
|
L1122.55,589.57 L1125.03,593.24 L1127.51,596.90 L1129.99,600.57 L1132.47,604.24 L1134.95,607.91 L1137.43,611.57 L1139.91,615.24
|
||||||
|
L1142.39,618.91 L1144.87,622.58 L1147.35,626.24 L1149.83,629.91 L1152.31,633.58 L1154.79,637.25 L1157.27,640.91 L1159.75,644.58
|
||||||
|
L1162.23,648.25 L1164.71,651.92 L1167.19,655.58 L1169.67,659.25 L1172.15,662.92 L1174.63,666.59 L1177.11,670.25 L1179.59,673.92
|
||||||
|
L1182.07,677.59 L1184.55,681.26 L1187.03,684.92 L1189.51,688.59 L1191.99,692.26 L1194.47,695.93 L1196.95,699.59 L1199.43,703.26
|
||||||
|
L1201.91,706.93 L1204.39,710.60 L1206.87,714.26 L1209.35,717.93 L1211.83,721.60 L1214.31,725.27 L1216.79,728.93 L1219.27,732.60
|
||||||
|
L1221.75,736.27 L1224.23,739.94 L1226.71,743.60 L1229.19,747.27 L1231.67,750.94 L1234.15,754.61 L1236.63,758.27 L1239.11,761.94
|
||||||
|
L1241.59,765.61 L1244.07,769.28 L1246.55,772.94 L1249.03,776.61 L1251.51,780.28 L1253.99,783.95 L1256.47,787.61 L1258.95,791.28
|
||||||
|
L1261.43,794.95 L1263.91,798.62 L1266.39,802.28 L1268.87,805.95 L1271.35,809.62 L1273.83,813.29 L1276.31,816.95 L1278.79,820.62
|
||||||
|
L1281.27,824.29 L1283.75,827.96 L1286.23,831.62 L1288.71,835.29 L1291.19,838.96 L1293.67,842.63 L1296.15,846.29 L1298.63,849.96
|
||||||
|
L1301.11,853.63 L1303.59,857.30 L1306.07,860.96 L1308.55,864.63 L1311.03,868.30 L1313.51,871.97 L1315.99,875.63 L1318.47,879.30
|
||||||
|
L1320.95,882.97 L1323.43,886.64 L1325.91,887.86 L1328.39,887.86 L1330.87,887.86 L1333.35,887.86 L1335.83,887.86 L1338.31,887.86
|
||||||
|
L1340.79,887.86 L1343.27,887.86 L1345.75,887.86 L1348.23,887.86 L1350.71,887.86 L1353.19,887.86 L1355.67,887.86 L1358.15,887.86
|
||||||
|
L1360.63,887.86 L1363.11,887.86 L1365.59,887.86 L1368.07,887.86 L1370.55,887.86 L1373.03,887.86 L1375.51,885.42 L1377.99,881.75
|
||||||
|
L1380.47,878.08 L1382.95,874.41 L1385.43,870.75 L1387.91,867.08 L1390.39,863.41 L1392.87,859.74 L1395.35,856.08 L1397.83,852.41
|
||||||
|
L1400.31,848.74 L1402.79,845.07 L1405.27,841.41 L1407.75,837.74 L1410.23,834.07 L1412.71,830.40 L1415.19,826.74 L1417.67,823.07
|
||||||
|
L1420.15,819.40 L1422.63,815.73 L1425.11,812.07 L1427.59,808.40 L1430.07,804.73 L1432.55,801.06 L1435.03,797.40 L1437.51,793.73
|
||||||
|
L1439.99,790.06 L1442.47,786.39 L1444.95,782.73 L1447.43,779.06 L1449.91,775.39 L1452.39,771.72 L1454.87,768.06 L1457.35,764.39
|
||||||
|
L1459.83,760.72 L1462.31,757.05 L1464.79,753.39 L1467.27,749.72 L1469.75,746.05 L1472.23,742.38 L1474.71,738.72 L1477.19,735.05
|
||||||
|
L1479.67,731.38 L1482.15,727.71 L1484.63,724.05 L1487.11,720.38 L1489.59,716.71 L1492.07,713.04 L1494.55,709.38 L1497.03,705.71
|
||||||
|
L1499.51,702.04 L1501.99,698.37 L1504.47,694.71 L1506.95,691.04 L1509.43,687.37 L1511.91,683.70 L1514.39,680.04 L1516.87,676.37
|
||||||
|
L1519.35,672.70 L1521.83,669.03 L1524.31,665.37 L1526.79,661.70 L1529.27,658.03 L1531.75,654.36 L1534.23,650.70 L1536.71,647.03
|
||||||
|
L1539.19,643.36 L1541.67,639.69 L1544.15,636.03 L1546.63,632.36 L1549.11,628.69 L1551.59,625.02 L1554.07,621.36 L1556.55,617.69
|
||||||
|
L1559.03,614.02 L1561.51,610.35 L1563.99,606.69 L1566.47,603.02 L1568.95,599.35 L1571.43,595.68 L1573.91,592.02 L1576.39,588.35
|
||||||
|
L1578.87,584.68 L1581.35,581.01 L1583.83,577.35 L1586.31,573.68 L1588.79,570.01 L1591.27,566.34 L1593.75,562.68 L1596.23,559.01
|
||||||
|
L1598.71,555.34 L1601.19,551.67 L1603.67,548.01 L1606.15,544.34 L1608.63,540.67 L1611.11,537.00 L1613.59,533.34 L1616.07,529.67
|
||||||
|
L1618.55,526.00 L1621.03,522.33 L1621.86,521.11 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_2a" ><title>gnuplot_plot_2a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 114, 178)' d='M249.59,521.11 L252.07,517.44 L254.55,513.77 L257.03,510.11 L259.51,506.44 L261.99,502.77 L264.47,499.10 L266.95,495.44
|
||||||
|
L269.43,491.77 L271.91,488.10 L274.39,484.43 L276.87,480.77 L279.35,477.10 L281.83,473.43 L284.31,469.76 L286.79,466.10
|
||||||
|
L289.27,462.43 L291.75,458.76 L294.23,455.09 L296.71,451.43 L299.19,447.76 L301.67,444.09 L304.15,440.42 L306.63,436.76
|
||||||
|
L309.11,433.09 L311.59,429.42 L314.07,425.75 L316.55,422.09 L319.03,418.42 L321.51,414.75 L323.99,411.08 L326.47,407.42
|
||||||
|
L328.95,403.75 L331.43,400.08 L333.91,396.41 L336.39,392.75 L338.87,389.08 L341.35,385.41 L343.83,381.74 L346.31,378.08
|
||||||
|
L348.79,374.41 L351.27,370.74 L353.75,367.07 L356.23,363.41 L358.71,359.74 L361.19,356.07 L363.67,352.40 L366.15,348.74
|
||||||
|
L368.63,345.07 L371.11,341.40 L373.59,337.73 L376.07,334.07 L378.55,330.40 L381.03,326.73 L383.51,323.06 L385.99,319.40
|
||||||
|
L388.47,315.73 L390.95,312.06 L393.43,308.39 L395.91,304.73 L398.39,301.06 L400.87,297.39 L403.35,293.72 L405.83,290.06
|
||||||
|
L408.31,286.39 L410.79,282.72 L413.27,279.05 L415.75,275.39 L418.23,271.72 L420.71,268.05 L423.19,264.38 L425.67,260.72
|
||||||
|
L428.15,257.05 L430.63,253.38 L433.11,249.71 L435.59,246.05 L438.07,242.38 L440.55,238.71 L443.03,235.04 L445.51,231.38
|
||||||
|
L447.99,227.71 L450.47,224.04 L452.95,220.37 L455.43,216.71 L457.91,213.04 L460.39,209.37 L462.87,205.70 L465.35,202.04
|
||||||
|
L467.83,198.37 L470.31,194.70 L472.79,191.03 L475.27,187.37 L477.75,183.70 L480.23,180.03 L482.71,176.36 L485.19,172.70
|
||||||
|
L487.67,169.03 L490.15,165.36 L492.63,161.69 L495.11,158.03 L497.59,154.36 L500.07,154.36 L502.55,154.36 L505.03,154.36
|
||||||
|
L507.51,154.36 L509.99,154.36 L512.47,154.36 L514.95,154.36 L517.43,154.36 L519.91,154.36 L522.39,154.36 L524.87,154.36
|
||||||
|
L527.35,154.36 L529.83,154.36 L532.31,154.36 L534.79,154.36 L537.27,154.36 L539.75,154.36 L542.23,154.36 L544.71,154.36
|
||||||
|
L547.19,154.36 L549.67,158.03 L552.15,161.69 L554.63,165.36 L557.11,169.03 L559.59,172.70 L562.07,176.36 L564.55,180.03
|
||||||
|
L567.03,183.70 L569.51,187.37 L571.99,191.03 L574.47,194.70 L576.95,198.37 L579.43,202.04 L581.91,205.70 L584.39,209.37
|
||||||
|
L586.87,213.04 L589.35,216.71 L591.83,220.37 L594.31,224.04 L596.79,227.71 L599.27,231.38 L601.75,235.04 L604.23,238.71
|
||||||
|
L606.71,242.38 L609.19,246.05 L611.67,249.71 L614.15,253.38 L616.63,257.05 L619.11,260.72 L621.59,264.38 L624.07,268.05
|
||||||
|
L626.55,271.72 L629.03,275.39 L631.51,279.05 L633.99,282.72 L636.47,286.39 L638.95,290.06 L641.43,293.72 L643.91,297.39
|
||||||
|
L646.39,301.06 L648.87,304.73 L651.35,308.39 L653.83,312.06 L656.31,315.73 L658.79,319.40 L661.27,323.06 L663.75,326.73
|
||||||
|
L666.23,330.40 L668.71,334.07 L671.19,337.73 L673.67,341.40 L676.15,345.07 L678.63,348.74 L681.11,352.40 L683.59,356.07
|
||||||
|
L686.07,359.74 L688.55,363.41 L691.03,367.07 L693.51,370.74 L695.99,374.41 L698.47,378.08 L700.95,381.74 L703.43,385.41
|
||||||
|
L705.91,389.08 L708.39,392.75 L710.87,396.41 L713.35,400.08 L715.83,403.75 L718.31,407.42 L720.79,411.08 L723.27,414.75
|
||||||
|
L725.75,418.42 L728.23,422.09 L730.71,425.75 L733.19,429.42 L735.67,433.09 L738.15,436.76 L740.63,440.42 L743.11,444.09
|
||||||
|
L745.59,447.76 L748.07,451.43 L750.55,455.09 L753.03,458.76 L755.51,462.43 L757.99,466.10 L760.47,469.76 L762.95,473.43
|
||||||
|
L765.43,477.10 L767.91,480.77 L770.39,484.43 L772.87,488.10 L775.35,491.77 L777.83,495.44 L780.31,499.10 L782.79,502.77
|
||||||
|
L785.27,506.44 L787.75,510.11 L790.23,513.77 L792.71,517.44 L795.19,521.11 L797.67,521.11 L800.15,521.11 L802.63,521.11
|
||||||
|
L805.11,521.11 L807.59,521.11 L810.07,521.11 L812.55,521.11 L815.03,521.11 L817.51,521.11 L819.99,521.11 L822.47,521.11
|
||||||
|
L824.95,521.11 L827.43,521.11 L829.91,521.11 L832.39,521.11 L834.87,521.11 L837.35,521.11 L839.83,521.11 L842.31,521.11
|
||||||
|
L844.79,521.11 L847.27,521.11 L849.75,521.11 L852.23,521.11 L854.71,521.11 L857.19,521.11 L859.67,521.11 L862.15,521.11
|
||||||
|
L864.63,521.11 L867.11,521.11 L869.59,521.11 L872.07,521.11 L874.55,521.11 L877.03,521.11 L879.51,521.11 L881.99,521.11
|
||||||
|
L884.47,521.11 L886.95,521.11 L889.43,521.11 L891.91,521.11 L894.39,521.11 L896.87,521.11 L899.35,521.11 L901.83,521.11
|
||||||
|
L904.31,521.11 L906.79,521.11 L909.27,521.11 L911.75,521.11 L914.23,521.11 L916.71,521.11 L919.19,521.11 L921.67,521.11
|
||||||
|
L924.15,521.11 L926.63,521.11 L929.11,521.11 L931.59,521.11 L934.07,521.11 L936.55,521.11 L939.03,521.11 L941.51,521.11
|
||||||
|
L943.99,521.11 L946.47,521.11 L948.95,521.11 L951.43,521.11 L953.91,521.11 L956.39,521.11 L958.87,521.11 L961.35,521.11
|
||||||
|
L963.83,521.11 L966.31,521.11 L968.79,521.11 L971.27,521.11 L973.75,521.11 L976.23,521.11 L978.71,521.11 L981.19,521.11
|
||||||
|
L983.67,521.11 L986.15,521.11 L988.63,521.11 L991.11,521.11 L993.59,521.11 L996.07,521.11 L998.55,521.11 L1001.03,521.11
|
||||||
|
L1003.51,521.11 L1005.99,521.11 L1008.47,521.11 L1010.95,521.11 L1013.43,521.11 L1015.91,521.11 L1018.39,521.11 L1020.87,521.11
|
||||||
|
L1023.35,521.11 L1025.83,521.11 L1028.31,521.11 L1030.79,521.11 L1033.27,521.11 L1035.75,521.11 L1038.23,521.11 L1040.71,521.11
|
||||||
|
L1043.19,521.11 L1045.67,521.11 L1048.15,521.11 L1050.63,521.11 L1053.11,521.11 L1055.59,521.11 L1058.07,521.11 L1060.55,521.11
|
||||||
|
L1063.03,521.11 L1065.51,521.11 L1067.99,521.11 L1070.47,523.80 L1072.95,527.47 L1075.43,531.13 L1077.91,534.80 L1080.39,538.47
|
||||||
|
L1082.87,542.14 L1085.35,545.80 L1087.83,549.47 L1090.31,553.14 L1092.79,556.81 L1095.27,560.47 L1097.75,564.14 L1100.23,567.81
|
||||||
|
L1102.71,571.48 L1105.19,575.14 L1107.67,578.81 L1110.15,582.48 L1112.63,586.15 L1115.11,589.81 L1117.59,593.48 L1120.07,597.15
|
||||||
|
L1122.55,600.82 L1125.03,604.48 L1127.51,608.15 L1129.99,611.82 L1132.47,615.49 L1134.95,619.15 L1137.43,622.82 L1139.91,626.49
|
||||||
|
L1142.39,630.16 L1144.87,633.82 L1147.35,637.49 L1149.83,641.16 L1152.31,644.83 L1154.79,648.49 L1157.27,652.16 L1159.75,655.83
|
||||||
|
L1162.23,659.50 L1164.71,663.16 L1167.19,666.83 L1169.67,670.50 L1172.15,674.17 L1174.63,677.83 L1177.11,681.50 L1179.59,685.17
|
||||||
|
L1182.07,688.84 L1184.55,692.50 L1187.03,696.17 L1189.51,699.84 L1191.99,703.51 L1194.47,707.17 L1196.95,710.84 L1199.43,714.51
|
||||||
|
L1201.91,718.18 L1204.39,721.84 L1206.87,725.51 L1209.35,729.18 L1211.83,732.85 L1214.31,736.51 L1216.79,740.18 L1219.27,743.85
|
||||||
|
L1221.75,747.52 L1224.23,751.18 L1226.71,754.85 L1229.19,758.52 L1231.67,762.19 L1234.15,765.85 L1236.63,769.52 L1239.11,773.19
|
||||||
|
L1241.59,776.86 L1244.07,780.52 L1246.55,784.19 L1249.03,787.86 L1251.51,791.53 L1253.99,795.19 L1256.47,798.86 L1258.95,802.53
|
||||||
|
L1261.43,806.20 L1263.91,809.86 L1266.39,813.53 L1268.87,817.20 L1271.35,820.87 L1273.83,824.53 L1276.31,828.20 L1278.79,831.87
|
||||||
|
L1281.27,835.54 L1283.75,839.20 L1286.23,842.87 L1288.71,846.54 L1291.19,850.21 L1293.67,853.87 L1296.15,857.54 L1298.63,861.21
|
||||||
|
L1301.11,864.88 L1303.59,868.54 L1306.07,872.21 L1308.55,875.88 L1311.03,879.55 L1313.51,883.21 L1315.99,886.88 L1318.47,887.86
|
||||||
|
L1320.95,887.86 L1323.43,887.86 L1325.91,887.86 L1328.39,887.86 L1330.87,887.86 L1333.35,887.86 L1335.83,887.86 L1338.31,887.86
|
||||||
|
L1340.79,887.86 L1343.27,887.86 L1345.75,887.86 L1348.23,885.17 L1350.71,881.50 L1353.19,877.84 L1355.67,874.17 L1358.15,870.50
|
||||||
|
L1360.63,866.83 L1363.11,863.17 L1365.59,859.50 L1368.07,855.83 L1370.55,852.16 L1373.03,848.50 L1375.51,844.83 L1377.99,841.16
|
||||||
|
L1380.47,837.49 L1382.95,833.83 L1385.43,830.16 L1387.91,826.49 L1390.39,822.82 L1392.87,819.16 L1395.35,815.49 L1397.83,811.82
|
||||||
|
L1400.31,808.15 L1402.79,804.49 L1405.27,800.82 L1407.75,797.15 L1410.23,793.48 L1412.71,789.82 L1415.19,786.15 L1417.67,782.48
|
||||||
|
L1420.15,778.81 L1422.63,775.15 L1425.11,771.48 L1427.59,767.81 L1430.07,764.14 L1432.55,760.48 L1435.03,756.81 L1437.51,753.14
|
||||||
|
L1439.99,749.47 L1442.47,745.81 L1444.95,742.14 L1447.43,738.47 L1449.91,734.80 L1452.39,731.14 L1454.87,727.47 L1457.35,723.80
|
||||||
|
L1459.83,720.13 L1462.31,716.47 L1464.79,712.80 L1467.27,709.13 L1469.75,705.46 L1472.23,701.80 L1474.71,698.13 L1477.19,694.46
|
||||||
|
L1479.67,690.79 L1482.15,687.13 L1484.63,683.46 L1487.11,679.79 L1489.59,676.12 L1492.07,672.46 L1494.55,668.79 L1497.03,665.12
|
||||||
|
L1499.51,661.45 L1501.99,657.79 L1504.47,654.12 L1506.95,650.45 L1509.43,646.78 L1511.91,643.12 L1514.39,639.45 L1516.87,635.78
|
||||||
|
L1519.35,632.11 L1521.83,628.45 L1524.31,624.78 L1526.79,621.11 L1529.27,617.44 L1531.75,613.78 L1534.23,610.11 L1536.71,606.44
|
||||||
|
L1539.19,602.77 L1541.67,599.11 L1544.15,595.44 L1546.63,591.77 L1549.11,588.10 L1551.59,584.44 L1554.07,580.77 L1556.55,577.10
|
||||||
|
L1559.03,573.43 L1561.51,569.77 L1563.99,566.10 L1566.47,562.43 L1568.95,558.76 L1571.43,555.10 L1573.91,551.43 L1576.39,547.76
|
||||||
|
L1578.87,544.09 L1581.35,540.43 L1583.83,536.76 L1586.31,533.09 L1588.79,529.42 L1591.27,525.76 L1593.75,522.09 L1594.41,521.11
|
||||||
|
'/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_3a" ><title>gnuplot_plot_3a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 158, 96)' d='M249.59,521.11 L252.07,517.44 L254.55,513.77 L257.03,510.11 L259.51,506.44 L261.99,502.77 L264.47,499.10 L266.95,495.44
|
||||||
|
L269.43,491.77 L271.91,488.10 L274.39,484.43 L276.87,480.77 L279.35,477.10 L281.83,473.43 L284.31,469.76 L286.79,466.10
|
||||||
|
L289.27,462.43 L291.75,458.76 L294.23,455.09 L296.71,451.43 L299.19,447.76 L301.67,444.09 L304.15,440.42 L306.63,436.76
|
||||||
|
L309.11,433.09 L311.59,429.42 L314.07,425.75 L316.55,422.09 L319.03,418.42 L321.51,414.75 L323.99,411.08 L326.47,407.42
|
||||||
|
L328.95,403.75 L331.43,400.08 L333.91,396.41 L336.39,392.75 L338.87,389.08 L341.35,385.41 L343.83,381.74 L346.31,378.08
|
||||||
|
L348.79,374.41 L351.27,370.74 L353.75,367.07 L356.23,363.41 L358.71,359.74 L361.19,356.07 L363.67,352.40 L366.15,348.74
|
||||||
|
L368.63,345.07 L371.11,341.40 L373.59,337.73 L376.07,334.07 L378.55,330.40 L381.03,326.73 L383.51,323.06 L385.99,319.40
|
||||||
|
L388.47,315.73 L390.95,312.06 L393.43,308.39 L395.91,304.73 L398.39,301.06 L400.87,297.39 L403.35,293.72 L405.83,290.06
|
||||||
|
L408.31,286.39 L410.79,282.72 L413.27,279.05 L415.75,275.39 L418.23,271.72 L420.71,268.05 L423.19,264.38 L425.67,260.72
|
||||||
|
L428.15,257.05 L430.63,253.38 L433.11,249.71 L435.59,246.05 L438.07,242.38 L440.55,238.71 L443.03,235.04 L445.51,231.38
|
||||||
|
L447.99,227.71 L450.47,224.04 L452.95,220.37 L455.43,216.71 L457.91,213.04 L460.39,209.37 L462.87,205.70 L465.35,202.04
|
||||||
|
L467.83,198.37 L470.31,194.70 L472.79,191.03 L475.27,187.37 L477.75,183.70 L480.23,180.03 L482.71,176.36 L485.19,172.70
|
||||||
|
L487.67,169.03 L490.15,165.36 L492.63,161.69 L495.11,158.03 L497.59,154.36 L500.07,154.36 L502.55,154.36 L505.03,154.36
|
||||||
|
L507.51,154.36 L509.99,154.36 L512.47,154.36 L514.95,154.36 L517.43,154.36 L519.91,154.36 L522.39,154.36 L524.87,154.36
|
||||||
|
L527.35,154.36 L529.83,158.03 L532.31,161.69 L534.79,165.36 L537.27,169.03 L539.75,172.70 L542.23,176.36 L544.71,180.03
|
||||||
|
L547.19,183.70 L549.67,187.37 L552.15,191.03 L554.63,194.70 L557.11,198.37 L559.59,202.04 L562.07,205.70 L564.55,209.37
|
||||||
|
L567.03,213.04 L569.51,216.71 L571.99,220.37 L574.47,224.04 L576.95,227.71 L579.43,231.38 L581.91,235.04 L584.39,238.71
|
||||||
|
L586.87,242.38 L589.35,246.05 L591.83,249.71 L594.31,253.38 L596.79,257.05 L599.27,260.72 L601.75,264.38 L604.23,268.05
|
||||||
|
L606.71,271.72 L609.19,275.39 L611.67,279.05 L614.15,282.72 L616.63,286.39 L619.11,290.06 L621.59,293.72 L624.07,297.39
|
||||||
|
L626.55,301.06 L629.03,304.73 L631.51,308.39 L633.99,312.06 L636.47,315.73 L638.95,319.40 L641.43,323.06 L643.91,326.73
|
||||||
|
L646.39,330.40 L648.87,334.07 L651.35,337.73 L653.83,341.40 L656.31,345.07 L658.79,348.74 L661.27,352.40 L663.75,356.07
|
||||||
|
L666.23,359.74 L668.71,363.41 L671.19,367.07 L673.67,370.74 L676.15,374.41 L678.63,378.08 L681.11,381.74 L683.59,385.41
|
||||||
|
L686.07,389.08 L688.55,392.75 L691.03,396.41 L693.51,400.08 L695.99,403.75 L698.47,407.42 L700.95,411.08 L703.43,414.75
|
||||||
|
L705.91,418.42 L708.39,422.09 L710.87,425.75 L713.35,429.42 L715.83,433.09 L718.31,436.76 L720.79,440.42 L723.27,444.09
|
||||||
|
L725.75,447.76 L728.23,451.43 L730.71,455.09 L733.19,458.76 L735.67,462.43 L738.15,466.10 L740.63,469.76 L743.11,473.43
|
||||||
|
L745.59,477.10 L748.07,480.77 L750.55,484.43 L753.03,488.10 L755.51,491.77 L757.99,495.44 L760.47,499.10 L762.95,502.77
|
||||||
|
L765.43,506.44 L767.91,510.11 L770.39,513.77 L772.87,517.44 L775.35,521.11 L777.83,521.11 L780.31,521.11 L782.79,521.11
|
||||||
|
L785.27,521.11 L787.75,521.11 L790.23,521.11 L792.71,521.11 L795.19,521.11 L797.67,521.11 L800.15,521.11 L802.63,521.11
|
||||||
|
L805.11,521.11 L807.59,521.11 L810.07,521.11 L812.55,521.11 L815.03,521.11 L817.51,521.11 L819.99,521.11 L822.47,521.11
|
||||||
|
L824.95,521.11 L827.43,521.11 L829.91,521.11 L832.39,521.11 L834.87,521.11 L837.35,521.11 L839.83,521.11 L842.31,521.11
|
||||||
|
L844.79,521.11 L847.27,521.11 L849.75,521.11 L852.23,521.11 L854.71,521.11 L857.19,521.11 L859.67,521.11 L862.15,521.11
|
||||||
|
L864.63,521.11 L867.11,521.11 L869.59,521.11 L872.07,521.11 L874.55,521.11 L877.03,521.11 L879.51,521.11 L881.99,521.11
|
||||||
|
L884.47,521.11 L886.95,521.11 L889.43,521.11 L891.91,521.11 L894.39,521.11 L896.87,521.11 L899.35,521.11 L901.83,521.11
|
||||||
|
L904.31,521.11 L906.79,521.11 L909.27,521.11 L911.75,521.11 L914.23,521.11 L916.71,521.11 L919.19,521.11 L921.67,521.11
|
||||||
|
L924.15,521.11 L926.63,521.11 L929.11,521.11 L931.59,521.11 L934.07,521.11 L936.55,521.11 L939.03,521.11 L941.51,521.11
|
||||||
|
L943.99,521.11 L946.47,521.11 L948.95,521.11 L951.43,521.11 L953.91,521.11 L956.39,521.11 L958.87,521.11 L961.35,521.11
|
||||||
|
L963.83,521.11 L966.31,521.11 L968.79,521.11 L971.27,521.11 L973.75,521.11 L976.23,521.11 L978.71,521.11 L981.19,521.11
|
||||||
|
L983.67,521.11 L986.15,521.11 L988.63,521.11 L991.11,521.11 L993.59,521.11 L996.07,521.11 L998.55,521.11 L1001.03,521.11
|
||||||
|
L1003.51,521.11 L1005.99,521.11 L1008.47,521.11 L1010.95,521.11 L1013.43,521.11 L1015.91,521.11 L1018.39,521.11 L1020.87,521.11
|
||||||
|
L1023.35,521.11 L1025.83,521.11 L1028.31,521.11 L1030.79,521.11 L1033.27,521.11 L1035.75,521.11 L1038.23,521.11 L1040.71,521.11
|
||||||
|
L1043.19,521.11 L1045.67,521.11 L1048.15,521.11 L1050.63,523.80 L1053.11,527.47 L1055.59,531.13 L1058.07,534.80 L1060.55,538.47
|
||||||
|
L1063.03,542.14 L1065.51,545.80 L1067.99,549.47 L1070.47,553.14 L1072.95,556.81 L1075.43,560.47 L1077.91,564.14 L1080.39,567.81
|
||||||
|
L1082.87,571.48 L1085.35,575.14 L1087.83,578.81 L1090.31,582.48 L1092.79,586.15 L1095.27,589.81 L1097.75,593.48 L1100.23,597.15
|
||||||
|
L1102.71,600.82 L1105.19,604.48 L1107.67,608.15 L1110.15,611.82 L1112.63,615.49 L1115.11,619.15 L1117.59,622.82 L1120.07,626.49
|
||||||
|
L1122.55,630.16 L1125.03,633.82 L1127.51,637.49 L1129.99,641.16 L1132.47,644.83 L1134.95,648.49 L1137.43,652.16 L1139.91,655.83
|
||||||
|
L1142.39,659.50 L1144.87,663.16 L1147.35,666.83 L1149.83,670.50 L1152.31,674.17 L1154.79,677.83 L1157.27,681.50 L1159.75,685.17
|
||||||
|
L1162.23,688.84 L1164.71,692.50 L1167.19,696.17 L1169.67,699.84 L1172.15,703.51 L1174.63,707.17 L1177.11,710.84 L1179.59,714.51
|
||||||
|
L1182.07,718.18 L1184.55,721.84 L1187.03,725.51 L1189.51,729.18 L1191.99,732.85 L1194.47,736.51 L1196.95,740.18 L1199.43,743.85
|
||||||
|
L1201.91,747.52 L1204.39,751.18 L1206.87,754.85 L1209.35,758.52 L1211.83,762.19 L1214.31,765.85 L1216.79,769.52 L1219.27,773.19
|
||||||
|
L1221.75,776.86 L1224.23,780.52 L1226.71,784.19 L1229.19,787.86 L1231.67,791.53 L1234.15,795.19 L1236.63,798.86 L1239.11,802.53
|
||||||
|
L1241.59,806.20 L1244.07,809.86 L1246.55,813.53 L1249.03,817.20 L1251.51,820.87 L1253.99,824.53 L1256.47,828.20 L1258.95,831.87
|
||||||
|
L1261.43,835.54 L1263.91,839.20 L1266.39,842.87 L1268.87,846.54 L1271.35,850.21 L1273.83,853.87 L1276.31,857.54 L1278.79,861.21
|
||||||
|
L1281.27,864.88 L1283.75,868.54 L1286.23,872.21 L1288.71,875.88 L1291.19,879.55 L1293.67,883.21 L1296.15,886.88 L1298.63,887.86
|
||||||
|
L1301.11,887.86 L1303.59,887.86 L1306.07,887.86 L1308.55,887.86 L1311.03,887.86 L1313.51,887.86 L1315.99,887.86 L1318.47,887.86
|
||||||
|
L1320.95,887.86 L1323.43,887.86 L1325.91,887.86 L1328.39,887.86 L1330.87,887.86 L1333.35,887.86 L1335.83,887.86 L1338.31,887.86
|
||||||
|
L1340.79,887.86 L1343.27,887.86 L1345.75,887.86 L1348.23,885.17 L1350.71,881.50 L1353.19,877.84 L1355.67,874.17 L1358.15,870.50
|
||||||
|
L1360.63,866.83 L1363.11,863.17 L1365.59,859.50 L1368.07,855.83 L1370.55,852.16 L1373.03,848.50 L1375.51,844.83 L1377.99,841.16
|
||||||
|
L1380.47,837.49 L1382.95,833.83 L1385.43,830.16 L1387.91,826.49 L1390.39,822.82 L1392.87,819.16 L1395.35,815.49 L1397.83,811.82
|
||||||
|
L1400.31,808.15 L1402.79,804.49 L1405.27,800.82 L1407.75,797.15 L1410.23,793.48 L1412.71,789.82 L1415.19,786.15 L1417.67,782.48
|
||||||
|
L1420.15,778.81 L1422.63,775.15 L1425.11,771.48 L1427.59,767.81 L1430.07,764.14 L1432.55,760.48 L1435.03,756.81 L1437.51,753.14
|
||||||
|
L1439.99,749.47 L1442.47,745.81 L1444.95,742.14 L1447.43,738.47 L1449.91,734.80 L1452.39,731.14 L1454.87,727.47 L1457.35,723.80
|
||||||
|
L1459.83,720.13 L1462.31,716.47 L1464.79,712.80 L1467.27,709.13 L1469.75,705.46 L1472.23,701.80 L1474.71,698.13 L1477.19,694.46
|
||||||
|
L1479.67,690.79 L1482.15,687.13 L1484.63,683.46 L1487.11,679.79 L1489.59,676.12 L1492.07,672.46 L1494.55,668.79 L1497.03,665.12
|
||||||
|
L1499.51,661.45 L1501.99,657.79 L1504.47,654.12 L1506.95,650.45 L1509.43,646.78 L1511.91,643.12 L1514.39,639.45 L1516.87,635.78
|
||||||
|
L1519.35,632.11 L1521.83,628.45 L1524.31,624.78 L1526.79,621.11 L1529.27,617.44 L1531.75,613.78 L1534.23,610.11 L1536.71,606.44
|
||||||
|
L1539.19,602.77 L1541.67,599.11 L1544.15,595.44 L1546.63,591.77 L1549.11,588.10 L1551.59,584.44 L1554.07,580.77 L1556.55,577.10
|
||||||
|
L1559.03,573.43 L1561.51,569.77 L1563.99,566.10 L1566.47,562.43 L1568.95,558.76 L1571.43,555.10 L1573.91,551.43 L1576.39,547.76
|
||||||
|
L1578.87,544.09 L1581.35,540.43 L1583.83,536.76 L1586.31,533.09 L1588.79,529.42 L1591.27,525.76 L1593.75,522.09 L1594.41,521.11
|
||||||
|
'/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_4a" ><title>ZeroToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_5a" ><title>ZeroToPositiveVf</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_6a" ><title>PositiveV0ToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g stroke='none' shape-rendering='crispEdges'>
|
||||||
|
<polygon fill = 'white' points = '1534.62,145.12 1724.99,145.12 1724.99,94.51 1534.62,94.51 '/>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="white" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1534.62,145.12 L1534.62,94.51 L1724.99,94.51 L1724.99,145.12 L1534.62,145.12 Z '/></g>
|
||||||
|
<g id="gnuplot_plot_1a" ><title>gnuplot_plot_1a</title>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 0, 0)" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_2a" ><title>gnuplot_plot_2a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_3a" ><title>gnuplot_plot_3a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_4a" ><title>ZeroToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,106.53)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >ZeroToRest</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(216, 51, 45)' d='M1542.31,102.95 L1586.57,102.95 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_5a" ><title>ZeroToPositiveVf</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,123.40)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >ZeroToPositiveVf</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 114, 178)' d='M1542.31,119.82 L1586.57,119.82 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_6a" ><title>PositiveV0ToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,140.27)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >PositiveV0ToRest</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 158, 96)' d='M1542.31,136.69 L1586.57,136.69 '/></g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 158, 96)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="black" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L249.59,961.21 L1737.59,961.21 L1737.59,81.01 L249.59,81.01 Z '/></g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(993.59,47.54)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="17.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" font-weight="bold" >SCurve Acceleration</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 48 KiB |
BIN
data/s_curve_jerk.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
518
data/s_curve_jerk.svg
Normal file
@ -0,0 +1,518 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="1920" height="1080"
|
||||||
|
viewBox="0 0 1920 1080"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
>
|
||||||
|
|
||||||
|
<title>Gnuplot</title>
|
||||||
|
<desc>Produced by GNUPLOT 5.4 patchlevel 2 </desc>
|
||||||
|
|
||||||
|
<g id="gnuplot_canvas">
|
||||||
|
|
||||||
|
<rect x="0" y="0" width="1920" height="1080" fill="none"/>
|
||||||
|
<defs>
|
||||||
|
|
||||||
|
<circle id='gpDot' r='0.5' stroke-width='0.5' stroke='currentColor'/>
|
||||||
|
<path id='gpPt0' stroke-width='0.148' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
|
||||||
|
<path id='gpPt1' stroke-width='0.148' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
|
||||||
|
<path id='gpPt2' stroke-width='0.148' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
|
||||||
|
<rect id='gpPt3' stroke-width='0.148' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||||
|
<rect id='gpPt4' stroke-width='0.148' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||||
|
<circle id='gpPt5' stroke-width='0.148' stroke='currentColor' cx='0' cy='0' r='1'/>
|
||||||
|
<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
|
||||||
|
<path id='gpPt7' stroke-width='0.148' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
|
||||||
|
<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
|
||||||
|
<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
|
||||||
|
<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
|
||||||
|
<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
|
||||||
|
<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
|
||||||
|
<path id='gpPt13' stroke-width='0.148' stroke='currentColor' d='M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z'/>
|
||||||
|
<use xlink:href='#gpPt13' id='gpPt14' fill='currentColor' stroke='none'/>
|
||||||
|
<filter id='textbox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||||
|
<feFlood flood-color='white' flood-opacity='1' result='bgnd'/>
|
||||||
|
<feComposite in='SourceGraphic' in2='bgnd' operator='atop'/>
|
||||||
|
</filter>
|
||||||
|
<filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||||
|
<feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/>
|
||||||
|
<feComposite in='SourceGraphic' in2='grey' operator='atop'/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<g fill="none" color="white" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,961.21 L1737.59,961.21 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,961.21 L259.71,961.21 '/> <g transform="translate(236.99,966.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >-10</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,741.16 L1737.59,741.16 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,741.16 L259.71,741.16 '/> <g transform="translate(236.99,746.36)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >-5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,521.11 L1737.59,521.11 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,521.11 L259.71,521.11 '/> <g transform="translate(236.99,526.31)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >0</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,301.06 L1737.59,301.06 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,301.06 L259.71,301.06 '/> <g transform="translate(236.99,306.26)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,81.01 L1737.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L259.71,81.01 '/> <g transform="translate(236.99,86.21)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >10</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,961.21 L249.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,961.21 L249.59,951.09 '/> <g transform="translate(249.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >0</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M497.59,961.21 L497.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M497.59,961.21 L497.59,951.09 '/> <g transform="translate(497.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >0.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M745.59,961.21 L745.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M745.59,961.21 L745.59,951.09 '/> <g transform="translate(745.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >1</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M993.59,961.21 L993.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M993.59,961.21 L993.59,951.09 '/> <g transform="translate(993.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >1.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1241.59,961.21 L1241.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1241.59,961.21 L1241.59,951.09 '/> <g transform="translate(1241.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >2</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1489.59,961.21 L1489.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1489.59,961.21 L1489.59,951.09 '/> <g transform="translate(1489.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >2.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1737.59,961.21 L1737.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1737.59,961.21 L1737.59,951.09 '/> <g transform="translate(1737.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >3</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L249.59,961.21 L1737.59,961.21 L1737.59,81.01 L249.59,81.01 Z '/></g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(179.81,521.11) rotate(270)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >jerk [m/s</tspan><tspan font-family="Helvetica" font-size="8.8" dy="-5.50px">3</tspan><tspan font-family="Helvetica" font-size="11.0" dy="5.50px">]</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(993.59,1032.29)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >time [s]</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1534.62,145.12 L1534.62,94.51 L1724.99,94.51 L1724.99,145.12 L1534.62,145.12 Z '/></g>
|
||||||
|
<g id="gnuplot_plot_1a" ><title>gnuplot_plot_1a</title>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 0, 0)" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(216, 51, 45)' d='M249.59,521.11 L252.07,81.01 L254.55,81.01 L257.03,81.01 L259.51,81.01 L261.99,81.01 L264.47,81.01 L266.95,81.01
|
||||||
|
L269.43,81.01 L271.91,81.01 L274.39,81.01 L276.87,81.01 L279.35,81.01 L281.83,81.01 L284.31,81.01 L286.79,81.01
|
||||||
|
L289.27,81.01 L291.75,81.01 L294.23,81.01 L296.71,81.01 L299.19,81.01 L301.67,81.01 L304.15,81.01 L306.63,81.01
|
||||||
|
L309.11,81.01 L311.59,81.01 L314.07,81.01 L316.55,81.01 L319.03,81.01 L321.51,81.01 L323.99,81.01 L326.47,81.01
|
||||||
|
L328.95,81.01 L331.43,81.01 L333.91,81.01 L336.39,81.01 L338.87,81.01 L341.35,81.01 L343.83,81.01 L346.31,81.01
|
||||||
|
L348.79,81.01 L351.27,81.01 L353.75,81.01 L356.23,81.01 L358.71,81.01 L361.19,81.01 L363.67,81.01 L366.15,81.01
|
||||||
|
L368.63,81.01 L371.11,81.01 L373.59,81.01 L376.07,81.01 L378.55,81.01 L381.03,81.01 L383.51,81.01 L385.99,81.01
|
||||||
|
L388.47,81.01 L390.95,81.01 L393.43,81.01 L395.91,81.01 L398.39,81.01 L400.87,81.01 L403.35,81.01 L405.83,81.01
|
||||||
|
L408.31,81.01 L410.79,81.01 L413.27,81.01 L415.75,81.01 L418.23,81.01 L420.71,81.01 L423.19,81.01 L425.67,81.01
|
||||||
|
L428.15,81.01 L430.63,81.01 L433.11,81.01 L435.59,81.01 L438.07,81.01 L440.55,81.01 L443.03,81.01 L445.51,81.01
|
||||||
|
L447.99,81.01 L450.47,81.01 L452.95,81.01 L455.43,81.01 L457.91,81.01 L460.39,81.01 L462.87,81.01 L465.35,81.01
|
||||||
|
L467.83,81.01 L470.31,81.01 L472.79,81.01 L475.27,81.01 L477.75,81.01 L480.23,81.01 L482.71,81.01 L485.19,81.01
|
||||||
|
L487.67,81.01 L490.15,81.01 L492.63,81.01 L495.11,81.01 L497.59,521.11 L500.07,521.11 L502.55,521.11 L505.03,521.11
|
||||||
|
L507.51,521.11 L509.99,521.11 L512.47,521.11 L514.95,521.11 L517.43,521.11 L519.91,521.11 L522.39,521.11 L524.87,521.11
|
||||||
|
L527.35,521.11 L529.83,521.11 L532.31,521.11 L534.79,521.11 L537.27,521.11 L539.75,521.11 L542.23,521.11 L544.71,521.11
|
||||||
|
L547.19,961.21 L549.67,961.21 L552.15,961.21 L554.63,961.21 L557.11,961.21 L559.59,961.21 L562.07,961.21 L564.55,961.21
|
||||||
|
L567.03,961.21 L569.51,961.21 L571.99,961.21 L574.47,961.21 L576.95,961.21 L579.43,961.21 L581.91,961.21 L584.39,961.21
|
||||||
|
L586.87,961.21 L589.35,961.21 L591.83,961.21 L594.31,961.21 L596.79,961.21 L599.27,961.21 L601.75,961.21 L604.23,961.21
|
||||||
|
L606.71,961.21 L609.19,961.21 L611.67,961.21 L614.15,961.21 L616.63,961.21 L619.11,961.21 L621.59,961.21 L624.07,961.21
|
||||||
|
L626.55,961.21 L629.03,961.21 L631.51,961.21 L633.99,961.21 L636.47,961.21 L638.95,961.21 L641.43,961.21 L643.91,961.21
|
||||||
|
L646.39,961.21 L648.87,961.21 L651.35,961.21 L653.83,961.21 L656.31,961.21 L658.79,961.21 L661.27,961.21 L663.75,961.21
|
||||||
|
L666.23,961.21 L668.71,961.21 L671.19,961.21 L673.67,961.21 L676.15,961.21 L678.63,961.21 L681.11,961.21 L683.59,961.21
|
||||||
|
L686.07,961.21 L688.55,961.21 L691.03,961.21 L693.51,961.21 L695.99,961.21 L698.47,961.21 L700.95,961.21 L703.43,961.21
|
||||||
|
L705.91,961.21 L708.39,961.21 L710.87,961.21 L713.35,961.21 L715.83,961.21 L718.31,961.21 L720.79,961.21 L723.27,961.21
|
||||||
|
L725.75,961.21 L728.23,961.21 L730.71,961.21 L733.19,961.21 L735.67,961.21 L738.15,961.21 L740.63,961.21 L743.11,961.21
|
||||||
|
L745.59,961.21 L748.07,961.21 L750.55,961.21 L753.03,961.21 L755.51,961.21 L757.99,961.21 L760.47,961.21 L762.95,961.21
|
||||||
|
L765.43,961.21 L767.91,961.21 L770.39,961.21 L772.87,961.21 L775.35,961.21 L777.83,961.21 L780.31,961.21 L782.79,961.21
|
||||||
|
L785.27,961.21 L787.75,961.21 L790.23,961.21 L792.71,961.21 L795.19,521.11 L797.67,521.11 L800.15,521.11 L802.63,521.11
|
||||||
|
L805.11,521.11 L807.59,521.11 L810.07,521.11 L812.55,521.11 L815.03,521.11 L817.51,521.11 L819.99,521.11 L822.47,521.11
|
||||||
|
L824.95,521.11 L827.43,521.11 L829.91,521.11 L832.39,521.11 L834.87,521.11 L837.35,521.11 L839.83,521.11 L842.31,521.11
|
||||||
|
L844.79,521.11 L847.27,521.11 L849.75,521.11 L852.23,521.11 L854.71,521.11 L857.19,521.11 L859.67,521.11 L862.15,521.11
|
||||||
|
L864.63,521.11 L867.11,521.11 L869.59,521.11 L872.07,521.11 L874.55,521.11 L877.03,521.11 L879.51,521.11 L881.99,521.11
|
||||||
|
L884.47,521.11 L886.95,521.11 L889.43,521.11 L891.91,521.11 L894.39,521.11 L896.87,521.11 L899.35,521.11 L901.83,521.11
|
||||||
|
L904.31,521.11 L906.79,521.11 L909.27,521.11 L911.75,521.11 L914.23,521.11 L916.71,521.11 L919.19,521.11 L921.67,521.11
|
||||||
|
L924.15,521.11 L926.63,521.11 L929.11,521.11 L931.59,521.11 L934.07,521.11 L936.55,521.11 L939.03,521.11 L941.51,521.11
|
||||||
|
L943.99,521.11 L946.47,521.11 L948.95,521.11 L951.43,521.11 L953.91,521.11 L956.39,521.11 L958.87,521.11 L961.35,521.11
|
||||||
|
L963.83,521.11 L966.31,521.11 L968.79,521.11 L971.27,521.11 L973.75,521.11 L976.23,521.11 L978.71,521.11 L981.19,521.11
|
||||||
|
L983.67,521.11 L986.15,521.11 L988.63,521.11 L991.11,521.11 L993.59,521.11 L996.07,521.11 L998.55,521.11 L1001.03,521.11
|
||||||
|
L1003.51,521.11 L1005.99,521.11 L1008.47,521.11 L1010.95,521.11 L1013.43,521.11 L1015.91,521.11 L1018.39,521.11 L1020.87,521.11
|
||||||
|
L1023.35,521.11 L1025.83,521.11 L1028.31,521.11 L1030.79,521.11 L1033.27,521.11 L1035.75,521.11 L1038.23,521.11 L1040.71,521.11
|
||||||
|
L1043.19,521.11 L1045.67,521.11 L1048.15,521.11 L1050.63,521.11 L1053.11,521.11 L1055.59,521.11 L1058.07,521.11 L1060.55,521.11
|
||||||
|
L1063.03,521.11 L1065.51,521.11 L1067.99,521.11 L1070.47,521.11 L1072.95,521.11 L1075.43,521.11 L1077.91,961.21 L1080.39,961.21
|
||||||
|
L1082.87,961.21 L1085.35,961.21 L1087.83,961.21 L1090.31,961.21 L1092.79,961.21 L1095.27,961.21 L1097.75,961.21 L1100.23,961.21
|
||||||
|
L1102.71,961.21 L1105.19,961.21 L1107.67,961.21 L1110.15,961.21 L1112.63,961.21 L1115.11,961.21 L1117.59,961.21 L1120.07,961.21
|
||||||
|
L1122.55,961.21 L1125.03,961.21 L1127.51,961.21 L1129.99,961.21 L1132.47,961.21 L1134.95,961.21 L1137.43,961.21 L1139.91,961.21
|
||||||
|
L1142.39,961.21 L1144.87,961.21 L1147.35,961.21 L1149.83,961.21 L1152.31,961.21 L1154.79,961.21 L1157.27,961.21 L1159.75,961.21
|
||||||
|
L1162.23,961.21 L1164.71,961.21 L1167.19,961.21 L1169.67,961.21 L1172.15,961.21 L1174.63,961.21 L1177.11,961.21 L1179.59,961.21
|
||||||
|
L1182.07,961.21 L1184.55,961.21 L1187.03,961.21 L1189.51,961.21 L1191.99,961.21 L1194.47,961.21 L1196.95,961.21 L1199.43,961.21
|
||||||
|
L1201.91,961.21 L1204.39,961.21 L1206.87,961.21 L1209.35,961.21 L1211.83,961.21 L1214.31,961.21 L1216.79,961.21 L1219.27,961.21
|
||||||
|
L1221.75,961.21 L1224.23,961.21 L1226.71,961.21 L1229.19,961.21 L1231.67,961.21 L1234.15,961.21 L1236.63,961.21 L1239.11,961.21
|
||||||
|
L1241.59,961.21 L1244.07,961.21 L1246.55,961.21 L1249.03,961.21 L1251.51,961.21 L1253.99,961.21 L1256.47,961.21 L1258.95,961.21
|
||||||
|
L1261.43,961.21 L1263.91,961.21 L1266.39,961.21 L1268.87,961.21 L1271.35,961.21 L1273.83,961.21 L1276.31,961.21 L1278.79,961.21
|
||||||
|
L1281.27,961.21 L1283.75,961.21 L1286.23,961.21 L1288.71,961.21 L1291.19,961.21 L1293.67,961.21 L1296.15,961.21 L1298.63,961.21
|
||||||
|
L1301.11,961.21 L1303.59,961.21 L1306.07,961.21 L1308.55,961.21 L1311.03,961.21 L1313.51,961.21 L1315.99,961.21 L1318.47,961.21
|
||||||
|
L1320.95,961.21 L1323.43,961.21 L1325.91,521.11 L1328.39,521.11 L1330.87,521.11 L1333.35,521.11 L1335.83,521.11 L1338.31,521.11
|
||||||
|
L1340.79,521.11 L1343.27,521.11 L1345.75,521.11 L1348.23,521.11 L1350.71,521.11 L1353.19,521.11 L1355.67,521.11 L1358.15,521.11
|
||||||
|
L1360.63,521.11 L1363.11,521.11 L1365.59,521.11 L1368.07,521.11 L1370.55,521.11 L1373.03,521.11 L1375.51,81.01 L1377.99,81.01
|
||||||
|
L1380.47,81.01 L1382.95,81.01 L1385.43,81.01 L1387.91,81.01 L1390.39,81.01 L1392.87,81.01 L1395.35,81.01 L1397.83,81.01
|
||||||
|
L1400.31,81.01 L1402.79,81.01 L1405.27,81.01 L1407.75,81.01 L1410.23,81.01 L1412.71,81.01 L1415.19,81.01 L1417.67,81.01
|
||||||
|
L1420.15,81.01 L1422.63,81.01 L1425.11,81.01 L1427.59,81.01 L1430.07,81.01 L1432.55,81.01 L1435.03,81.01 L1437.51,81.01
|
||||||
|
L1439.99,81.01 L1442.47,81.01 L1444.95,81.01 L1447.43,81.01 L1449.91,81.01 L1452.39,81.01 L1454.87,81.01 L1457.35,81.01
|
||||||
|
L1459.83,81.01 L1462.31,81.01 L1464.79,81.01 L1467.27,81.01 L1469.75,81.01 L1472.23,81.01 L1474.71,81.01 L1477.19,81.01
|
||||||
|
L1479.67,81.01 L1482.15,81.01 L1484.63,81.01 L1487.11,81.01 L1489.59,81.01 L1492.07,81.01 L1494.55,81.01 L1497.03,81.01
|
||||||
|
L1499.51,81.01 L1501.99,81.01 L1504.47,81.01 L1506.95,81.01 L1509.43,81.01 L1511.91,81.01 L1514.39,81.01 L1516.87,81.01
|
||||||
|
L1519.35,81.01 L1521.83,81.01 L1524.31,81.01 L1526.79,81.01 L1529.27,81.01 L1531.75,81.01 L1534.23,81.01 L1536.71,81.01
|
||||||
|
L1539.19,81.01 L1541.67,81.01 L1544.15,81.01 L1546.63,81.01 L1549.11,81.01 L1551.59,81.01 L1554.07,81.01 L1556.55,81.01
|
||||||
|
L1559.03,81.01 L1561.51,81.01 L1563.99,81.01 L1566.47,81.01 L1568.95,81.01 L1571.43,81.01 L1573.91,81.01 L1576.39,81.01
|
||||||
|
L1578.87,81.01 L1581.35,81.01 L1583.83,81.01 L1586.31,81.01 L1588.79,81.01 L1591.27,81.01 L1593.75,81.01 L1596.23,81.01
|
||||||
|
L1598.71,81.01 L1601.19,81.01 L1603.67,81.01 L1606.15,81.01 L1608.63,81.01 L1611.11,81.01 L1613.59,81.01 L1616.07,81.01
|
||||||
|
L1618.55,81.01 L1621.03,81.01 L1621.86,521.11 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_2a" ><title>gnuplot_plot_2a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 114, 178)' d='M249.59,521.11 L252.07,81.01 L254.55,81.01 L257.03,81.01 L259.51,81.01 L261.99,81.01 L264.47,81.01 L266.95,81.01
|
||||||
|
L269.43,81.01 L271.91,81.01 L274.39,81.01 L276.87,81.01 L279.35,81.01 L281.83,81.01 L284.31,81.01 L286.79,81.01
|
||||||
|
L289.27,81.01 L291.75,81.01 L294.23,81.01 L296.71,81.01 L299.19,81.01 L301.67,81.01 L304.15,81.01 L306.63,81.01
|
||||||
|
L309.11,81.01 L311.59,81.01 L314.07,81.01 L316.55,81.01 L319.03,81.01 L321.51,81.01 L323.99,81.01 L326.47,81.01
|
||||||
|
L328.95,81.01 L331.43,81.01 L333.91,81.01 L336.39,81.01 L338.87,81.01 L341.35,81.01 L343.83,81.01 L346.31,81.01
|
||||||
|
L348.79,81.01 L351.27,81.01 L353.75,81.01 L356.23,81.01 L358.71,81.01 L361.19,81.01 L363.67,81.01 L366.15,81.01
|
||||||
|
L368.63,81.01 L371.11,81.01 L373.59,81.01 L376.07,81.01 L378.55,81.01 L381.03,81.01 L383.51,81.01 L385.99,81.01
|
||||||
|
L388.47,81.01 L390.95,81.01 L393.43,81.01 L395.91,81.01 L398.39,81.01 L400.87,81.01 L403.35,81.01 L405.83,81.01
|
||||||
|
L408.31,81.01 L410.79,81.01 L413.27,81.01 L415.75,81.01 L418.23,81.01 L420.71,81.01 L423.19,81.01 L425.67,81.01
|
||||||
|
L428.15,81.01 L430.63,81.01 L433.11,81.01 L435.59,81.01 L438.07,81.01 L440.55,81.01 L443.03,81.01 L445.51,81.01
|
||||||
|
L447.99,81.01 L450.47,81.01 L452.95,81.01 L455.43,81.01 L457.91,81.01 L460.39,81.01 L462.87,81.01 L465.35,81.01
|
||||||
|
L467.83,81.01 L470.31,81.01 L472.79,81.01 L475.27,81.01 L477.75,81.01 L480.23,81.01 L482.71,81.01 L485.19,81.01
|
||||||
|
L487.67,81.01 L490.15,81.01 L492.63,81.01 L495.11,81.01 L497.59,521.11 L500.07,521.11 L502.55,521.11 L505.03,521.11
|
||||||
|
L507.51,521.11 L509.99,521.11 L512.47,521.11 L514.95,521.11 L517.43,521.11 L519.91,521.11 L522.39,521.11 L524.87,521.11
|
||||||
|
L527.35,521.11 L529.83,521.11 L532.31,521.11 L534.79,521.11 L537.27,521.11 L539.75,521.11 L542.23,521.11 L544.71,521.11
|
||||||
|
L547.19,961.21 L549.67,961.21 L552.15,961.21 L554.63,961.21 L557.11,961.21 L559.59,961.21 L562.07,961.21 L564.55,961.21
|
||||||
|
L567.03,961.21 L569.51,961.21 L571.99,961.21 L574.47,961.21 L576.95,961.21 L579.43,961.21 L581.91,961.21 L584.39,961.21
|
||||||
|
L586.87,961.21 L589.35,961.21 L591.83,961.21 L594.31,961.21 L596.79,961.21 L599.27,961.21 L601.75,961.21 L604.23,961.21
|
||||||
|
L606.71,961.21 L609.19,961.21 L611.67,961.21 L614.15,961.21 L616.63,961.21 L619.11,961.21 L621.59,961.21 L624.07,961.21
|
||||||
|
L626.55,961.21 L629.03,961.21 L631.51,961.21 L633.99,961.21 L636.47,961.21 L638.95,961.21 L641.43,961.21 L643.91,961.21
|
||||||
|
L646.39,961.21 L648.87,961.21 L651.35,961.21 L653.83,961.21 L656.31,961.21 L658.79,961.21 L661.27,961.21 L663.75,961.21
|
||||||
|
L666.23,961.21 L668.71,961.21 L671.19,961.21 L673.67,961.21 L676.15,961.21 L678.63,961.21 L681.11,961.21 L683.59,961.21
|
||||||
|
L686.07,961.21 L688.55,961.21 L691.03,961.21 L693.51,961.21 L695.99,961.21 L698.47,961.21 L700.95,961.21 L703.43,961.21
|
||||||
|
L705.91,961.21 L708.39,961.21 L710.87,961.21 L713.35,961.21 L715.83,961.21 L718.31,961.21 L720.79,961.21 L723.27,961.21
|
||||||
|
L725.75,961.21 L728.23,961.21 L730.71,961.21 L733.19,961.21 L735.67,961.21 L738.15,961.21 L740.63,961.21 L743.11,961.21
|
||||||
|
L745.59,961.21 L748.07,961.21 L750.55,961.21 L753.03,961.21 L755.51,961.21 L757.99,961.21 L760.47,961.21 L762.95,961.21
|
||||||
|
L765.43,961.21 L767.91,961.21 L770.39,961.21 L772.87,961.21 L775.35,961.21 L777.83,961.21 L780.31,961.21 L782.79,961.21
|
||||||
|
L785.27,961.21 L787.75,961.21 L790.23,961.21 L792.71,961.21 L795.19,521.11 L797.67,521.11 L800.15,521.11 L802.63,521.11
|
||||||
|
L805.11,521.11 L807.59,521.11 L810.07,521.11 L812.55,521.11 L815.03,521.11 L817.51,521.11 L819.99,521.11 L822.47,521.11
|
||||||
|
L824.95,521.11 L827.43,521.11 L829.91,521.11 L832.39,521.11 L834.87,521.11 L837.35,521.11 L839.83,521.11 L842.31,521.11
|
||||||
|
L844.79,521.11 L847.27,521.11 L849.75,521.11 L852.23,521.11 L854.71,521.11 L857.19,521.11 L859.67,521.11 L862.15,521.11
|
||||||
|
L864.63,521.11 L867.11,521.11 L869.59,521.11 L872.07,521.11 L874.55,521.11 L877.03,521.11 L879.51,521.11 L881.99,521.11
|
||||||
|
L884.47,521.11 L886.95,521.11 L889.43,521.11 L891.91,521.11 L894.39,521.11 L896.87,521.11 L899.35,521.11 L901.83,521.11
|
||||||
|
L904.31,521.11 L906.79,521.11 L909.27,521.11 L911.75,521.11 L914.23,521.11 L916.71,521.11 L919.19,521.11 L921.67,521.11
|
||||||
|
L924.15,521.11 L926.63,521.11 L929.11,521.11 L931.59,521.11 L934.07,521.11 L936.55,521.11 L939.03,521.11 L941.51,521.11
|
||||||
|
L943.99,521.11 L946.47,521.11 L948.95,521.11 L951.43,521.11 L953.91,521.11 L956.39,521.11 L958.87,521.11 L961.35,521.11
|
||||||
|
L963.83,521.11 L966.31,521.11 L968.79,521.11 L971.27,521.11 L973.75,521.11 L976.23,521.11 L978.71,521.11 L981.19,521.11
|
||||||
|
L983.67,521.11 L986.15,521.11 L988.63,521.11 L991.11,521.11 L993.59,521.11 L996.07,521.11 L998.55,521.11 L1001.03,521.11
|
||||||
|
L1003.51,521.11 L1005.99,521.11 L1008.47,521.11 L1010.95,521.11 L1013.43,521.11 L1015.91,521.11 L1018.39,521.11 L1020.87,521.11
|
||||||
|
L1023.35,521.11 L1025.83,521.11 L1028.31,521.11 L1030.79,521.11 L1033.27,521.11 L1035.75,521.11 L1038.23,521.11 L1040.71,521.11
|
||||||
|
L1043.19,521.11 L1045.67,521.11 L1048.15,521.11 L1050.63,521.11 L1053.11,521.11 L1055.59,521.11 L1058.07,521.11 L1060.55,521.11
|
||||||
|
L1063.03,521.11 L1065.51,521.11 L1067.99,521.11 L1070.47,961.21 L1072.95,961.21 L1075.43,961.21 L1077.91,961.21 L1080.39,961.21
|
||||||
|
L1082.87,961.21 L1085.35,961.21 L1087.83,961.21 L1090.31,961.21 L1092.79,961.21 L1095.27,961.21 L1097.75,961.21 L1100.23,961.21
|
||||||
|
L1102.71,961.21 L1105.19,961.21 L1107.67,961.21 L1110.15,961.21 L1112.63,961.21 L1115.11,961.21 L1117.59,961.21 L1120.07,961.21
|
||||||
|
L1122.55,961.21 L1125.03,961.21 L1127.51,961.21 L1129.99,961.21 L1132.47,961.21 L1134.95,961.21 L1137.43,961.21 L1139.91,961.21
|
||||||
|
L1142.39,961.21 L1144.87,961.21 L1147.35,961.21 L1149.83,961.21 L1152.31,961.21 L1154.79,961.21 L1157.27,961.21 L1159.75,961.21
|
||||||
|
L1162.23,961.21 L1164.71,961.21 L1167.19,961.21 L1169.67,961.21 L1172.15,961.21 L1174.63,961.21 L1177.11,961.21 L1179.59,961.21
|
||||||
|
L1182.07,961.21 L1184.55,961.21 L1187.03,961.21 L1189.51,961.21 L1191.99,961.21 L1194.47,961.21 L1196.95,961.21 L1199.43,961.21
|
||||||
|
L1201.91,961.21 L1204.39,961.21 L1206.87,961.21 L1209.35,961.21 L1211.83,961.21 L1214.31,961.21 L1216.79,961.21 L1219.27,961.21
|
||||||
|
L1221.75,961.21 L1224.23,961.21 L1226.71,961.21 L1229.19,961.21 L1231.67,961.21 L1234.15,961.21 L1236.63,961.21 L1239.11,961.21
|
||||||
|
L1241.59,961.21 L1244.07,961.21 L1246.55,961.21 L1249.03,961.21 L1251.51,961.21 L1253.99,961.21 L1256.47,961.21 L1258.95,961.21
|
||||||
|
L1261.43,961.21 L1263.91,961.21 L1266.39,961.21 L1268.87,961.21 L1271.35,961.21 L1273.83,961.21 L1276.31,961.21 L1278.79,961.21
|
||||||
|
L1281.27,961.21 L1283.75,961.21 L1286.23,961.21 L1288.71,961.21 L1291.19,961.21 L1293.67,961.21 L1296.15,961.21 L1298.63,961.21
|
||||||
|
L1301.11,961.21 L1303.59,961.21 L1306.07,961.21 L1308.55,961.21 L1311.03,961.21 L1313.51,961.21 L1315.99,961.21 L1318.47,521.11
|
||||||
|
L1320.95,521.11 L1323.43,521.11 L1325.91,521.11 L1328.39,521.11 L1330.87,521.11 L1333.35,521.11 L1335.83,521.11 L1338.31,521.11
|
||||||
|
L1340.79,521.11 L1343.27,521.11 L1345.75,521.11 L1348.23,81.01 L1350.71,81.01 L1353.19,81.01 L1355.67,81.01 L1358.15,81.01
|
||||||
|
L1360.63,81.01 L1363.11,81.01 L1365.59,81.01 L1368.07,81.01 L1370.55,81.01 L1373.03,81.01 L1375.51,81.01 L1377.99,81.01
|
||||||
|
L1380.47,81.01 L1382.95,81.01 L1385.43,81.01 L1387.91,81.01 L1390.39,81.01 L1392.87,81.01 L1395.35,81.01 L1397.83,81.01
|
||||||
|
L1400.31,81.01 L1402.79,81.01 L1405.27,81.01 L1407.75,81.01 L1410.23,81.01 L1412.71,81.01 L1415.19,81.01 L1417.67,81.01
|
||||||
|
L1420.15,81.01 L1422.63,81.01 L1425.11,81.01 L1427.59,81.01 L1430.07,81.01 L1432.55,81.01 L1435.03,81.01 L1437.51,81.01
|
||||||
|
L1439.99,81.01 L1442.47,81.01 L1444.95,81.01 L1447.43,81.01 L1449.91,81.01 L1452.39,81.01 L1454.87,81.01 L1457.35,81.01
|
||||||
|
L1459.83,81.01 L1462.31,81.01 L1464.79,81.01 L1467.27,81.01 L1469.75,81.01 L1472.23,81.01 L1474.71,81.01 L1477.19,81.01
|
||||||
|
L1479.67,81.01 L1482.15,81.01 L1484.63,81.01 L1487.11,81.01 L1489.59,81.01 L1492.07,81.01 L1494.55,81.01 L1497.03,81.01
|
||||||
|
L1499.51,81.01 L1501.99,81.01 L1504.47,81.01 L1506.95,81.01 L1509.43,81.01 L1511.91,81.01 L1514.39,81.01 L1516.87,81.01
|
||||||
|
L1519.35,81.01 L1521.83,81.01 L1524.31,81.01 L1526.79,81.01 L1529.27,81.01 L1531.75,81.01 L1534.23,81.01 L1536.71,81.01
|
||||||
|
L1539.19,81.01 L1541.67,81.01 L1544.15,81.01 L1546.63,81.01 L1549.11,81.01 L1551.59,81.01 L1554.07,81.01 L1556.55,81.01
|
||||||
|
L1559.03,81.01 L1561.51,81.01 L1563.99,81.01 L1566.47,81.01 L1568.95,81.01 L1571.43,81.01 L1573.91,81.01 L1576.39,81.01
|
||||||
|
L1578.87,81.01 L1581.35,81.01 L1583.83,81.01 L1586.31,81.01 L1588.79,81.01 L1591.27,81.01 L1593.75,81.01 L1594.41,521.11
|
||||||
|
'/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_3a" ><title>gnuplot_plot_3a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 158, 96)' d='M249.59,521.11 L252.07,81.01 L254.55,81.01 L257.03,81.01 L259.51,81.01 L261.99,81.01 L264.47,81.01 L266.95,81.01
|
||||||
|
L269.43,81.01 L271.91,81.01 L274.39,81.01 L276.87,81.01 L279.35,81.01 L281.83,81.01 L284.31,81.01 L286.79,81.01
|
||||||
|
L289.27,81.01 L291.75,81.01 L294.23,81.01 L296.71,81.01 L299.19,81.01 L301.67,81.01 L304.15,81.01 L306.63,81.01
|
||||||
|
L309.11,81.01 L311.59,81.01 L314.07,81.01 L316.55,81.01 L319.03,81.01 L321.51,81.01 L323.99,81.01 L326.47,81.01
|
||||||
|
L328.95,81.01 L331.43,81.01 L333.91,81.01 L336.39,81.01 L338.87,81.01 L341.35,81.01 L343.83,81.01 L346.31,81.01
|
||||||
|
L348.79,81.01 L351.27,81.01 L353.75,81.01 L356.23,81.01 L358.71,81.01 L361.19,81.01 L363.67,81.01 L366.15,81.01
|
||||||
|
L368.63,81.01 L371.11,81.01 L373.59,81.01 L376.07,81.01 L378.55,81.01 L381.03,81.01 L383.51,81.01 L385.99,81.01
|
||||||
|
L388.47,81.01 L390.95,81.01 L393.43,81.01 L395.91,81.01 L398.39,81.01 L400.87,81.01 L403.35,81.01 L405.83,81.01
|
||||||
|
L408.31,81.01 L410.79,81.01 L413.27,81.01 L415.75,81.01 L418.23,81.01 L420.71,81.01 L423.19,81.01 L425.67,81.01
|
||||||
|
L428.15,81.01 L430.63,81.01 L433.11,81.01 L435.59,81.01 L438.07,81.01 L440.55,81.01 L443.03,81.01 L445.51,81.01
|
||||||
|
L447.99,81.01 L450.47,81.01 L452.95,81.01 L455.43,81.01 L457.91,81.01 L460.39,81.01 L462.87,81.01 L465.35,81.01
|
||||||
|
L467.83,81.01 L470.31,81.01 L472.79,81.01 L475.27,81.01 L477.75,81.01 L480.23,81.01 L482.71,81.01 L485.19,81.01
|
||||||
|
L487.67,81.01 L490.15,81.01 L492.63,81.01 L495.11,81.01 L497.59,521.11 L500.07,521.11 L502.55,521.11 L505.03,521.11
|
||||||
|
L507.51,521.11 L509.99,521.11 L512.47,521.11 L514.95,521.11 L517.43,521.11 L519.91,521.11 L522.39,521.11 L524.87,521.11
|
||||||
|
L527.35,961.21 L529.83,961.21 L532.31,961.21 L534.79,961.21 L537.27,961.21 L539.75,961.21 L542.23,961.21 L544.71,961.21
|
||||||
|
L547.19,961.21 L549.67,961.21 L552.15,961.21 L554.63,961.21 L557.11,961.21 L559.59,961.21 L562.07,961.21 L564.55,961.21
|
||||||
|
L567.03,961.21 L569.51,961.21 L571.99,961.21 L574.47,961.21 L576.95,961.21 L579.43,961.21 L581.91,961.21 L584.39,961.21
|
||||||
|
L586.87,961.21 L589.35,961.21 L591.83,961.21 L594.31,961.21 L596.79,961.21 L599.27,961.21 L601.75,961.21 L604.23,961.21
|
||||||
|
L606.71,961.21 L609.19,961.21 L611.67,961.21 L614.15,961.21 L616.63,961.21 L619.11,961.21 L621.59,961.21 L624.07,961.21
|
||||||
|
L626.55,961.21 L629.03,961.21 L631.51,961.21 L633.99,961.21 L636.47,961.21 L638.95,961.21 L641.43,961.21 L643.91,961.21
|
||||||
|
L646.39,961.21 L648.87,961.21 L651.35,961.21 L653.83,961.21 L656.31,961.21 L658.79,961.21 L661.27,961.21 L663.75,961.21
|
||||||
|
L666.23,961.21 L668.71,961.21 L671.19,961.21 L673.67,961.21 L676.15,961.21 L678.63,961.21 L681.11,961.21 L683.59,961.21
|
||||||
|
L686.07,961.21 L688.55,961.21 L691.03,961.21 L693.51,961.21 L695.99,961.21 L698.47,961.21 L700.95,961.21 L703.43,961.21
|
||||||
|
L705.91,961.21 L708.39,961.21 L710.87,961.21 L713.35,961.21 L715.83,961.21 L718.31,961.21 L720.79,961.21 L723.27,961.21
|
||||||
|
L725.75,961.21 L728.23,961.21 L730.71,961.21 L733.19,961.21 L735.67,961.21 L738.15,961.21 L740.63,961.21 L743.11,961.21
|
||||||
|
L745.59,961.21 L748.07,961.21 L750.55,961.21 L753.03,961.21 L755.51,961.21 L757.99,961.21 L760.47,961.21 L762.95,961.21
|
||||||
|
L765.43,961.21 L767.91,961.21 L770.39,961.21 L772.87,961.21 L775.35,521.11 L777.83,521.11 L780.31,521.11 L782.79,521.11
|
||||||
|
L785.27,521.11 L787.75,521.11 L790.23,521.11 L792.71,521.11 L795.19,521.11 L797.67,521.11 L800.15,521.11 L802.63,521.11
|
||||||
|
L805.11,521.11 L807.59,521.11 L810.07,521.11 L812.55,521.11 L815.03,521.11 L817.51,521.11 L819.99,521.11 L822.47,521.11
|
||||||
|
L824.95,521.11 L827.43,521.11 L829.91,521.11 L832.39,521.11 L834.87,521.11 L837.35,521.11 L839.83,521.11 L842.31,521.11
|
||||||
|
L844.79,521.11 L847.27,521.11 L849.75,521.11 L852.23,521.11 L854.71,521.11 L857.19,521.11 L859.67,521.11 L862.15,521.11
|
||||||
|
L864.63,521.11 L867.11,521.11 L869.59,521.11 L872.07,521.11 L874.55,521.11 L877.03,521.11 L879.51,521.11 L881.99,521.11
|
||||||
|
L884.47,521.11 L886.95,521.11 L889.43,521.11 L891.91,521.11 L894.39,521.11 L896.87,521.11 L899.35,521.11 L901.83,521.11
|
||||||
|
L904.31,521.11 L906.79,521.11 L909.27,521.11 L911.75,521.11 L914.23,521.11 L916.71,521.11 L919.19,521.11 L921.67,521.11
|
||||||
|
L924.15,521.11 L926.63,521.11 L929.11,521.11 L931.59,521.11 L934.07,521.11 L936.55,521.11 L939.03,521.11 L941.51,521.11
|
||||||
|
L943.99,521.11 L946.47,521.11 L948.95,521.11 L951.43,521.11 L953.91,521.11 L956.39,521.11 L958.87,521.11 L961.35,521.11
|
||||||
|
L963.83,521.11 L966.31,521.11 L968.79,521.11 L971.27,521.11 L973.75,521.11 L976.23,521.11 L978.71,521.11 L981.19,521.11
|
||||||
|
L983.67,521.11 L986.15,521.11 L988.63,521.11 L991.11,521.11 L993.59,521.11 L996.07,521.11 L998.55,521.11 L1001.03,521.11
|
||||||
|
L1003.51,521.11 L1005.99,521.11 L1008.47,521.11 L1010.95,521.11 L1013.43,521.11 L1015.91,521.11 L1018.39,521.11 L1020.87,521.11
|
||||||
|
L1023.35,521.11 L1025.83,521.11 L1028.31,521.11 L1030.79,521.11 L1033.27,521.11 L1035.75,521.11 L1038.23,521.11 L1040.71,521.11
|
||||||
|
L1043.19,521.11 L1045.67,521.11 L1048.15,521.11 L1050.63,961.21 L1053.11,961.21 L1055.59,961.21 L1058.07,961.21 L1060.55,961.21
|
||||||
|
L1063.03,961.21 L1065.51,961.21 L1067.99,961.21 L1070.47,961.21 L1072.95,961.21 L1075.43,961.21 L1077.91,961.21 L1080.39,961.21
|
||||||
|
L1082.87,961.21 L1085.35,961.21 L1087.83,961.21 L1090.31,961.21 L1092.79,961.21 L1095.27,961.21 L1097.75,961.21 L1100.23,961.21
|
||||||
|
L1102.71,961.21 L1105.19,961.21 L1107.67,961.21 L1110.15,961.21 L1112.63,961.21 L1115.11,961.21 L1117.59,961.21 L1120.07,961.21
|
||||||
|
L1122.55,961.21 L1125.03,961.21 L1127.51,961.21 L1129.99,961.21 L1132.47,961.21 L1134.95,961.21 L1137.43,961.21 L1139.91,961.21
|
||||||
|
L1142.39,961.21 L1144.87,961.21 L1147.35,961.21 L1149.83,961.21 L1152.31,961.21 L1154.79,961.21 L1157.27,961.21 L1159.75,961.21
|
||||||
|
L1162.23,961.21 L1164.71,961.21 L1167.19,961.21 L1169.67,961.21 L1172.15,961.21 L1174.63,961.21 L1177.11,961.21 L1179.59,961.21
|
||||||
|
L1182.07,961.21 L1184.55,961.21 L1187.03,961.21 L1189.51,961.21 L1191.99,961.21 L1194.47,961.21 L1196.95,961.21 L1199.43,961.21
|
||||||
|
L1201.91,961.21 L1204.39,961.21 L1206.87,961.21 L1209.35,961.21 L1211.83,961.21 L1214.31,961.21 L1216.79,961.21 L1219.27,961.21
|
||||||
|
L1221.75,961.21 L1224.23,961.21 L1226.71,961.21 L1229.19,961.21 L1231.67,961.21 L1234.15,961.21 L1236.63,961.21 L1239.11,961.21
|
||||||
|
L1241.59,961.21 L1244.07,961.21 L1246.55,961.21 L1249.03,961.21 L1251.51,961.21 L1253.99,961.21 L1256.47,961.21 L1258.95,961.21
|
||||||
|
L1261.43,961.21 L1263.91,961.21 L1266.39,961.21 L1268.87,961.21 L1271.35,961.21 L1273.83,961.21 L1276.31,961.21 L1278.79,961.21
|
||||||
|
L1281.27,961.21 L1283.75,961.21 L1286.23,961.21 L1288.71,961.21 L1291.19,961.21 L1293.67,961.21 L1296.15,961.21 L1298.63,521.11
|
||||||
|
L1301.11,521.11 L1303.59,521.11 L1306.07,521.11 L1308.55,521.11 L1311.03,521.11 L1313.51,521.11 L1315.99,521.11 L1318.47,521.11
|
||||||
|
L1320.95,521.11 L1323.43,521.11 L1325.91,521.11 L1328.39,521.11 L1330.87,521.11 L1333.35,521.11 L1335.83,521.11 L1338.31,521.11
|
||||||
|
L1340.79,521.11 L1343.27,521.11 L1345.75,521.11 L1348.23,81.01 L1350.71,81.01 L1353.19,81.01 L1355.67,81.01 L1358.15,81.01
|
||||||
|
L1360.63,81.01 L1363.11,81.01 L1365.59,81.01 L1368.07,81.01 L1370.55,81.01 L1373.03,81.01 L1375.51,81.01 L1377.99,81.01
|
||||||
|
L1380.47,81.01 L1382.95,81.01 L1385.43,81.01 L1387.91,81.01 L1390.39,81.01 L1392.87,81.01 L1395.35,81.01 L1397.83,81.01
|
||||||
|
L1400.31,81.01 L1402.79,81.01 L1405.27,81.01 L1407.75,81.01 L1410.23,81.01 L1412.71,81.01 L1415.19,81.01 L1417.67,81.01
|
||||||
|
L1420.15,81.01 L1422.63,81.01 L1425.11,81.01 L1427.59,81.01 L1430.07,81.01 L1432.55,81.01 L1435.03,81.01 L1437.51,81.01
|
||||||
|
L1439.99,81.01 L1442.47,81.01 L1444.95,81.01 L1447.43,81.01 L1449.91,81.01 L1452.39,81.01 L1454.87,81.01 L1457.35,81.01
|
||||||
|
L1459.83,81.01 L1462.31,81.01 L1464.79,81.01 L1467.27,81.01 L1469.75,81.01 L1472.23,81.01 L1474.71,81.01 L1477.19,81.01
|
||||||
|
L1479.67,81.01 L1482.15,81.01 L1484.63,81.01 L1487.11,81.01 L1489.59,81.01 L1492.07,81.01 L1494.55,81.01 L1497.03,81.01
|
||||||
|
L1499.51,81.01 L1501.99,81.01 L1504.47,81.01 L1506.95,81.01 L1509.43,81.01 L1511.91,81.01 L1514.39,81.01 L1516.87,81.01
|
||||||
|
L1519.35,81.01 L1521.83,81.01 L1524.31,81.01 L1526.79,81.01 L1529.27,81.01 L1531.75,81.01 L1534.23,81.01 L1536.71,81.01
|
||||||
|
L1539.19,81.01 L1541.67,81.01 L1544.15,81.01 L1546.63,81.01 L1549.11,81.01 L1551.59,81.01 L1554.07,81.01 L1556.55,81.01
|
||||||
|
L1559.03,81.01 L1561.51,81.01 L1563.99,81.01 L1566.47,81.01 L1568.95,81.01 L1571.43,81.01 L1573.91,81.01 L1576.39,81.01
|
||||||
|
L1578.87,81.01 L1581.35,81.01 L1583.83,81.01 L1586.31,81.01 L1588.79,81.01 L1591.27,81.01 L1593.75,81.01 L1594.41,521.11
|
||||||
|
'/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_4a" ><title>ZeroToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_5a" ><title>ZeroToPositiveVf</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_6a" ><title>PositiveV0ToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g stroke='none' shape-rendering='crispEdges'>
|
||||||
|
<polygon fill = 'white' points = '1534.62,145.12 1724.99,145.12 1724.99,94.51 1534.62,94.51 '/>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="white" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1534.62,145.12 L1534.62,94.51 L1724.99,94.51 L1724.99,145.12 L1534.62,145.12 Z '/></g>
|
||||||
|
<g id="gnuplot_plot_1a" ><title>gnuplot_plot_1a</title>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 0, 0)" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_2a" ><title>gnuplot_plot_2a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_3a" ><title>gnuplot_plot_3a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_4a" ><title>ZeroToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,106.53)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >ZeroToRest</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(216, 51, 45)' d='M1542.31,102.95 L1586.57,102.95 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_5a" ><title>ZeroToPositiveVf</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,123.40)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >ZeroToPositiveVf</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 114, 178)' d='M1542.31,119.82 L1586.57,119.82 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_6a" ><title>PositiveV0ToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,140.27)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >PositiveV0ToRest</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 158, 96)' d='M1542.31,136.69 L1586.57,136.69 '/></g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 158, 96)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="black" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L249.59,961.21 L1737.59,961.21 L1737.59,81.01 L249.59,81.01 Z '/></g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(993.59,47.54)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="17.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" font-weight="bold" >SCurve Jerk</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 46 KiB |
BIN
data/s_curve_position.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
531
data/s_curve_position.svg
Normal file
@ -0,0 +1,531 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="1920" height="1080"
|
||||||
|
viewBox="0 0 1920 1080"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
>
|
||||||
|
|
||||||
|
<title>Gnuplot</title>
|
||||||
|
<desc>Produced by GNUPLOT 5.4 patchlevel 2 </desc>
|
||||||
|
|
||||||
|
<g id="gnuplot_canvas">
|
||||||
|
|
||||||
|
<rect x="0" y="0" width="1920" height="1080" fill="none"/>
|
||||||
|
<defs>
|
||||||
|
|
||||||
|
<circle id='gpDot' r='0.5' stroke-width='0.5' stroke='currentColor'/>
|
||||||
|
<path id='gpPt0' stroke-width='0.148' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
|
||||||
|
<path id='gpPt1' stroke-width='0.148' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
|
||||||
|
<path id='gpPt2' stroke-width='0.148' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
|
||||||
|
<rect id='gpPt3' stroke-width='0.148' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||||
|
<rect id='gpPt4' stroke-width='0.148' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||||
|
<circle id='gpPt5' stroke-width='0.148' stroke='currentColor' cx='0' cy='0' r='1'/>
|
||||||
|
<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
|
||||||
|
<path id='gpPt7' stroke-width='0.148' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
|
||||||
|
<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
|
||||||
|
<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
|
||||||
|
<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
|
||||||
|
<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
|
||||||
|
<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
|
||||||
|
<path id='gpPt13' stroke-width='0.148' stroke='currentColor' d='M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z'/>
|
||||||
|
<use xlink:href='#gpPt13' id='gpPt14' fill='currentColor' stroke='none'/>
|
||||||
|
<filter id='textbox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||||
|
<feFlood flood-color='white' flood-opacity='1' result='bgnd'/>
|
||||||
|
<feComposite in='SourceGraphic' in2='bgnd' operator='atop'/>
|
||||||
|
</filter>
|
||||||
|
<filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||||
|
<feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/>
|
||||||
|
<feComposite in='SourceGraphic' in2='grey' operator='atop'/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<g fill="none" color="white" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,961.21 L1737.59,961.21 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,961.21 L259.71,961.21 '/> <g transform="translate(236.99,966.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >0</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,785.17 L1737.59,785.17 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,785.17 L259.71,785.17 '/> <g transform="translate(236.99,790.37)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >1</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,609.13 L1737.59,609.13 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,609.13 L259.71,609.13 '/> <g transform="translate(236.99,614.33)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >2</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,433.09 L1737.59,433.09 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,433.09 L259.71,433.09 '/> <g transform="translate(236.99,438.29)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >3</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,257.05 L1737.59,257.05 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,257.05 L259.71,257.05 '/> <g transform="translate(236.99,262.25)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >4</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,81.01 L1737.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L259.71,81.01 '/> <g transform="translate(236.99,86.21)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,961.21 L249.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,961.21 L249.59,951.09 '/> <g transform="translate(249.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >0</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M497.59,961.21 L497.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M497.59,961.21 L497.59,951.09 '/> <g transform="translate(497.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >0.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M745.59,961.21 L745.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M745.59,961.21 L745.59,951.09 '/> <g transform="translate(745.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >1</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M993.59,961.21 L993.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M993.59,961.21 L993.59,951.09 '/> <g transform="translate(993.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >1.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1241.59,961.21 L1241.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1241.59,961.21 L1241.59,951.09 '/> <g transform="translate(1241.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >2</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1489.59,961.21 L1489.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1489.59,961.21 L1489.59,951.09 '/> <g transform="translate(1489.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >2.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1737.59,961.21 L1737.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1737.59,961.21 L1737.59,951.09 '/> <g transform="translate(1737.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >3</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L249.59,961.21 L1737.59,961.21 L1737.59,81.01 L249.59,81.01 Z '/></g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(205.01,521.11) rotate(270)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >position [m]</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(993.59,1032.29)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >time [s]</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1534.62,145.12 L1534.62,94.51 L1724.99,94.51 L1724.99,145.12 L1534.62,145.12 Z '/></g>
|
||||||
|
<g id="gnuplot_plot_1a" ><title>gnuplot_plot_1a</title>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 0, 0)" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(216, 51, 45)' d='M249.59,961.21 L252.07,961.21 L254.55,961.21 L257.03,961.21 L259.51,961.21 L261.99,961.21 L264.47,961.20 L266.95,961.20
|
||||||
|
L269.43,961.19 L271.91,961.18 L274.39,961.17 L276.87,961.16 L279.35,961.15 L281.83,961.13 L284.31,961.11 L286.79,961.09
|
||||||
|
L289.27,961.06 L291.75,961.03 L294.23,961.00 L296.71,960.96 L299.19,960.92 L301.67,960.87 L304.15,960.82 L306.63,960.76
|
||||||
|
L309.11,960.70 L311.59,960.64 L314.07,960.57 L316.55,960.49 L319.03,960.40 L321.51,960.32 L323.99,960.22 L326.47,960.12
|
||||||
|
L328.95,960.01 L331.43,959.89 L333.91,959.77 L336.39,959.64 L338.87,959.50 L341.35,959.35 L343.83,959.20 L346.31,959.03
|
||||||
|
L348.79,958.86 L351.27,958.68 L353.75,958.49 L356.23,958.29 L358.71,958.09 L361.19,957.87 L363.67,957.64 L366.15,957.40
|
||||||
|
L368.63,957.15 L371.11,956.90 L373.59,956.63 L376.07,956.35 L378.55,956.05 L381.03,955.75 L383.51,955.44 L385.99,955.11
|
||||||
|
L388.47,954.77 L390.95,954.42 L393.43,954.05 L395.91,953.68 L398.39,953.29 L400.87,952.89 L403.35,952.47 L405.83,952.04
|
||||||
|
L408.31,951.60 L410.79,951.14 L413.27,950.67 L415.75,950.18 L418.23,949.68 L420.71,949.16 L423.19,948.63 L425.67,948.08
|
||||||
|
L428.15,947.52 L430.63,946.94 L433.11,946.35 L435.59,945.74 L438.07,945.11 L440.55,944.47 L443.03,943.81 L445.51,943.13
|
||||||
|
L447.99,942.43 L450.47,941.72 L452.95,940.99 L455.43,940.24 L457.91,939.47 L460.39,938.69 L462.87,937.88 L465.35,937.06
|
||||||
|
L467.83,936.22 L470.31,935.36 L472.79,934.47 L475.27,933.57 L477.75,932.65 L480.23,931.71 L482.71,930.75 L485.19,929.77
|
||||||
|
L487.67,928.76 L490.15,927.74 L492.63,926.69 L495.11,925.62 L497.59,924.54 L500.07,923.42 L502.55,922.29 L505.03,921.14
|
||||||
|
L507.51,919.96 L509.99,918.76 L512.47,917.54 L514.95,916.29 L517.43,915.03 L519.91,913.74 L522.39,912.43 L524.87,911.10
|
||||||
|
L527.35,909.75 L529.83,908.37 L532.31,906.98 L534.79,905.56 L537.27,904.11 L539.75,902.65 L542.23,901.17 L544.71,899.66
|
||||||
|
L547.19,898.13 L549.67,896.58 L552.15,895.00 L554.63,893.41 L557.11,891.79 L559.59,890.16 L562.07,888.50 L564.55,886.82
|
||||||
|
L567.03,885.12 L569.51,883.40 L571.99,881.66 L574.47,879.90 L576.95,878.12 L579.43,876.33 L581.91,874.51 L584.39,872.67
|
||||||
|
L586.87,870.82 L589.35,868.94 L591.83,867.05 L594.31,865.14 L596.79,863.21 L599.27,861.27 L601.75,859.31 L604.23,857.33
|
||||||
|
L606.71,855.33 L609.19,853.32 L611.67,851.29 L614.15,849.24 L616.63,847.18 L619.11,845.10 L621.59,843.01 L624.07,840.90
|
||||||
|
L626.55,838.77 L629.03,836.63 L631.51,834.48 L633.99,832.31 L636.47,830.13 L638.95,827.93 L641.43,825.72 L643.91,823.50
|
||||||
|
L646.39,821.26 L648.87,819.01 L651.35,816.74 L653.83,814.47 L656.31,812.18 L658.79,809.88 L661.27,807.56 L663.75,805.24
|
||||||
|
L666.23,802.90 L668.71,800.55 L671.19,798.19 L673.67,795.82 L676.15,793.44 L678.63,791.04 L681.11,788.64 L683.59,786.23
|
||||||
|
L686.07,783.81 L688.55,781.37 L691.03,778.93 L693.51,776.48 L695.99,774.02 L698.47,771.55 L700.95,769.07 L703.43,766.59
|
||||||
|
L705.91,764.09 L708.39,761.59 L710.87,759.08 L713.35,756.57 L715.83,754.04 L718.31,751.51 L720.79,748.97 L723.27,746.43
|
||||||
|
L725.75,743.88 L728.23,741.32 L730.71,738.76 L733.19,736.19 L735.67,733.61 L738.15,731.03 L740.63,728.45 L743.11,725.86
|
||||||
|
L745.59,723.26 L748.07,720.66 L750.55,718.06 L753.03,715.45 L755.51,712.84 L757.99,710.23 L760.47,707.61 L762.95,704.99
|
||||||
|
L765.43,702.37 L767.91,699.74 L770.39,697.11 L772.87,694.48 L775.35,691.85 L777.83,689.22 L780.31,686.58 L782.79,683.94
|
||||||
|
L785.27,681.30 L787.75,678.66 L790.23,676.02 L792.71,673.38 L795.19,670.74 L797.67,668.10 L800.15,665.46 L802.63,662.82
|
||||||
|
L805.11,660.18 L807.59,657.54 L810.07,654.90 L812.55,652.26 L815.03,649.62 L817.51,646.98 L819.99,644.34 L822.47,641.70
|
||||||
|
L824.95,639.06 L827.43,636.42 L829.91,633.78 L832.39,631.13 L834.87,628.49 L837.35,625.85 L839.83,623.21 L842.31,620.57
|
||||||
|
L844.79,617.93 L847.27,615.29 L849.75,612.65 L852.23,610.01 L854.71,607.37 L857.19,604.73 L859.67,602.09 L862.15,599.45
|
||||||
|
L864.63,596.81 L867.11,594.17 L869.59,591.53 L872.07,588.89 L874.55,586.24 L877.03,583.60 L879.51,580.96 L881.99,578.32
|
||||||
|
L884.47,575.68 L886.95,573.04 L889.43,570.40 L891.91,567.76 L894.39,565.12 L896.87,562.48 L899.35,559.84 L901.83,557.20
|
||||||
|
L904.31,554.56 L906.79,551.92 L909.27,549.28 L911.75,546.64 L914.23,544.00 L916.71,541.35 L919.19,538.71 L921.67,536.07
|
||||||
|
L924.15,533.43 L926.63,530.79 L929.11,528.15 L931.59,525.51 L934.07,522.87 L936.55,520.23 L939.03,517.59 L941.51,514.95
|
||||||
|
L943.99,512.31 L946.47,509.67 L948.95,507.03 L951.43,504.39 L953.91,501.75 L956.39,499.10 L958.87,496.46 L961.35,493.82
|
||||||
|
L963.83,491.18 L966.31,488.54 L968.79,485.90 L971.27,483.26 L973.75,480.62 L976.23,477.98 L978.71,475.34 L981.19,472.70
|
||||||
|
L983.67,470.06 L986.15,467.42 L988.63,464.78 L991.11,462.14 L993.59,459.50 L996.07,456.86 L998.55,454.21 L1001.03,451.57
|
||||||
|
L1003.51,448.93 L1005.99,446.29 L1008.47,443.65 L1010.95,441.01 L1013.43,438.37 L1015.91,435.73 L1018.39,433.09 L1020.87,430.45
|
||||||
|
L1023.35,427.81 L1025.83,425.17 L1028.31,422.53 L1030.79,419.89 L1033.27,417.25 L1035.75,414.61 L1038.23,411.97 L1040.71,409.32
|
||||||
|
L1043.19,406.68 L1045.67,404.04 L1048.15,401.40 L1050.63,398.76 L1053.11,396.12 L1055.59,393.48 L1058.07,390.84 L1060.55,388.20
|
||||||
|
L1063.03,385.56 L1065.51,382.92 L1067.99,380.28 L1070.47,377.64 L1072.95,375.00 L1075.43,372.36 L1077.91,369.72 L1080.39,367.08
|
||||||
|
L1082.87,364.44 L1085.35,361.80 L1087.83,359.16 L1090.31,356.52 L1092.79,353.88 L1095.27,351.25 L1097.75,348.61 L1100.23,345.98
|
||||||
|
L1102.71,343.35 L1105.19,340.73 L1107.67,338.10 L1110.15,335.48 L1112.63,332.86 L1115.11,330.25 L1117.59,327.64 L1120.07,325.03
|
||||||
|
L1122.55,322.42 L1125.03,319.82 L1127.51,317.23 L1129.99,314.64 L1132.47,312.05 L1134.95,309.47 L1137.43,306.89 L1139.91,304.32
|
||||||
|
L1142.39,301.76 L1144.87,299.20 L1147.35,296.64 L1149.83,294.10 L1152.31,291.56 L1154.79,289.02 L1157.27,286.49 L1159.75,283.98
|
||||||
|
L1162.23,281.46 L1164.71,278.96 L1167.19,276.46 L1169.67,273.97 L1172.15,271.49 L1174.63,269.02 L1177.11,266.56 L1179.59,264.10
|
||||||
|
L1182.07,261.66 L1184.55,259.22 L1187.03,256.80 L1189.51,254.38 L1191.99,251.98 L1194.47,249.58 L1196.95,247.19 L1199.43,244.82
|
||||||
|
L1201.91,242.46 L1204.39,240.10 L1206.87,237.76 L1209.35,235.43 L1211.83,233.11 L1214.31,230.81 L1216.79,228.52 L1219.27,226.23
|
||||||
|
L1221.75,223.97 L1224.23,221.71 L1226.71,219.47 L1229.19,217.24 L1231.67,215.02 L1234.15,212.82 L1236.63,210.63 L1239.11,208.46
|
||||||
|
L1241.59,206.30 L1244.07,204.16 L1246.55,202.03 L1249.03,199.91 L1251.51,197.82 L1253.99,195.73 L1256.47,193.67 L1258.95,191.61
|
||||||
|
L1261.43,189.58 L1263.91,187.56 L1266.39,185.56 L1268.87,183.57 L1271.35,181.60 L1273.83,179.65 L1276.31,177.72 L1278.79,175.80
|
||||||
|
L1281.27,173.91 L1283.75,172.03 L1286.23,170.16 L1288.71,168.32 L1291.19,166.50 L1293.67,164.69 L1296.15,162.91 L1298.63,161.14
|
||||||
|
L1301.11,159.40 L1303.59,157.67 L1306.07,155.96 L1308.55,154.28 L1311.03,152.61 L1313.51,150.97 L1315.99,149.35 L1318.47,147.74
|
||||||
|
L1320.95,146.16 L1323.43,144.61 L1325.91,143.07 L1328.39,141.55 L1330.87,140.06 L1333.35,138.59 L1335.83,137.14 L1338.31,135.72
|
||||||
|
L1340.79,134.31 L1343.27,132.93 L1345.75,131.57 L1348.23,130.23 L1350.71,128.91 L1353.19,127.62 L1355.67,126.35 L1358.15,125.09
|
||||||
|
L1360.63,123.87 L1363.11,122.66 L1365.59,121.47 L1368.07,120.31 L1370.55,119.17 L1373.03,118.05 L1375.51,116.96 L1377.99,115.88
|
||||||
|
L1380.47,114.83 L1382.95,113.80 L1385.43,112.79 L1387.91,111.80 L1390.39,110.83 L1392.87,109.88 L1395.35,108.95 L1397.83,108.04
|
||||||
|
L1400.31,107.16 L1402.79,106.29 L1405.27,105.44 L1407.75,104.61 L1410.23,103.80 L1412.71,103.01 L1415.19,102.23 L1417.67,101.48
|
||||||
|
L1420.15,100.74 L1422.63,100.02 L1425.11,99.32 L1427.59,98.64 L1430.07,97.97 L1432.55,97.32 L1435.03,96.69 L1437.51,96.07
|
||||||
|
L1439.99,95.47 L1442.47,94.89 L1444.95,94.32 L1447.43,93.77 L1449.91,93.23 L1452.39,92.71 L1454.87,92.21 L1457.35,91.71
|
||||||
|
L1459.83,91.24 L1462.31,90.78 L1464.79,90.33 L1467.27,89.89 L1469.75,89.47 L1472.23,89.06 L1474.71,88.67 L1477.19,88.29
|
||||||
|
L1479.67,87.92 L1482.15,87.57 L1484.63,87.22 L1487.11,86.89 L1489.59,86.57 L1492.07,86.27 L1494.55,85.97 L1497.03,85.69
|
||||||
|
L1499.51,85.41 L1501.99,85.15 L1504.47,84.90 L1506.95,84.66 L1509.43,84.43 L1511.91,84.21 L1514.39,83.99 L1516.87,83.79
|
||||||
|
L1519.35,83.60 L1521.83,83.42 L1524.31,83.24 L1526.79,83.08 L1529.27,82.92 L1531.75,82.77 L1534.23,82.63 L1536.71,82.49
|
||||||
|
L1539.19,82.37 L1541.67,82.25 L1544.15,82.14 L1546.63,82.03 L1549.11,81.94 L1551.59,81.84 L1554.07,81.76 L1556.55,81.68
|
||||||
|
L1559.03,81.61 L1561.51,81.54 L1563.99,81.48 L1566.47,81.42 L1568.95,81.37 L1571.43,81.32 L1573.91,81.28 L1576.39,81.24
|
||||||
|
L1578.87,81.20 L1581.35,81.17 L1583.83,81.14 L1586.31,81.12 L1588.79,81.10 L1591.27,81.08 L1593.75,81.06 L1596.23,81.05
|
||||||
|
L1598.71,81.04 L1601.19,81.03 L1603.67,81.02 L1606.15,81.02 L1608.63,81.02 L1611.11,81.01 L1613.59,81.01 L1616.07,81.01
|
||||||
|
L1618.55,81.01 L1621.03,81.01 L1621.86,81.01 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_2a" ><title>gnuplot_plot_2a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 114, 178)' d='M249.59,961.21 L252.07,961.21 L254.55,961.21 L257.03,961.21 L259.51,961.21 L261.99,961.21 L264.47,961.20 L266.95,961.20
|
||||||
|
L269.43,961.19 L271.91,961.18 L274.39,961.17 L276.87,961.16 L279.35,961.15 L281.83,961.13 L284.31,961.11 L286.79,961.09
|
||||||
|
L289.27,961.06 L291.75,961.03 L294.23,961.00 L296.71,960.96 L299.19,960.92 L301.67,960.87 L304.15,960.82 L306.63,960.76
|
||||||
|
L309.11,960.70 L311.59,960.64 L314.07,960.57 L316.55,960.49 L319.03,960.40 L321.51,960.32 L323.99,960.22 L326.47,960.12
|
||||||
|
L328.95,960.01 L331.43,959.89 L333.91,959.77 L336.39,959.64 L338.87,959.50 L341.35,959.35 L343.83,959.20 L346.31,959.03
|
||||||
|
L348.79,958.86 L351.27,958.68 L353.75,958.49 L356.23,958.29 L358.71,958.09 L361.19,957.87 L363.67,957.64 L366.15,957.40
|
||||||
|
L368.63,957.15 L371.11,956.90 L373.59,956.63 L376.07,956.35 L378.55,956.05 L381.03,955.75 L383.51,955.44 L385.99,955.11
|
||||||
|
L388.47,954.77 L390.95,954.42 L393.43,954.05 L395.91,953.68 L398.39,953.29 L400.87,952.89 L403.35,952.47 L405.83,952.04
|
||||||
|
L408.31,951.60 L410.79,951.14 L413.27,950.67 L415.75,950.18 L418.23,949.68 L420.71,949.16 L423.19,948.63 L425.67,948.08
|
||||||
|
L428.15,947.52 L430.63,946.94 L433.11,946.35 L435.59,945.74 L438.07,945.11 L440.55,944.47 L443.03,943.81 L445.51,943.13
|
||||||
|
L447.99,942.43 L450.47,941.72 L452.95,940.99 L455.43,940.24 L457.91,939.47 L460.39,938.69 L462.87,937.88 L465.35,937.06
|
||||||
|
L467.83,936.22 L470.31,935.36 L472.79,934.47 L475.27,933.57 L477.75,932.65 L480.23,931.71 L482.71,930.75 L485.19,929.77
|
||||||
|
L487.67,928.76 L490.15,927.74 L492.63,926.69 L495.11,925.62 L497.59,924.54 L500.07,923.42 L502.55,922.29 L505.03,921.14
|
||||||
|
L507.51,919.96 L509.99,918.76 L512.47,917.54 L514.95,916.29 L517.43,915.03 L519.91,913.74 L522.39,912.43 L524.87,911.10
|
||||||
|
L527.35,909.75 L529.83,908.37 L532.31,906.98 L534.79,905.56 L537.27,904.11 L539.75,902.65 L542.23,901.17 L544.71,899.66
|
||||||
|
L547.19,898.13 L549.67,896.58 L552.15,895.00 L554.63,893.41 L557.11,891.79 L559.59,890.16 L562.07,888.50 L564.55,886.82
|
||||||
|
L567.03,885.12 L569.51,883.40 L571.99,881.66 L574.47,879.90 L576.95,878.12 L579.43,876.33 L581.91,874.51 L584.39,872.67
|
||||||
|
L586.87,870.82 L589.35,868.94 L591.83,867.05 L594.31,865.14 L596.79,863.21 L599.27,861.27 L601.75,859.31 L604.23,857.33
|
||||||
|
L606.71,855.33 L609.19,853.32 L611.67,851.29 L614.15,849.24 L616.63,847.18 L619.11,845.10 L621.59,843.01 L624.07,840.90
|
||||||
|
L626.55,838.77 L629.03,836.63 L631.51,834.48 L633.99,832.31 L636.47,830.13 L638.95,827.93 L641.43,825.72 L643.91,823.50
|
||||||
|
L646.39,821.26 L648.87,819.01 L651.35,816.74 L653.83,814.47 L656.31,812.18 L658.79,809.88 L661.27,807.56 L663.75,805.24
|
||||||
|
L666.23,802.90 L668.71,800.55 L671.19,798.19 L673.67,795.82 L676.15,793.44 L678.63,791.04 L681.11,788.64 L683.59,786.23
|
||||||
|
L686.07,783.81 L688.55,781.37 L691.03,778.93 L693.51,776.48 L695.99,774.02 L698.47,771.55 L700.95,769.07 L703.43,766.59
|
||||||
|
L705.91,764.09 L708.39,761.59 L710.87,759.08 L713.35,756.57 L715.83,754.04 L718.31,751.51 L720.79,748.97 L723.27,746.43
|
||||||
|
L725.75,743.88 L728.23,741.32 L730.71,738.76 L733.19,736.19 L735.67,733.61 L738.15,731.03 L740.63,728.45 L743.11,725.86
|
||||||
|
L745.59,723.26 L748.07,720.66 L750.55,718.06 L753.03,715.45 L755.51,712.84 L757.99,710.23 L760.47,707.61 L762.95,704.99
|
||||||
|
L765.43,702.37 L767.91,699.74 L770.39,697.11 L772.87,694.48 L775.35,691.85 L777.83,689.22 L780.31,686.58 L782.79,683.94
|
||||||
|
L785.27,681.30 L787.75,678.66 L790.23,676.02 L792.71,673.38 L795.19,670.74 L797.67,668.10 L800.15,665.46 L802.63,662.82
|
||||||
|
L805.11,660.18 L807.59,657.54 L810.07,654.90 L812.55,652.26 L815.03,649.62 L817.51,646.98 L819.99,644.34 L822.47,641.70
|
||||||
|
L824.95,639.06 L827.43,636.42 L829.91,633.78 L832.39,631.13 L834.87,628.49 L837.35,625.85 L839.83,623.21 L842.31,620.57
|
||||||
|
L844.79,617.93 L847.27,615.29 L849.75,612.65 L852.23,610.01 L854.71,607.37 L857.19,604.73 L859.67,602.09 L862.15,599.45
|
||||||
|
L864.63,596.81 L867.11,594.17 L869.59,591.53 L872.07,588.89 L874.55,586.24 L877.03,583.60 L879.51,580.96 L881.99,578.32
|
||||||
|
L884.47,575.68 L886.95,573.04 L889.43,570.40 L891.91,567.76 L894.39,565.12 L896.87,562.48 L899.35,559.84 L901.83,557.20
|
||||||
|
L904.31,554.56 L906.79,551.92 L909.27,549.28 L911.75,546.64 L914.23,544.00 L916.71,541.35 L919.19,538.71 L921.67,536.07
|
||||||
|
L924.15,533.43 L926.63,530.79 L929.11,528.15 L931.59,525.51 L934.07,522.87 L936.55,520.23 L939.03,517.59 L941.51,514.95
|
||||||
|
L943.99,512.31 L946.47,509.67 L948.95,507.03 L951.43,504.39 L953.91,501.75 L956.39,499.10 L958.87,496.46 L961.35,493.82
|
||||||
|
L963.83,491.18 L966.31,488.54 L968.79,485.90 L971.27,483.26 L973.75,480.62 L976.23,477.98 L978.71,475.34 L981.19,472.70
|
||||||
|
L983.67,470.06 L986.15,467.42 L988.63,464.78 L991.11,462.14 L993.59,459.50 L996.07,456.86 L998.55,454.21 L1001.03,451.57
|
||||||
|
L1003.51,448.93 L1005.99,446.29 L1008.47,443.65 L1010.95,441.01 L1013.43,438.37 L1015.91,435.73 L1018.39,433.09 L1020.87,430.45
|
||||||
|
L1023.35,427.81 L1025.83,425.17 L1028.31,422.53 L1030.79,419.89 L1033.27,417.25 L1035.75,414.61 L1038.23,411.97 L1040.71,409.32
|
||||||
|
L1043.19,406.68 L1045.67,404.04 L1048.15,401.40 L1050.63,398.76 L1053.11,396.12 L1055.59,393.48 L1058.07,390.84 L1060.55,388.20
|
||||||
|
L1063.03,385.56 L1065.51,382.92 L1067.99,380.28 L1070.47,377.64 L1072.95,375.00 L1075.43,372.36 L1077.91,369.72 L1080.39,367.08
|
||||||
|
L1082.87,364.44 L1085.35,361.80 L1087.83,359.17 L1090.31,356.54 L1092.79,353.91 L1095.27,351.28 L1097.75,348.65 L1100.23,346.03
|
||||||
|
L1102.71,343.40 L1105.19,340.79 L1107.67,338.17 L1110.15,335.56 L1112.63,332.95 L1115.11,330.35 L1117.59,327.75 L1120.07,325.15
|
||||||
|
L1122.55,322.56 L1125.03,319.98 L1127.51,317.39 L1129.99,314.82 L1132.47,312.25 L1134.95,309.68 L1137.43,307.12 L1139.91,304.57
|
||||||
|
L1142.39,302.02 L1144.87,299.48 L1147.35,296.95 L1149.83,294.42 L1152.31,291.91 L1154.79,289.39 L1157.27,286.89 L1159.75,284.39
|
||||||
|
L1162.23,281.91 L1164.71,279.43 L1167.19,276.95 L1169.67,274.49 L1172.15,272.04 L1174.63,269.59 L1177.11,267.16 L1179.59,264.73
|
||||||
|
L1182.07,262.32 L1184.55,259.91 L1187.03,257.52 L1189.51,255.13 L1191.99,252.76 L1194.47,250.40 L1196.95,248.04 L1199.43,245.70
|
||||||
|
L1201.91,243.38 L1204.39,241.06 L1206.87,238.75 L1209.35,236.46 L1211.83,234.18 L1214.31,231.91 L1216.79,229.66 L1219.27,227.42
|
||||||
|
L1221.75,225.19 L1224.23,222.97 L1226.71,220.77 L1229.19,218.59 L1231.67,216.42 L1234.15,214.26 L1236.63,212.11 L1239.11,209.99
|
||||||
|
L1241.59,207.87 L1244.07,205.77 L1246.55,203.69 L1249.03,201.63 L1251.51,199.58 L1253.99,197.54 L1256.47,195.52 L1258.95,193.52
|
||||||
|
L1261.43,191.54 L1263.91,189.57 L1266.39,187.62 L1268.87,185.69 L1271.35,183.77 L1273.83,181.88 L1276.31,180.00 L1278.79,178.14
|
||||||
|
L1281.27,176.30 L1283.75,174.48 L1286.23,172.67 L1288.71,170.89 L1291.19,169.12 L1293.67,167.38 L1296.15,165.65 L1298.63,163.95
|
||||||
|
L1301.11,162.26 L1303.59,160.60 L1306.07,158.96 L1308.55,157.34 L1311.03,155.74 L1313.51,154.16 L1315.99,152.60 L1318.47,151.07
|
||||||
|
L1320.95,149.55 L1323.43,148.06 L1325.91,146.59 L1328.39,145.14 L1330.87,143.72 L1333.35,142.32 L1335.83,140.93 L1338.31,139.58
|
||||||
|
L1340.79,138.24 L1343.27,136.92 L1345.75,135.63 L1348.23,134.36 L1350.71,133.11 L1353.19,131.88 L1355.67,130.68 L1358.15,129.49
|
||||||
|
L1360.63,128.33 L1363.11,127.18 L1365.59,126.06 L1368.07,124.96 L1370.55,123.87 L1373.03,122.81 L1375.51,121.77 L1377.99,120.75
|
||||||
|
L1380.47,119.74 L1382.95,118.76 L1385.43,117.79 L1387.91,116.84 L1390.39,115.91 L1392.87,115.00 L1395.35,114.11 L1397.83,113.23
|
||||||
|
L1400.31,112.37 L1402.79,111.53 L1405.27,110.71 L1407.75,109.90 L1410.23,109.11 L1412.71,108.33 L1415.19,107.57 L1417.67,106.83
|
||||||
|
L1420.15,106.10 L1422.63,105.39 L1425.11,104.70 L1427.59,104.01 L1430.07,103.35 L1432.55,102.70 L1435.03,102.06 L1437.51,101.43
|
||||||
|
L1439.99,100.83 L1442.47,100.23 L1444.95,99.65 L1447.43,99.08 L1449.91,98.52 L1452.39,97.98 L1454.87,97.45 L1457.35,96.93
|
||||||
|
L1459.83,96.42 L1462.31,95.93 L1464.79,95.45 L1467.27,94.98 L1469.75,94.52 L1472.23,94.07 L1474.71,93.63 L1477.19,93.20
|
||||||
|
L1479.67,92.79 L1482.15,92.38 L1484.63,91.98 L1487.11,91.60 L1489.59,91.22 L1492.07,90.85 L1494.55,90.49 L1497.03,90.14
|
||||||
|
L1499.51,89.80 L1501.99,89.47 L1504.47,89.14 L1506.95,88.83 L1509.43,88.52 L1511.91,88.22 L1514.39,87.92 L1516.87,87.64
|
||||||
|
L1519.35,87.36 L1521.83,87.08 L1524.31,86.81 L1526.79,86.55 L1529.27,86.30 L1531.75,86.05 L1534.23,85.81 L1536.71,85.57
|
||||||
|
L1539.19,85.33 L1541.67,85.11 L1544.15,84.88 L1546.63,84.66 L1549.11,84.45 L1551.59,84.24 L1554.07,84.03 L1556.55,83.83
|
||||||
|
L1559.03,83.63 L1561.51,83.43 L1563.99,83.24 L1566.47,83.05 L1568.95,82.86 L1571.43,82.67 L1573.91,82.49 L1576.39,82.30
|
||||||
|
L1578.87,82.12 L1581.35,81.94 L1583.83,81.76 L1586.31,81.59 L1588.79,81.41 L1591.27,81.23 L1593.75,81.06 L1594.41,81.01
|
||||||
|
'/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_3a" ><title>gnuplot_plot_3a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 158, 96)' d='M249.59,961.21 L252.07,961.03 L254.55,960.86 L257.03,960.68 L259.51,960.50 L261.99,960.33 L264.47,960.15 L266.95,959.97
|
||||||
|
L269.43,959.78 L271.91,959.60 L274.39,959.41 L276.87,959.22 L279.35,959.03 L281.83,958.84 L284.31,958.64 L286.79,958.45
|
||||||
|
L289.27,958.24 L291.75,958.04 L294.23,957.83 L296.71,957.61 L299.19,957.40 L301.67,957.17 L304.15,956.95 L306.63,956.71
|
||||||
|
L309.11,956.48 L311.59,956.24 L314.07,955.99 L316.55,955.74 L319.03,955.48 L321.51,955.21 L323.99,954.94 L326.47,954.66
|
||||||
|
L328.95,954.37 L331.43,954.08 L333.91,953.78 L336.39,953.48 L338.87,953.16 L341.35,952.84 L343.83,952.51 L346.31,952.17
|
||||||
|
L348.79,951.82 L351.27,951.46 L353.75,951.10 L356.23,950.72 L358.71,950.34 L361.19,949.95 L363.67,949.54 L366.15,949.13
|
||||||
|
L368.63,948.70 L371.11,948.27 L373.59,947.82 L376.07,947.37 L378.55,946.90 L381.03,946.42 L383.51,945.93 L385.99,945.43
|
||||||
|
L388.47,944.91 L390.95,944.38 L393.43,943.84 L395.91,943.29 L398.39,942.73 L400.87,942.15 L403.35,941.55 L405.83,940.95
|
||||||
|
L408.31,940.33 L410.79,939.70 L413.27,939.05 L415.75,938.38 L418.23,937.71 L420.71,937.02 L423.19,936.31 L425.67,935.58
|
||||||
|
L428.15,934.85 L430.63,934.09 L433.11,933.32 L435.59,932.53 L438.07,931.73 L440.55,930.91 L443.03,930.07 L445.51,929.22
|
||||||
|
L447.99,928.35 L450.47,927.46 L452.95,926.55 L455.43,925.63 L457.91,924.69 L460.39,923.72 L462.87,922.74 L465.35,921.74
|
||||||
|
L467.83,920.73 L470.31,919.69 L472.79,918.63 L475.27,917.55 L477.75,916.46 L480.23,915.34 L482.71,914.20 L485.19,913.04
|
||||||
|
L487.67,911.86 L490.15,910.66 L492.63,909.44 L495.11,908.20 L497.59,906.93 L500.07,905.64 L502.55,904.33 L505.03,903.00
|
||||||
|
L507.51,901.65 L509.99,900.27 L512.47,898.88 L514.95,897.46 L517.43,896.02 L519.91,894.55 L522.39,893.07 L524.87,891.56
|
||||||
|
L527.35,890.03 L529.83,888.48 L532.31,886.91 L534.79,885.31 L537.27,883.70 L539.75,882.06 L542.23,880.40 L544.71,878.72
|
||||||
|
L547.19,877.02 L549.67,875.30 L552.15,873.56 L554.63,871.80 L557.11,870.03 L559.59,868.23 L562.07,866.41 L564.55,864.57
|
||||||
|
L567.03,862.72 L569.51,860.85 L571.99,858.95 L574.47,857.04 L576.95,855.12 L579.43,853.17 L581.91,851.21 L584.39,849.23
|
||||||
|
L586.87,847.23 L589.35,845.22 L591.83,843.19 L594.31,841.14 L596.79,839.08 L599.27,837.00 L601.75,834.91 L604.23,832.80
|
||||||
|
L606.71,830.68 L609.19,828.54 L611.67,826.38 L614.15,824.21 L616.63,822.03 L619.11,819.83 L621.59,817.62 L624.07,815.40
|
||||||
|
L626.55,813.16 L629.03,810.91 L631.51,808.65 L633.99,806.37 L636.47,804.08 L638.95,801.78 L641.43,799.46 L643.91,797.14
|
||||||
|
L646.39,794.80 L648.87,792.45 L651.35,790.09 L653.83,787.72 L656.31,785.34 L658.79,782.95 L661.27,780.54 L663.75,778.13
|
||||||
|
L666.23,775.71 L668.71,773.28 L671.19,770.83 L673.67,768.38 L676.15,765.92 L678.63,763.45 L681.11,760.98 L683.59,758.49
|
||||||
|
L686.07,756.00 L688.55,753.49 L691.03,750.99 L693.51,748.47 L695.99,745.94 L698.47,743.41 L700.95,740.87 L703.43,738.33
|
||||||
|
L705.91,735.78 L708.39,733.22 L710.87,730.66 L713.35,728.09 L715.83,725.51 L718.31,722.93 L720.79,720.35 L723.27,717.76
|
||||||
|
L725.75,715.16 L728.23,712.57 L730.71,709.96 L733.19,707.36 L735.67,704.75 L738.15,702.13 L740.63,699.51 L743.11,696.89
|
||||||
|
L745.59,694.27 L748.07,691.64 L750.55,689.02 L753.03,686.38 L755.51,683.75 L757.99,681.12 L760.47,678.48 L762.95,675.84
|
||||||
|
L765.43,673.21 L767.91,670.57 L770.39,667.93 L772.87,665.29 L775.35,662.65 L777.83,660.01 L780.31,657.36 L782.79,654.72
|
||||||
|
L785.27,652.08 L787.75,649.44 L790.23,646.80 L792.71,644.16 L795.19,641.52 L797.67,638.88 L800.15,636.24 L802.63,633.60
|
||||||
|
L805.11,630.96 L807.59,628.32 L810.07,625.68 L812.55,623.04 L815.03,620.40 L817.51,617.76 L819.99,615.12 L822.47,612.47
|
||||||
|
L824.95,609.83 L827.43,607.19 L829.91,604.55 L832.39,601.91 L834.87,599.27 L837.35,596.63 L839.83,593.99 L842.31,591.35
|
||||||
|
L844.79,588.71 L847.27,586.07 L849.75,583.43 L852.23,580.79 L854.71,578.15 L857.19,575.51 L859.67,572.87 L862.15,570.23
|
||||||
|
L864.63,567.58 L867.11,564.94 L869.59,562.30 L872.07,559.66 L874.55,557.02 L877.03,554.38 L879.51,551.74 L881.99,549.10
|
||||||
|
L884.47,546.46 L886.95,543.82 L889.43,541.18 L891.91,538.54 L894.39,535.90 L896.87,533.26 L899.35,530.62 L901.83,527.98
|
||||||
|
L904.31,525.33 L906.79,522.69 L909.27,520.05 L911.75,517.41 L914.23,514.77 L916.71,512.13 L919.19,509.49 L921.67,506.85
|
||||||
|
L924.15,504.21 L926.63,501.57 L929.11,498.93 L931.59,496.29 L934.07,493.65 L936.55,491.01 L939.03,488.37 L941.51,485.73
|
||||||
|
L943.99,483.09 L946.47,480.44 L948.95,477.80 L951.43,475.16 L953.91,472.52 L956.39,469.88 L958.87,467.24 L961.35,464.60
|
||||||
|
L963.83,461.96 L966.31,459.32 L968.79,456.68 L971.27,454.04 L973.75,451.40 L976.23,448.76 L978.71,446.12 L981.19,443.48
|
||||||
|
L983.67,440.84 L986.15,438.20 L988.63,435.55 L991.11,432.91 L993.59,430.27 L996.07,427.63 L998.55,424.99 L1001.03,422.35
|
||||||
|
L1003.51,419.71 L1005.99,417.07 L1008.47,414.43 L1010.95,411.79 L1013.43,409.15 L1015.91,406.51 L1018.39,403.87 L1020.87,401.23
|
||||||
|
L1023.35,398.59 L1025.83,395.95 L1028.31,393.30 L1030.79,390.66 L1033.27,388.02 L1035.75,385.38 L1038.23,382.74 L1040.71,380.10
|
||||||
|
L1043.19,377.46 L1045.67,374.82 L1048.15,372.18 L1050.63,369.54 L1053.11,366.90 L1055.59,364.26 L1058.07,361.62 L1060.55,358.98
|
||||||
|
L1063.03,356.34 L1065.51,353.71 L1067.99,351.07 L1070.47,348.44 L1072.95,345.81 L1075.43,343.18 L1077.91,340.55 L1080.39,337.93
|
||||||
|
L1082.87,335.31 L1085.35,332.69 L1087.83,330.07 L1090.31,327.46 L1092.79,324.85 L1095.27,322.25 L1097.75,319.65 L1100.23,317.05
|
||||||
|
L1102.71,314.46 L1105.19,311.88 L1107.67,309.30 L1110.15,306.72 L1112.63,304.15 L1115.11,301.58 L1117.59,299.03 L1120.07,296.47
|
||||||
|
L1122.55,293.93 L1125.03,291.39 L1127.51,288.85 L1129.99,286.33 L1132.47,283.81 L1134.95,281.30 L1137.43,278.79 L1139.91,276.30
|
||||||
|
L1142.39,273.81 L1144.87,271.33 L1147.35,268.86 L1149.83,266.39 L1152.31,263.94 L1154.79,261.50 L1157.27,259.06 L1159.75,256.64
|
||||||
|
L1162.23,254.22 L1164.71,251.82 L1167.19,249.42 L1169.67,247.04 L1172.15,244.66 L1174.63,242.30 L1177.11,239.95 L1179.59,237.61
|
||||||
|
L1182.07,235.28 L1184.55,232.96 L1187.03,230.66 L1189.51,228.36 L1191.99,226.08 L1194.47,223.82 L1196.95,221.56 L1199.43,219.32
|
||||||
|
L1201.91,217.09 L1204.39,214.88 L1206.87,212.68 L1209.35,210.49 L1211.83,208.32 L1214.31,206.16 L1216.79,204.02 L1219.27,201.89
|
||||||
|
L1221.75,199.77 L1224.23,197.68 L1226.71,195.59 L1229.19,193.53 L1231.67,191.48 L1234.15,189.44 L1236.63,187.43 L1239.11,185.42
|
||||||
|
L1241.59,183.44 L1244.07,181.47 L1246.55,179.52 L1249.03,177.59 L1251.51,175.68 L1253.99,173.78 L1256.47,171.90 L1258.95,170.04
|
||||||
|
L1261.43,168.20 L1263.91,166.38 L1266.39,164.57 L1268.87,162.79 L1271.35,161.03 L1273.83,159.28 L1276.31,157.56 L1278.79,155.85
|
||||||
|
L1281.27,154.17 L1283.75,152.50 L1286.23,150.86 L1288.71,149.24 L1291.19,147.64 L1293.67,146.06 L1296.15,144.50 L1298.63,142.97
|
||||||
|
L1301.11,141.45 L1303.59,139.96 L1306.07,138.49 L1308.55,137.05 L1311.03,135.62 L1313.51,134.22 L1315.99,132.84 L1318.47,131.48
|
||||||
|
L1320.95,130.14 L1323.43,128.83 L1325.91,127.53 L1328.39,126.26 L1330.87,125.01 L1333.35,123.78 L1335.83,122.58 L1338.31,121.40
|
||||||
|
L1340.79,120.24 L1343.27,119.10 L1345.75,117.98 L1348.23,116.88 L1350.71,115.81 L1353.19,114.76 L1355.67,113.73 L1358.15,112.72
|
||||||
|
L1360.63,111.73 L1363.11,110.76 L1365.59,109.82 L1368.07,108.89 L1370.55,107.98 L1373.03,107.10 L1375.51,106.23 L1377.99,105.38
|
||||||
|
L1380.47,104.56 L1382.95,103.75 L1385.43,102.96 L1387.91,102.18 L1390.39,101.43 L1392.87,100.69 L1395.35,99.98 L1397.83,99.28
|
||||||
|
L1400.31,98.59 L1402.79,97.93 L1405.27,97.28 L1407.75,96.65 L1410.23,96.03 L1412.71,95.43 L1415.19,94.85 L1417.67,94.28
|
||||||
|
L1420.15,93.73 L1422.63,93.20 L1425.11,92.68 L1427.59,92.17 L1430.07,91.68 L1432.55,91.21 L1435.03,90.74 L1437.51,90.30
|
||||||
|
L1439.99,89.86 L1442.47,89.44 L1444.95,89.04 L1447.43,88.64 L1449.91,88.26 L1452.39,87.90 L1454.87,87.54 L1457.35,87.20
|
||||||
|
L1459.83,86.87 L1462.31,86.55 L1464.79,86.25 L1467.27,85.95 L1469.75,85.67 L1472.23,85.40 L1474.71,85.13 L1477.19,84.88
|
||||||
|
L1479.67,84.64 L1482.15,84.41 L1484.63,84.19 L1487.11,83.98 L1489.59,83.78 L1492.07,83.59 L1494.55,83.40 L1497.03,83.23
|
||||||
|
L1499.51,83.07 L1501.99,82.91 L1504.47,82.76 L1506.95,82.62 L1509.43,82.49 L1511.91,82.36 L1514.39,82.24 L1516.87,82.13
|
||||||
|
L1519.35,82.03 L1521.83,81.93 L1524.31,81.84 L1526.79,81.75 L1529.27,81.67 L1531.75,81.60 L1534.23,81.53 L1536.71,81.47
|
||||||
|
L1539.19,81.41 L1541.67,81.36 L1544.15,81.32 L1546.63,81.27 L1549.11,81.23 L1551.59,81.20 L1554.07,81.17 L1556.55,81.14
|
||||||
|
L1559.03,81.12 L1561.51,81.10 L1563.99,81.08 L1566.47,81.06 L1568.95,81.05 L1571.43,81.04 L1573.91,81.03 L1576.39,81.02
|
||||||
|
L1578.87,81.02 L1581.35,81.02 L1583.83,81.01 L1586.31,81.01 L1588.79,81.01 L1591.27,81.01 L1593.75,81.01 L1594.41,81.01
|
||||||
|
'/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_4a" ><title>ZeroToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_5a" ><title>ZeroToPositiveVf</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_6a" ><title>PositiveV0ToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g stroke='none' shape-rendering='crispEdges'>
|
||||||
|
<polygon fill = 'white' points = '1534.62,145.12 1724.99,145.12 1724.99,94.51 1534.62,94.51 '/>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="white" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1534.62,145.12 L1534.62,94.51 L1724.99,94.51 L1724.99,145.12 L1534.62,145.12 Z '/></g>
|
||||||
|
<g id="gnuplot_plot_1a" ><title>gnuplot_plot_1a</title>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 0, 0)" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_2a" ><title>gnuplot_plot_2a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_3a" ><title>gnuplot_plot_3a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_4a" ><title>ZeroToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,106.53)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >ZeroToRest</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(216, 51, 45)' d='M1542.31,102.95 L1586.57,102.95 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_5a" ><title>ZeroToPositiveVf</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,123.40)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >ZeroToPositiveVf</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 114, 178)' d='M1542.31,119.82 L1586.57,119.82 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_6a" ><title>PositiveV0ToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,140.27)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >PositiveV0ToRest</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 158, 96)' d='M1542.31,136.69 L1586.57,136.69 '/></g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 158, 96)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="black" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L249.59,961.21 L1737.59,961.21 L1737.59,81.01 L249.59,81.01 Z '/></g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(993.59,47.54)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="17.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" font-weight="bold" >SCurve Position</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 47 KiB |
BIN
data/s_curve_velocity.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
544
data/s_curve_velocity.svg
Normal file
@ -0,0 +1,544 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="1920" height="1080"
|
||||||
|
viewBox="0 0 1920 1080"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
>
|
||||||
|
|
||||||
|
<title>Gnuplot</title>
|
||||||
|
<desc>Produced by GNUPLOT 5.4 patchlevel 2 </desc>
|
||||||
|
|
||||||
|
<g id="gnuplot_canvas">
|
||||||
|
|
||||||
|
<rect x="0" y="0" width="1920" height="1080" fill="none"/>
|
||||||
|
<defs>
|
||||||
|
|
||||||
|
<circle id='gpDot' r='0.5' stroke-width='0.5' stroke='currentColor'/>
|
||||||
|
<path id='gpPt0' stroke-width='0.148' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
|
||||||
|
<path id='gpPt1' stroke-width='0.148' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
|
||||||
|
<path id='gpPt2' stroke-width='0.148' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
|
||||||
|
<rect id='gpPt3' stroke-width='0.148' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||||
|
<rect id='gpPt4' stroke-width='0.148' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||||
|
<circle id='gpPt5' stroke-width='0.148' stroke='currentColor' cx='0' cy='0' r='1'/>
|
||||||
|
<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
|
||||||
|
<path id='gpPt7' stroke-width='0.148' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
|
||||||
|
<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
|
||||||
|
<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
|
||||||
|
<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
|
||||||
|
<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
|
||||||
|
<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
|
||||||
|
<path id='gpPt13' stroke-width='0.148' stroke='currentColor' d='M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z'/>
|
||||||
|
<use xlink:href='#gpPt13' id='gpPt14' fill='currentColor' stroke='none'/>
|
||||||
|
<filter id='textbox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||||
|
<feFlood flood-color='white' flood-opacity='1' result='bgnd'/>
|
||||||
|
<feComposite in='SourceGraphic' in2='bgnd' operator='atop'/>
|
||||||
|
</filter>
|
||||||
|
<filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||||
|
<feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/>
|
||||||
|
<feComposite in='SourceGraphic' in2='grey' operator='atop'/>
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<g fill="none" color="white" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,961.21 L1737.59,961.21 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,961.21 L259.71,961.21 '/> <g transform="translate(236.99,966.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >0</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,814.51 L1737.59,814.51 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,814.51 L259.71,814.51 '/> <g transform="translate(236.99,819.71)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >0.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,667.81 L1737.59,667.81 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,667.81 L259.71,667.81 '/> <g transform="translate(236.99,673.01)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >1</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,521.11 L1737.59,521.11 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,521.11 L259.71,521.11 '/> <g transform="translate(236.99,526.31)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >1.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,374.41 L1737.59,374.41 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,374.41 L259.71,374.41 '/> <g transform="translate(236.99,379.61)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >2</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,227.71 L1737.59,227.71 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,227.71 L259.71,227.71 '/> <g transform="translate(236.99,232.91)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >2.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,81.01 L1737.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L259.71,81.01 '/> <g transform="translate(236.99,86.21)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="end">
|
||||||
|
<text><tspan font-family="Helvetica" >3</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M249.59,961.21 L249.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,961.21 L249.59,951.09 '/> <g transform="translate(249.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >0</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M497.59,961.21 L497.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M497.59,961.21 L497.59,951.09 '/> <g transform="translate(497.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >0.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M745.59,961.21 L745.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M745.59,961.21 L745.59,951.09 '/> <g transform="translate(745.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >1</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M993.59,961.21 L993.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M993.59,961.21 L993.59,951.09 '/> <g transform="translate(993.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >1.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1241.59,961.21 L1241.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1241.59,961.21 L1241.59,951.09 '/> <g transform="translate(1241.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >2</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1489.59,961.21 L1489.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1489.59,961.21 L1489.59,951.09 '/> <g transform="translate(1489.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >2.5</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="rgb( 0, 0, 0)" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(204, 204, 255)' opacity='0.20' class="gridline" d='M1737.59,961.21 L1737.59,81.01 '/></g>
|
||||||
|
<g fill="none" color="black" stroke="rgb(204, 204, 255)" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1737.59,961.21 L1737.59,951.09 '/> <g transform="translate(1737.59,993.41)" stroke="none" fill="rgb(38,38,38)" font-family="Helvetica" font-size="16.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >3</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L249.59,961.21 L1737.59,961.21 L1737.59,81.01 L249.59,81.01 Z '/></g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(179.81,521.11) rotate(270)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >velocity [m/s]</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(993.59,1032.29)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" >time [s]</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1534.62,145.12 L1534.62,94.51 L1724.99,94.51 L1724.99,145.12 L1534.62,145.12 Z '/></g>
|
||||||
|
<g id="gnuplot_plot_1a" ><title>gnuplot_plot_1a</title>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 0, 0)" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(216, 51, 45)' d='M249.59,961.21 L252.07,961.17 L254.55,961.06 L257.03,960.88 L259.51,960.62 L261.99,960.29 L264.47,959.89 L266.95,959.41
|
||||||
|
L269.43,958.86 L271.91,958.24 L274.39,957.54 L276.87,956.77 L279.35,955.93 L281.83,955.01 L284.31,954.02 L286.79,952.96
|
||||||
|
L289.27,951.82 L291.75,950.61 L294.23,949.33 L296.71,947.97 L299.19,946.54 L301.67,945.04 L304.15,943.46 L306.63,941.81
|
||||||
|
L309.11,940.09 L311.59,938.29 L314.07,936.42 L316.55,934.47 L319.03,932.46 L321.51,930.37 L323.99,928.20 L326.47,925.97
|
||||||
|
L328.95,923.65 L331.43,921.27 L333.91,918.81 L336.39,916.28 L338.87,913.68 L341.35,911.00 L343.83,908.25 L346.31,905.43
|
||||||
|
L348.79,902.53 L351.27,899.56 L353.75,896.52 L356.23,893.40 L358.71,890.21 L361.19,886.94 L363.67,883.61 L366.15,880.19
|
||||||
|
L368.63,876.71 L371.11,873.15 L373.59,869.52 L376.07,865.82 L378.55,862.04 L381.03,858.19 L383.51,854.27 L385.99,850.27
|
||||||
|
L388.47,846.20 L390.95,842.05 L393.43,837.84 L395.91,833.54 L398.39,829.18 L400.87,824.74 L403.35,820.23 L405.83,815.65
|
||||||
|
L408.31,810.99 L410.79,806.26 L413.27,801.45 L415.75,796.58 L418.23,791.62 L420.71,786.60 L423.19,781.50 L425.67,776.33
|
||||||
|
L428.15,771.09 L430.63,765.77 L433.11,760.38 L435.59,754.91 L438.07,749.38 L440.55,743.76 L443.03,738.08 L445.51,732.32
|
||||||
|
L447.99,726.49 L450.47,720.59 L452.95,714.61 L455.43,708.56 L457.91,702.43 L460.39,696.23 L462.87,689.96 L465.35,683.62
|
||||||
|
L467.83,677.20 L470.31,670.71 L472.79,664.14 L475.27,657.50 L477.75,650.79 L480.23,644.01 L482.71,637.15 L485.19,630.22
|
||||||
|
L487.67,623.21 L490.15,616.13 L492.63,608.98 L495.11,601.76 L497.59,594.46 L500.07,587.12 L502.55,579.79 L505.03,572.45
|
||||||
|
L507.51,565.12 L509.99,557.78 L512.47,550.45 L514.95,543.11 L517.43,535.78 L519.91,528.44 L522.39,521.11 L524.87,513.77
|
||||||
|
L527.35,506.44 L529.83,499.10 L532.31,491.77 L534.79,484.43 L537.27,477.10 L539.75,469.76 L542.23,462.43 L544.71,455.09
|
||||||
|
L547.19,447.76 L549.67,440.46 L552.15,433.24 L554.63,426.09 L557.11,419.01 L559.59,412.00 L562.07,405.07 L564.55,398.21
|
||||||
|
L567.03,391.43 L569.51,384.72 L571.99,378.08 L574.47,371.51 L576.95,365.02 L579.43,358.60 L581.91,352.26 L584.39,345.99
|
||||||
|
L586.87,339.79 L589.35,333.66 L591.83,327.61 L594.31,321.63 L596.79,315.73 L599.27,309.90 L601.75,304.14 L604.23,298.46
|
||||||
|
L606.71,292.84 L609.19,287.31 L611.67,281.84 L614.15,276.45 L616.63,271.13 L619.11,265.89 L621.59,260.72 L624.07,255.62
|
||||||
|
L626.55,250.60 L629.03,245.64 L631.51,240.77 L633.99,235.96 L636.47,231.23 L638.95,226.57 L641.43,221.99 L643.91,217.48
|
||||||
|
L646.39,213.04 L648.87,208.68 L651.35,204.38 L653.83,200.17 L656.31,196.02 L658.79,191.95 L661.27,187.95 L663.75,184.03
|
||||||
|
L666.23,180.18 L668.71,176.40 L671.19,172.70 L673.67,169.07 L676.15,165.51 L678.63,162.03 L681.11,158.61 L683.59,155.28
|
||||||
|
L686.07,152.01 L688.55,148.82 L691.03,145.70 L693.51,142.66 L695.99,139.69 L698.47,136.79 L700.95,133.97 L703.43,131.22
|
||||||
|
L705.91,128.54 L708.39,125.94 L710.87,123.41 L713.35,120.95 L715.83,118.57 L718.31,116.25 L720.79,114.02 L723.27,111.85
|
||||||
|
L725.75,109.76 L728.23,107.75 L730.71,105.80 L733.19,103.93 L735.67,102.13 L738.15,100.41 L740.63,98.76 L743.11,97.18
|
||||||
|
L745.59,95.68 L748.07,94.25 L750.55,92.89 L753.03,91.61 L755.51,90.40 L757.99,89.26 L760.47,88.20 L762.95,87.21
|
||||||
|
L765.43,86.29 L767.91,85.45 L770.39,84.68 L772.87,83.98 L775.35,83.36 L777.83,82.81 L780.31,82.33 L782.79,81.93
|
||||||
|
L785.27,81.60 L787.75,81.34 L790.23,81.16 L792.71,81.05 L795.19,81.01 L797.67,81.01 L800.15,81.01 L802.63,81.01
|
||||||
|
L805.11,81.01 L807.59,81.01 L810.07,81.01 L812.55,81.01 L815.03,81.01 L817.51,81.01 L819.99,81.01 L822.47,81.01
|
||||||
|
L824.95,81.01 L827.43,81.01 L829.91,81.01 L832.39,81.01 L834.87,81.01 L837.35,81.01 L839.83,81.01 L842.31,81.01
|
||||||
|
L844.79,81.01 L847.27,81.01 L849.75,81.01 L852.23,81.01 L854.71,81.01 L857.19,81.01 L859.67,81.01 L862.15,81.01
|
||||||
|
L864.63,81.01 L867.11,81.01 L869.59,81.01 L872.07,81.01 L874.55,81.01 L877.03,81.01 L879.51,81.01 L881.99,81.01
|
||||||
|
L884.47,81.01 L886.95,81.01 L889.43,81.01 L891.91,81.01 L894.39,81.01 L896.87,81.01 L899.35,81.01 L901.83,81.01
|
||||||
|
L904.31,81.01 L906.79,81.01 L909.27,81.01 L911.75,81.01 L914.23,81.01 L916.71,81.01 L919.19,81.01 L921.67,81.01
|
||||||
|
L924.15,81.01 L926.63,81.01 L929.11,81.01 L931.59,81.01 L934.07,81.01 L936.55,81.01 L939.03,81.01 L941.51,81.01
|
||||||
|
L943.99,81.01 L946.47,81.01 L948.95,81.01 L951.43,81.01 L953.91,81.01 L956.39,81.01 L958.87,81.01 L961.35,81.01
|
||||||
|
L963.83,81.01 L966.31,81.01 L968.79,81.01 L971.27,81.01 L973.75,81.01 L976.23,81.01 L978.71,81.01 L981.19,81.01
|
||||||
|
L983.67,81.01 L986.15,81.01 L988.63,81.01 L991.11,81.01 L993.59,81.01 L996.07,81.01 L998.55,81.01 L1001.03,81.01
|
||||||
|
L1003.51,81.01 L1005.99,81.01 L1008.47,81.01 L1010.95,81.01 L1013.43,81.01 L1015.91,81.01 L1018.39,81.01 L1020.87,81.01
|
||||||
|
L1023.35,81.01 L1025.83,81.01 L1028.31,81.01 L1030.79,81.01 L1033.27,81.01 L1035.75,81.01 L1038.23,81.01 L1040.71,81.01
|
||||||
|
L1043.19,81.01 L1045.67,81.01 L1048.15,81.01 L1050.63,81.01 L1053.11,81.01 L1055.59,81.01 L1058.07,81.01 L1060.55,81.01
|
||||||
|
L1063.03,81.01 L1065.51,81.01 L1067.99,81.01 L1070.47,81.01 L1072.95,81.01 L1075.43,81.01 L1077.91,81.03 L1080.39,81.11
|
||||||
|
L1082.87,81.27 L1085.35,81.50 L1087.83,81.81 L1090.31,82.19 L1092.79,82.64 L1095.27,83.17 L1097.75,83.76 L1100.23,84.44
|
||||||
|
L1102.71,85.18 L1105.19,86.00 L1107.67,86.89 L1110.15,87.86 L1112.63,88.90 L1115.11,90.01 L1117.59,91.20 L1120.07,92.46
|
||||||
|
L1122.55,93.79 L1125.03,95.20 L1127.51,96.67 L1129.99,98.23 L1132.47,99.85 L1134.95,101.55 L1137.43,103.32 L1139.91,105.17
|
||||||
|
L1142.39,107.09 L1144.87,109.08 L1147.35,111.15 L1149.83,113.29 L1152.31,115.50 L1154.79,117.79 L1157.27,120.15 L1159.75,122.58
|
||||||
|
L1162.23,125.09 L1164.71,127.66 L1167.19,130.32 L1169.67,133.04 L1172.15,135.84 L1174.63,138.72 L1177.11,141.66 L1179.59,144.68
|
||||||
|
L1182.07,147.77 L1184.55,150.94 L1187.03,154.18 L1189.51,157.49 L1191.99,160.88 L1194.47,164.34 L1196.95,167.87 L1199.43,171.48
|
||||||
|
L1201.91,175.16 L1204.39,178.91 L1206.87,182.74 L1209.35,186.64 L1211.83,190.61 L1214.31,194.66 L1216.79,198.78 L1219.27,202.97
|
||||||
|
L1221.75,207.24 L1224.23,211.58 L1226.71,215.99 L1229.19,220.48 L1231.67,225.04 L1234.15,229.67 L1236.63,234.38 L1239.11,239.16
|
||||||
|
L1241.59,244.01 L1244.07,248.94 L1246.55,253.94 L1249.03,259.01 L1251.51,264.16 L1253.99,269.38 L1256.47,274.67 L1258.95,280.04
|
||||||
|
L1261.43,285.48 L1263.91,290.99 L1266.39,296.58 L1268.87,302.24 L1271.35,307.97 L1273.83,313.78 L1276.31,319.66 L1278.79,325.61
|
||||||
|
L1281.27,331.64 L1283.75,337.74 L1286.23,343.91 L1288.71,350.16 L1291.19,356.48 L1293.67,362.87 L1296.15,369.34 L1298.63,375.88
|
||||||
|
L1301.11,382.49 L1303.59,389.18 L1306.07,395.94 L1308.55,402.78 L1311.03,409.68 L1313.51,416.66 L1315.99,423.72 L1318.47,430.84
|
||||||
|
L1320.95,438.05 L1323.43,445.32 L1325.91,452.65 L1328.39,459.99 L1330.87,467.32 L1333.35,474.66 L1335.83,481.99 L1338.31,489.33
|
||||||
|
L1340.79,496.66 L1343.27,504.00 L1345.75,511.33 L1348.23,518.67 L1350.71,526.00 L1353.19,533.34 L1355.67,540.67 L1358.15,548.01
|
||||||
|
L1360.63,555.34 L1363.11,562.68 L1365.59,570.01 L1368.07,577.35 L1370.55,584.68 L1373.03,592.02 L1375.51,599.33 L1377.99,606.58
|
||||||
|
L1380.47,613.76 L1382.95,620.86 L1385.43,627.89 L1387.91,634.85 L1390.39,641.73 L1392.87,648.54 L1395.35,655.28 L1397.83,661.94
|
||||||
|
L1400.31,668.53 L1402.79,675.04 L1405.27,681.49 L1407.75,687.85 L1410.23,694.15 L1412.71,700.37 L1415.19,706.52 L1417.67,712.60
|
||||||
|
L1420.15,718.60 L1422.63,724.53 L1425.11,730.39 L1427.59,736.17 L1430.07,741.88 L1432.55,747.51 L1435.03,753.08 L1437.51,758.56
|
||||||
|
L1439.99,763.98 L1442.47,769.32 L1444.95,774.59 L1447.43,779.79 L1449.91,784.91 L1452.39,789.96 L1454.87,794.93 L1457.35,799.84
|
||||||
|
L1459.83,804.66 L1462.31,809.42 L1464.79,814.10 L1467.27,818.71 L1469.75,823.25 L1472.23,827.71 L1474.71,832.10 L1477.19,836.41
|
||||||
|
L1479.67,840.66 L1482.15,844.82 L1484.63,848.92 L1487.11,852.94 L1489.59,856.89 L1492.07,860.77 L1494.55,864.57 L1497.03,868.30
|
||||||
|
L1499.51,871.95 L1501.99,875.53 L1504.47,879.04 L1506.95,882.48 L1509.43,885.84 L1511.91,889.13 L1514.39,892.34 L1516.87,895.48
|
||||||
|
L1519.35,898.55 L1521.83,901.55 L1524.31,904.47 L1526.79,907.32 L1529.27,910.09 L1531.75,912.79 L1534.23,915.42 L1536.71,917.98
|
||||||
|
L1539.19,920.46 L1541.67,922.87 L1544.15,925.20 L1546.63,927.46 L1549.11,929.65 L1551.59,931.77 L1554.07,933.81 L1556.55,935.78
|
||||||
|
L1559.03,937.67 L1561.51,939.49 L1563.99,941.24 L1566.47,942.92 L1568.95,944.52 L1571.43,946.05 L1573.91,947.50 L1576.39,948.88
|
||||||
|
L1578.87,950.19 L1581.35,951.43 L1583.83,952.59 L1586.31,953.68 L1588.79,954.69 L1591.27,955.63 L1593.75,956.50 L1596.23,957.29
|
||||||
|
L1598.71,958.02 L1601.19,958.66 L1603.67,959.24 L1606.15,959.74 L1608.63,960.17 L1611.11,960.52 L1613.59,960.80 L1616.07,961.01
|
||||||
|
L1618.55,961.14 L1621.03,961.21 L1621.86,961.21 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_2a" ><title>gnuplot_plot_2a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 114, 178)' d='M249.59,961.21 L252.07,961.17 L254.55,961.06 L257.03,960.88 L259.51,960.62 L261.99,960.29 L264.47,959.89 L266.95,959.41
|
||||||
|
L269.43,958.86 L271.91,958.24 L274.39,957.54 L276.87,956.77 L279.35,955.93 L281.83,955.01 L284.31,954.02 L286.79,952.96
|
||||||
|
L289.27,951.82 L291.75,950.61 L294.23,949.33 L296.71,947.97 L299.19,946.54 L301.67,945.04 L304.15,943.46 L306.63,941.81
|
||||||
|
L309.11,940.09 L311.59,938.29 L314.07,936.42 L316.55,934.47 L319.03,932.46 L321.51,930.37 L323.99,928.20 L326.47,925.97
|
||||||
|
L328.95,923.65 L331.43,921.27 L333.91,918.81 L336.39,916.28 L338.87,913.68 L341.35,911.00 L343.83,908.25 L346.31,905.43
|
||||||
|
L348.79,902.53 L351.27,899.56 L353.75,896.52 L356.23,893.40 L358.71,890.21 L361.19,886.94 L363.67,883.61 L366.15,880.19
|
||||||
|
L368.63,876.71 L371.11,873.15 L373.59,869.52 L376.07,865.82 L378.55,862.04 L381.03,858.19 L383.51,854.27 L385.99,850.27
|
||||||
|
L388.47,846.20 L390.95,842.05 L393.43,837.84 L395.91,833.54 L398.39,829.18 L400.87,824.74 L403.35,820.23 L405.83,815.65
|
||||||
|
L408.31,810.99 L410.79,806.26 L413.27,801.45 L415.75,796.58 L418.23,791.62 L420.71,786.60 L423.19,781.50 L425.67,776.33
|
||||||
|
L428.15,771.09 L430.63,765.77 L433.11,760.38 L435.59,754.91 L438.07,749.38 L440.55,743.76 L443.03,738.08 L445.51,732.32
|
||||||
|
L447.99,726.49 L450.47,720.59 L452.95,714.61 L455.43,708.56 L457.91,702.43 L460.39,696.23 L462.87,689.96 L465.35,683.62
|
||||||
|
L467.83,677.20 L470.31,670.71 L472.79,664.14 L475.27,657.50 L477.75,650.79 L480.23,644.01 L482.71,637.15 L485.19,630.22
|
||||||
|
L487.67,623.21 L490.15,616.13 L492.63,608.98 L495.11,601.76 L497.59,594.46 L500.07,587.12 L502.55,579.79 L505.03,572.45
|
||||||
|
L507.51,565.12 L509.99,557.78 L512.47,550.45 L514.95,543.11 L517.43,535.78 L519.91,528.44 L522.39,521.11 L524.87,513.77
|
||||||
|
L527.35,506.44 L529.83,499.10 L532.31,491.77 L534.79,484.43 L537.27,477.10 L539.75,469.76 L542.23,462.43 L544.71,455.09
|
||||||
|
L547.19,447.76 L549.67,440.46 L552.15,433.24 L554.63,426.09 L557.11,419.01 L559.59,412.00 L562.07,405.07 L564.55,398.21
|
||||||
|
L567.03,391.43 L569.51,384.72 L571.99,378.08 L574.47,371.51 L576.95,365.02 L579.43,358.60 L581.91,352.26 L584.39,345.99
|
||||||
|
L586.87,339.79 L589.35,333.66 L591.83,327.61 L594.31,321.63 L596.79,315.73 L599.27,309.90 L601.75,304.14 L604.23,298.46
|
||||||
|
L606.71,292.84 L609.19,287.31 L611.67,281.84 L614.15,276.45 L616.63,271.13 L619.11,265.89 L621.59,260.72 L624.07,255.62
|
||||||
|
L626.55,250.60 L629.03,245.64 L631.51,240.77 L633.99,235.96 L636.47,231.23 L638.95,226.57 L641.43,221.99 L643.91,217.48
|
||||||
|
L646.39,213.04 L648.87,208.68 L651.35,204.38 L653.83,200.17 L656.31,196.02 L658.79,191.95 L661.27,187.95 L663.75,184.03
|
||||||
|
L666.23,180.18 L668.71,176.40 L671.19,172.70 L673.67,169.07 L676.15,165.51 L678.63,162.03 L681.11,158.61 L683.59,155.28
|
||||||
|
L686.07,152.01 L688.55,148.82 L691.03,145.70 L693.51,142.66 L695.99,139.69 L698.47,136.79 L700.95,133.97 L703.43,131.22
|
||||||
|
L705.91,128.54 L708.39,125.94 L710.87,123.41 L713.35,120.95 L715.83,118.57 L718.31,116.25 L720.79,114.02 L723.27,111.85
|
||||||
|
L725.75,109.76 L728.23,107.75 L730.71,105.80 L733.19,103.93 L735.67,102.13 L738.15,100.41 L740.63,98.76 L743.11,97.18
|
||||||
|
L745.59,95.68 L748.07,94.25 L750.55,92.89 L753.03,91.61 L755.51,90.40 L757.99,89.26 L760.47,88.20 L762.95,87.21
|
||||||
|
L765.43,86.29 L767.91,85.45 L770.39,84.68 L772.87,83.98 L775.35,83.36 L777.83,82.81 L780.31,82.33 L782.79,81.93
|
||||||
|
L785.27,81.60 L787.75,81.34 L790.23,81.16 L792.71,81.05 L795.19,81.01 L797.67,81.01 L800.15,81.01 L802.63,81.01
|
||||||
|
L805.11,81.01 L807.59,81.01 L810.07,81.01 L812.55,81.01 L815.03,81.01 L817.51,81.01 L819.99,81.01 L822.47,81.01
|
||||||
|
L824.95,81.01 L827.43,81.01 L829.91,81.01 L832.39,81.01 L834.87,81.01 L837.35,81.01 L839.83,81.01 L842.31,81.01
|
||||||
|
L844.79,81.01 L847.27,81.01 L849.75,81.01 L852.23,81.01 L854.71,81.01 L857.19,81.01 L859.67,81.01 L862.15,81.01
|
||||||
|
L864.63,81.01 L867.11,81.01 L869.59,81.01 L872.07,81.01 L874.55,81.01 L877.03,81.01 L879.51,81.01 L881.99,81.01
|
||||||
|
L884.47,81.01 L886.95,81.01 L889.43,81.01 L891.91,81.01 L894.39,81.01 L896.87,81.01 L899.35,81.01 L901.83,81.01
|
||||||
|
L904.31,81.01 L906.79,81.01 L909.27,81.01 L911.75,81.01 L914.23,81.01 L916.71,81.01 L919.19,81.01 L921.67,81.01
|
||||||
|
L924.15,81.01 L926.63,81.01 L929.11,81.01 L931.59,81.01 L934.07,81.01 L936.55,81.01 L939.03,81.01 L941.51,81.01
|
||||||
|
L943.99,81.01 L946.47,81.01 L948.95,81.01 L951.43,81.01 L953.91,81.01 L956.39,81.01 L958.87,81.01 L961.35,81.01
|
||||||
|
L963.83,81.01 L966.31,81.01 L968.79,81.01 L971.27,81.01 L973.75,81.01 L976.23,81.01 L978.71,81.01 L981.19,81.01
|
||||||
|
L983.67,81.01 L986.15,81.01 L988.63,81.01 L991.11,81.01 L993.59,81.01 L996.07,81.01 L998.55,81.01 L1001.03,81.01
|
||||||
|
L1003.51,81.01 L1005.99,81.01 L1008.47,81.01 L1010.95,81.01 L1013.43,81.01 L1015.91,81.01 L1018.39,81.01 L1020.87,81.01
|
||||||
|
L1023.35,81.01 L1025.83,81.01 L1028.31,81.01 L1030.79,81.01 L1033.27,81.01 L1035.75,81.01 L1038.23,81.01 L1040.71,81.01
|
||||||
|
L1043.19,81.01 L1045.67,81.01 L1048.15,81.01 L1050.63,81.01 L1053.11,81.01 L1055.59,81.01 L1058.07,81.01 L1060.55,81.01
|
||||||
|
L1063.03,81.01 L1065.51,81.01 L1067.99,81.01 L1070.47,81.03 L1072.95,81.12 L1075.43,81.28 L1077.91,81.52 L1080.39,81.83
|
||||||
|
L1082.87,82.22 L1085.35,82.67 L1087.83,83.20 L1090.31,83.81 L1092.79,84.48 L1095.27,85.24 L1097.75,86.06 L1100.23,86.96
|
||||||
|
L1102.71,87.93 L1105.19,88.97 L1107.67,90.09 L1110.15,91.28 L1112.63,92.54 L1115.11,93.88 L1117.59,95.29 L1120.07,96.78
|
||||||
|
L1122.55,98.33 L1125.03,99.96 L1127.51,101.67 L1129.99,103.45 L1132.47,105.30 L1134.95,107.22 L1137.43,109.22 L1139.91,111.29
|
||||||
|
L1142.39,113.43 L1144.87,115.65 L1147.35,117.94 L1149.83,120.31 L1152.31,122.74 L1154.79,125.25 L1157.27,127.84 L1159.75,130.50
|
||||||
|
L1162.23,133.23 L1164.71,136.03 L1167.19,138.91 L1169.67,141.86 L1172.15,144.89 L1174.63,147.98 L1177.11,151.15 L1179.59,154.40
|
||||||
|
L1182.07,157.72 L1184.55,161.11 L1187.03,164.57 L1189.51,168.11 L1191.99,171.72 L1194.47,175.41 L1196.95,179.16 L1199.43,183.00
|
||||||
|
L1201.91,186.90 L1204.39,190.88 L1206.87,194.93 L1209.35,199.05 L1211.83,203.25 L1214.31,207.52 L1216.79,211.87 L1219.27,216.29
|
||||||
|
L1221.75,220.78 L1224.23,225.34 L1226.71,229.98 L1229.19,234.69 L1231.67,239.48 L1234.15,244.34 L1236.63,249.27 L1239.11,254.27
|
||||||
|
L1241.59,259.35 L1244.07,264.50 L1246.55,269.73 L1249.03,275.03 L1251.51,280.40 L1253.99,285.84 L1256.47,291.36 L1258.95,296.95
|
||||||
|
L1261.43,302.62 L1263.91,308.36 L1266.39,314.17 L1268.87,320.05 L1271.35,326.01 L1273.83,332.04 L1276.31,338.15 L1278.79,344.33
|
||||||
|
L1281.27,350.58 L1283.75,356.90 L1286.23,363.30 L1288.71,369.77 L1291.19,376.32 L1293.67,382.94 L1296.15,389.63 L1298.63,396.40
|
||||||
|
L1301.11,403.23 L1303.59,410.15 L1306.07,417.13 L1308.55,424.19 L1311.03,431.32 L1313.51,438.53 L1315.99,445.81 L1318.47,453.14
|
||||||
|
L1320.95,460.47 L1323.43,467.81 L1325.91,475.14 L1328.39,482.48 L1330.87,489.81 L1333.35,497.15 L1335.83,504.48 L1338.31,511.82
|
||||||
|
L1340.79,519.15 L1343.27,526.49 L1345.75,533.82 L1348.23,541.14 L1350.71,548.38 L1353.19,555.55 L1355.67,562.65 L1358.15,569.68
|
||||||
|
L1360.63,576.63 L1363.11,583.51 L1365.59,590.31 L1368.07,597.04 L1370.55,603.70 L1373.03,610.28 L1375.51,616.79 L1377.99,623.23
|
||||||
|
L1380.47,629.60 L1382.95,635.89 L1385.43,642.11 L1387.91,648.25 L1390.39,654.32 L1392.87,660.32 L1395.35,666.24 L1397.83,672.09
|
||||||
|
L1400.31,677.87 L1402.79,683.58 L1405.27,689.21 L1407.75,694.76 L1410.23,700.25 L1412.71,705.66 L1415.19,711.00 L1417.67,716.26
|
||||||
|
L1420.15,721.45 L1422.63,726.57 L1425.11,731.61 L1427.59,736.58 L1430.07,741.48 L1432.55,746.30 L1435.03,751.05 L1437.51,755.73
|
||||||
|
L1439.99,760.34 L1442.47,764.87 L1444.95,769.32 L1447.43,773.71 L1449.91,778.02 L1452.39,782.26 L1454.87,786.42 L1457.35,790.51
|
||||||
|
L1459.83,794.53 L1462.31,798.47 L1464.79,802.34 L1467.27,806.14 L1469.75,809.86 L1472.23,813.51 L1474.71,817.09 L1477.19,820.59
|
||||||
|
L1479.67,824.02 L1482.15,827.38 L1484.63,830.66 L1487.11,833.87 L1489.59,837.01 L1492.07,840.07 L1494.55,843.06 L1497.03,845.98
|
||||||
|
L1499.51,848.83 L1501.99,851.60 L1504.47,854.29 L1506.95,856.92 L1509.43,859.47 L1511.91,861.94 L1514.39,864.35 L1516.87,866.68
|
||||||
|
L1519.35,868.93 L1521.83,871.12 L1524.31,873.23 L1526.79,875.26 L1529.27,877.23 L1531.75,879.12 L1534.23,880.93 L1536.71,882.68
|
||||||
|
L1539.19,884.35 L1541.67,885.94 L1544.15,887.47 L1546.63,888.92 L1549.11,890.29 L1551.59,891.60 L1554.07,892.83 L1556.55,893.98
|
||||||
|
L1559.03,895.07 L1561.51,896.08 L1563.99,897.01 L1566.47,897.87 L1568.95,898.66 L1571.43,899.38 L1573.91,900.02 L1576.39,900.59
|
||||||
|
L1578.87,901.09 L1581.35,901.51 L1583.83,901.86 L1586.31,902.14 L1588.79,902.34 L1591.27,902.47 L1593.75,902.53 L1594.41,902.53
|
||||||
|
'/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_3a" ><title>gnuplot_plot_3a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 158, 96)' d='M249.59,902.53 L252.07,902.49 L254.55,902.38 L257.03,902.20 L259.51,901.94 L261.99,901.61 L264.47,901.21 L266.95,900.73
|
||||||
|
L269.43,900.18 L271.91,899.56 L274.39,898.86 L276.87,898.09 L279.35,897.25 L281.83,896.33 L284.31,895.34 L286.79,894.28
|
||||||
|
L289.27,893.14 L291.75,891.93 L294.23,890.65 L296.71,889.29 L299.19,887.86 L301.67,886.36 L304.15,884.78 L306.63,883.13
|
||||||
|
L309.11,881.41 L311.59,879.61 L314.07,877.74 L316.55,875.79 L319.03,873.78 L321.51,871.69 L323.99,869.52 L326.47,867.29
|
||||||
|
L328.95,864.97 L331.43,862.59 L333.91,860.13 L336.39,857.60 L338.87,855.00 L341.35,852.32 L343.83,849.57 L346.31,846.75
|
||||||
|
L348.79,843.85 L351.27,840.88 L353.75,837.84 L356.23,834.72 L358.71,831.53 L361.19,828.26 L363.67,824.93 L366.15,821.51
|
||||||
|
L368.63,818.03 L371.11,814.47 L373.59,810.84 L376.07,807.14 L378.55,803.36 L381.03,799.51 L383.51,795.59 L385.99,791.59
|
||||||
|
L388.47,787.52 L390.95,783.37 L393.43,779.16 L395.91,774.86 L398.39,770.50 L400.87,766.06 L403.35,761.55 L405.83,756.97
|
||||||
|
L408.31,752.31 L410.79,747.58 L413.27,742.77 L415.75,737.90 L418.23,732.94 L420.71,727.92 L423.19,722.82 L425.67,717.65
|
||||||
|
L428.15,712.41 L430.63,707.09 L433.11,701.70 L435.59,696.23 L438.07,690.70 L440.55,685.08 L443.03,679.40 L445.51,673.64
|
||||||
|
L447.99,667.81 L450.47,661.91 L452.95,655.93 L455.43,649.88 L457.91,643.75 L460.39,637.55 L462.87,631.28 L465.35,624.94
|
||||||
|
L467.83,618.52 L470.31,612.03 L472.79,605.46 L475.27,598.82 L477.75,592.11 L480.23,585.33 L482.71,578.47 L485.19,571.54
|
||||||
|
L487.67,564.53 L490.15,557.45 L492.63,550.30 L495.11,543.08 L497.59,535.78 L500.07,528.44 L502.55,521.11 L505.03,513.77
|
||||||
|
L507.51,506.44 L509.99,499.10 L512.47,491.77 L514.95,484.43 L517.43,477.10 L519.91,469.76 L522.39,462.43 L524.87,455.09
|
||||||
|
L527.35,447.76 L529.83,440.46 L532.31,433.24 L534.79,426.09 L537.27,419.01 L539.75,412.00 L542.23,405.07 L544.71,398.21
|
||||||
|
L547.19,391.43 L549.67,384.72 L552.15,378.08 L554.63,371.51 L557.11,365.02 L559.59,358.60 L562.07,352.26 L564.55,345.99
|
||||||
|
L567.03,339.79 L569.51,333.66 L571.99,327.61 L574.47,321.63 L576.95,315.73 L579.43,309.90 L581.91,304.14 L584.39,298.46
|
||||||
|
L586.87,292.84 L589.35,287.31 L591.83,281.84 L594.31,276.45 L596.79,271.13 L599.27,265.89 L601.75,260.72 L604.23,255.62
|
||||||
|
L606.71,250.60 L609.19,245.64 L611.67,240.77 L614.15,235.96 L616.63,231.23 L619.11,226.57 L621.59,221.99 L624.07,217.48
|
||||||
|
L626.55,213.04 L629.03,208.68 L631.51,204.38 L633.99,200.17 L636.47,196.02 L638.95,191.95 L641.43,187.95 L643.91,184.03
|
||||||
|
L646.39,180.18 L648.87,176.40 L651.35,172.70 L653.83,169.07 L656.31,165.51 L658.79,162.03 L661.27,158.61 L663.75,155.28
|
||||||
|
L666.23,152.01 L668.71,148.82 L671.19,145.70 L673.67,142.66 L676.15,139.69 L678.63,136.79 L681.11,133.97 L683.59,131.22
|
||||||
|
L686.07,128.54 L688.55,125.94 L691.03,123.41 L693.51,120.95 L695.99,118.57 L698.47,116.25 L700.95,114.02 L703.43,111.85
|
||||||
|
L705.91,109.76 L708.39,107.75 L710.87,105.80 L713.35,103.93 L715.83,102.13 L718.31,100.41 L720.79,98.76 L723.27,97.18
|
||||||
|
L725.75,95.68 L728.23,94.25 L730.71,92.89 L733.19,91.61 L735.67,90.40 L738.15,89.26 L740.63,88.20 L743.11,87.21
|
||||||
|
L745.59,86.29 L748.07,85.45 L750.55,84.68 L753.03,83.98 L755.51,83.36 L757.99,82.81 L760.47,82.33 L762.95,81.93
|
||||||
|
L765.43,81.60 L767.91,81.34 L770.39,81.16 L772.87,81.05 L775.35,81.01 L777.83,81.01 L780.31,81.01 L782.79,81.01
|
||||||
|
L785.27,81.01 L787.75,81.01 L790.23,81.01 L792.71,81.01 L795.19,81.01 L797.67,81.01 L800.15,81.01 L802.63,81.01
|
||||||
|
L805.11,81.01 L807.59,81.01 L810.07,81.01 L812.55,81.01 L815.03,81.01 L817.51,81.01 L819.99,81.01 L822.47,81.01
|
||||||
|
L824.95,81.01 L827.43,81.01 L829.91,81.01 L832.39,81.01 L834.87,81.01 L837.35,81.01 L839.83,81.01 L842.31,81.01
|
||||||
|
L844.79,81.01 L847.27,81.01 L849.75,81.01 L852.23,81.01 L854.71,81.01 L857.19,81.01 L859.67,81.01 L862.15,81.01
|
||||||
|
L864.63,81.01 L867.11,81.01 L869.59,81.01 L872.07,81.01 L874.55,81.01 L877.03,81.01 L879.51,81.01 L881.99,81.01
|
||||||
|
L884.47,81.01 L886.95,81.01 L889.43,81.01 L891.91,81.01 L894.39,81.01 L896.87,81.01 L899.35,81.01 L901.83,81.01
|
||||||
|
L904.31,81.01 L906.79,81.01 L909.27,81.01 L911.75,81.01 L914.23,81.01 L916.71,81.01 L919.19,81.01 L921.67,81.01
|
||||||
|
L924.15,81.01 L926.63,81.01 L929.11,81.01 L931.59,81.01 L934.07,81.01 L936.55,81.01 L939.03,81.01 L941.51,81.01
|
||||||
|
L943.99,81.01 L946.47,81.01 L948.95,81.01 L951.43,81.01 L953.91,81.01 L956.39,81.01 L958.87,81.01 L961.35,81.01
|
||||||
|
L963.83,81.01 L966.31,81.01 L968.79,81.01 L971.27,81.01 L973.75,81.01 L976.23,81.01 L978.71,81.01 L981.19,81.01
|
||||||
|
L983.67,81.01 L986.15,81.01 L988.63,81.01 L991.11,81.01 L993.59,81.01 L996.07,81.01 L998.55,81.01 L1001.03,81.01
|
||||||
|
L1003.51,81.01 L1005.99,81.01 L1008.47,81.01 L1010.95,81.01 L1013.43,81.01 L1015.91,81.01 L1018.39,81.01 L1020.87,81.01
|
||||||
|
L1023.35,81.01 L1025.83,81.01 L1028.31,81.01 L1030.79,81.01 L1033.27,81.01 L1035.75,81.01 L1038.23,81.01 L1040.71,81.01
|
||||||
|
L1043.19,81.01 L1045.67,81.01 L1048.15,81.01 L1050.63,81.03 L1053.11,81.12 L1055.59,81.28 L1058.07,81.52 L1060.55,81.83
|
||||||
|
L1063.03,82.22 L1065.51,82.67 L1067.99,83.20 L1070.47,83.81 L1072.95,84.48 L1075.43,85.24 L1077.91,86.06 L1080.39,86.96
|
||||||
|
L1082.87,87.93 L1085.35,88.97 L1087.83,90.09 L1090.31,91.28 L1092.79,92.54 L1095.27,93.88 L1097.75,95.29 L1100.23,96.78
|
||||||
|
L1102.71,98.33 L1105.19,99.96 L1107.67,101.67 L1110.15,103.45 L1112.63,105.30 L1115.11,107.22 L1117.59,109.22 L1120.07,111.29
|
||||||
|
L1122.55,113.43 L1125.03,115.65 L1127.51,117.94 L1129.99,120.31 L1132.47,122.74 L1134.95,125.25 L1137.43,127.84 L1139.91,130.50
|
||||||
|
L1142.39,133.23 L1144.87,136.03 L1147.35,138.91 L1149.83,141.86 L1152.31,144.89 L1154.79,147.98 L1157.27,151.15 L1159.75,154.40
|
||||||
|
L1162.23,157.72 L1164.71,161.11 L1167.19,164.57 L1169.67,168.11 L1172.15,171.72 L1174.63,175.41 L1177.11,179.16 L1179.59,183.00
|
||||||
|
L1182.07,186.90 L1184.55,190.88 L1187.03,194.93 L1189.51,199.05 L1191.99,203.25 L1194.47,207.52 L1196.95,211.87 L1199.43,216.29
|
||||||
|
L1201.91,220.78 L1204.39,225.34 L1206.87,229.98 L1209.35,234.69 L1211.83,239.48 L1214.31,244.34 L1216.79,249.27 L1219.27,254.27
|
||||||
|
L1221.75,259.35 L1224.23,264.50 L1226.71,269.73 L1229.19,275.03 L1231.67,280.40 L1234.15,285.84 L1236.63,291.36 L1239.11,296.95
|
||||||
|
L1241.59,302.62 L1244.07,308.36 L1246.55,314.17 L1249.03,320.05 L1251.51,326.01 L1253.99,332.04 L1256.47,338.15 L1258.95,344.33
|
||||||
|
L1261.43,350.58 L1263.91,356.90 L1266.39,363.30 L1268.87,369.77 L1271.35,376.32 L1273.83,382.94 L1276.31,389.63 L1278.79,396.40
|
||||||
|
L1281.27,403.23 L1283.75,410.15 L1286.23,417.13 L1288.71,424.19 L1291.19,431.32 L1293.67,438.53 L1296.15,445.81 L1298.63,453.14
|
||||||
|
L1301.11,460.47 L1303.59,467.81 L1306.07,475.14 L1308.55,482.48 L1311.03,489.81 L1313.51,497.15 L1315.99,504.48 L1318.47,511.82
|
||||||
|
L1320.95,519.15 L1323.43,526.49 L1325.91,533.82 L1328.39,541.16 L1330.87,548.49 L1333.35,555.83 L1335.83,563.16 L1338.31,570.50
|
||||||
|
L1340.79,577.83 L1343.27,585.17 L1345.75,592.50 L1348.23,599.82 L1350.71,607.06 L1353.19,614.23 L1355.67,621.33 L1358.15,628.36
|
||||||
|
L1360.63,635.31 L1363.11,642.19 L1365.59,648.99 L1368.07,655.72 L1370.55,662.38 L1373.03,668.96 L1375.51,675.47 L1377.99,681.91
|
||||||
|
L1380.47,688.28 L1382.95,694.57 L1385.43,700.79 L1387.91,706.93 L1390.39,713.00 L1392.87,719.00 L1395.35,724.92 L1397.83,730.77
|
||||||
|
L1400.31,736.55 L1402.79,742.26 L1405.27,747.89 L1407.75,753.44 L1410.23,758.93 L1412.71,764.34 L1415.19,769.68 L1417.67,774.94
|
||||||
|
L1420.15,780.13 L1422.63,785.25 L1425.11,790.29 L1427.59,795.26 L1430.07,800.16 L1432.55,804.98 L1435.03,809.73 L1437.51,814.41
|
||||||
|
L1439.99,819.02 L1442.47,823.55 L1444.95,828.00 L1447.43,832.39 L1449.91,836.70 L1452.39,840.94 L1454.87,845.10 L1457.35,849.19
|
||||||
|
L1459.83,853.21 L1462.31,857.15 L1464.79,861.02 L1467.27,864.82 L1469.75,868.54 L1472.23,872.19 L1474.71,875.77 L1477.19,879.27
|
||||||
|
L1479.67,882.70 L1482.15,886.06 L1484.63,889.34 L1487.11,892.55 L1489.59,895.69 L1492.07,898.75 L1494.55,901.74 L1497.03,904.66
|
||||||
|
L1499.51,907.51 L1501.99,910.28 L1504.47,912.97 L1506.95,915.60 L1509.43,918.15 L1511.91,920.62 L1514.39,923.03 L1516.87,925.36
|
||||||
|
L1519.35,927.61 L1521.83,929.80 L1524.31,931.91 L1526.79,933.94 L1529.27,935.91 L1531.75,937.80 L1534.23,939.61 L1536.71,941.36
|
||||||
|
L1539.19,943.03 L1541.67,944.62 L1544.15,946.15 L1546.63,947.60 L1549.11,948.97 L1551.59,950.28 L1554.07,951.51 L1556.55,952.66
|
||||||
|
L1559.03,953.75 L1561.51,954.76 L1563.99,955.69 L1566.47,956.55 L1568.95,957.34 L1571.43,958.06 L1573.91,958.70 L1576.39,959.27
|
||||||
|
L1578.87,959.77 L1581.35,960.19 L1583.83,960.54 L1586.31,960.82 L1588.79,961.02 L1591.27,961.15 L1593.75,961.21 L1594.41,961.21
|
||||||
|
'/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_4a" ><title>ZeroToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_5a" ><title>ZeroToPositiveVf</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_6a" ><title>PositiveV0ToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g stroke='none' shape-rendering='crispEdges'>
|
||||||
|
<polygon fill = 'white' points = '1534.62,145.12 1724.99,145.12 1724.99,94.51 1534.62,94.51 '/>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="white" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M1534.62,145.12 L1534.62,94.51 L1724.99,94.51 L1724.99,145.12 L1534.62,145.12 Z '/></g>
|
||||||
|
<g id="gnuplot_plot_1a" ><title>gnuplot_plot_1a</title>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 0, 0)" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_2a" ><title>gnuplot_plot_2a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_3a" ><title>gnuplot_plot_3a</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_4a" ><title>ZeroToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,106.53)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >ZeroToRest</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb(216, 51, 45)' d='M1542.31,102.95 L1586.57,102.95 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_5a" ><title>ZeroToPositiveVf</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,123.40)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >ZeroToPositiveVf</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 114, 178)' d='M1542.31,119.82 L1586.57,119.82 '/></g>
|
||||||
|
</g>
|
||||||
|
<g id="gnuplot_plot_6a" ><title>PositiveV0ToRest</title>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(1594.26,140.27)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="11.00" text-anchor="start">
|
||||||
|
<text><tspan font-family="Helvetica" >PositiveV0ToRest</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="3.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 158, 96)' d='M1542.31,136.69 L1586.57,136.69 '/></g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="white" stroke="rgb( 0, 158, 96)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="black" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<path stroke='rgb( 0, 0, 0)' d='M249.59,81.01 L249.59,961.21 L1737.59,961.21 L1737.59,81.01 L249.59,81.01 Z '/></g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
<g transform="translate(993.59,47.54)" stroke="none" fill="rgb(0,0,0)" font-family="Helvetica" font-size="17.00" text-anchor="middle">
|
||||||
|
<text><tspan font-family="Helvetica" font-weight="bold" >SCurve Velocity</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g fill="none" color="black" stroke="currentColor" stroke-width="1.50" stroke-linecap="butt" stroke-linejoin="miter">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 48 KiB |
123
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/bars.h
vendored
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_BARS_H
|
||||||
|
#define MATPLOTPLUSPLUS_BARS_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <cmath>
|
||||||
|
#include <map>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/common.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
class MATPLOT_EXPORTS bars : public axes_object {
|
||||||
|
public:
|
||||||
|
explicit bars(class axes_type *parent);
|
||||||
|
bars(class axes_type *parent, const std::vector<double> &y);
|
||||||
|
bars(class axes_type *parent,
|
||||||
|
const std::vector<std::vector<double>> &Y);
|
||||||
|
bars(class axes_type *parent, const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y);
|
||||||
|
bars(class axes_type *parent, const std::vector<double> &x,
|
||||||
|
const std::vector<std::vector<double>> &Y);
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
bars(const axes_handle &parent, Args &&... args)
|
||||||
|
: bars(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~bars() = default;
|
||||||
|
|
||||||
|
public /* xlim object virtual functions */:
|
||||||
|
// std::string set_variables_string() override;
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string legend_string(std::string_view title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
// std::string unset_variables_string() override;
|
||||||
|
bool requires_colormap() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* useful functions for bars */:
|
||||||
|
double x_minimum_difference();
|
||||||
|
double x_end_point(size_t cluster_index, size_t index);
|
||||||
|
double cluster_width();
|
||||||
|
double range_for_cluster();
|
||||||
|
|
||||||
|
public /* getters and setters */:
|
||||||
|
const color_array &face_color() const;
|
||||||
|
class bars &face_color(const color_array &face_color);
|
||||||
|
class bars &face_color(const std::array<float, 3> &face_color);
|
||||||
|
class bars &face_color(std::initializer_list<float> face_color);
|
||||||
|
class bars &face_color(std::string_view color);
|
||||||
|
|
||||||
|
const std::vector<color_array> &face_colors() const;
|
||||||
|
std::vector<color_array> &face_colors();
|
||||||
|
|
||||||
|
class bars &face_colors(const std::vector<color_array> &face_colors);
|
||||||
|
|
||||||
|
bool manual_face_color() const;
|
||||||
|
class bars &manual_face_color(bool manual_face_color);
|
||||||
|
|
||||||
|
const color_array &edge_color() const;
|
||||||
|
class bars &edge_color(const color_array &edge_color);
|
||||||
|
class bars &edge_color(const std::array<float, 3> &edge_color);
|
||||||
|
class bars &edge_color(std::initializer_list<float> face_color);
|
||||||
|
class bars &edge_color(std::string_view edge_color);
|
||||||
|
|
||||||
|
const line_spec &edge_style() const;
|
||||||
|
class bars &edge_style(const line_spec &edge_style);
|
||||||
|
|
||||||
|
float line_width() const;
|
||||||
|
class bars &line_width(float line_width);
|
||||||
|
|
||||||
|
bool vertical_orientation() const;
|
||||||
|
class bars &vertical_orientation(bool vertical_orientation);
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
class bars &visible(bool visible);
|
||||||
|
|
||||||
|
float bar_width() const;
|
||||||
|
class bars &bar_width(float bar_width);
|
||||||
|
|
||||||
|
public /* getters and setters bypassing the bars_spec */:
|
||||||
|
private:
|
||||||
|
/// If the user has not set the face color,
|
||||||
|
/// we get a color from the xlim
|
||||||
|
void maybe_update_face_colors();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// original data
|
||||||
|
std::vector<double> x_;
|
||||||
|
std::vector<std::vector<double>> ys_;
|
||||||
|
|
||||||
|
// color and style
|
||||||
|
std::vector<color_array> face_colors_{{0.4f, 0, 0, 0}};
|
||||||
|
bool manual_face_color_{false};
|
||||||
|
color_array edge_color_{0, 0, 0, 0};
|
||||||
|
line_spec edge_style_{"-"};
|
||||||
|
float line_width_{0.5};
|
||||||
|
bool vertical_orientation_{true};
|
||||||
|
float bar_width_{0.8f};
|
||||||
|
float cluster_width_{0.8f};
|
||||||
|
|
||||||
|
// True if visible
|
||||||
|
bool visible_{true};
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_BARS_H
|
||||||
147
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/box_chart.h
vendored
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_BOX_CHART_H
|
||||||
|
#define MATPLOTPLUSPLUS_BOX_CHART_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <cmath>
|
||||||
|
#include <map>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/common.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
class MATPLOT_EXPORTS box_chart : public axes_object {
|
||||||
|
public:
|
||||||
|
enum class box_style_option {
|
||||||
|
outline, // unfilled / dashed whiskers
|
||||||
|
filled, // filled / solid whiskers
|
||||||
|
violin, // show data distribution
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit box_chart(class axes_type *parent);
|
||||||
|
box_chart(class axes_type *parent, const std::vector<double> &y_data,
|
||||||
|
const std::vector<double> &groups = {});
|
||||||
|
// box_chart(class xlim* parent, const std::vector<double>& data,
|
||||||
|
// const std::vector<double>& edges, enum
|
||||||
|
// box_chart::normalization normalization_alg =
|
||||||
|
// box_chart::normalization::count); box_chart(class xlim*
|
||||||
|
// parent, const std::vector<double>& data, binning_algorithm
|
||||||
|
// algorithm = binning_algorithm::automatic,
|
||||||
|
// box_chart::normalization normalization_alg =
|
||||||
|
// box_chart::normalization::count);
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
box_chart(const axes_handle &parent, Args&&... args)
|
||||||
|
: box_chart(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~box_chart() = default;
|
||||||
|
public /* xlim object virtual functions */:
|
||||||
|
std::string set_variables_string() override;
|
||||||
|
std::string plot_string() override;
|
||||||
|
// std::string legend_string(const std::string& title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
std::string unset_variables_string() override;
|
||||||
|
bool requires_colormap() override;
|
||||||
|
// double xmax() override;
|
||||||
|
// double xmin() override;
|
||||||
|
// double ymax() override;
|
||||||
|
// double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* useful functions for box_charts */:
|
||||||
|
public /* getters and setters */:
|
||||||
|
const std::vector<double> &y_data() const;
|
||||||
|
|
||||||
|
class box_chart &y_data(const std::vector<double> &y_data);
|
||||||
|
|
||||||
|
const std::vector<double> &x_data() const;
|
||||||
|
|
||||||
|
class box_chart &x_data(const std::vector<double> &x_data);
|
||||||
|
|
||||||
|
const color_array &face_color() const;
|
||||||
|
|
||||||
|
class box_chart &face_color(const color_array &face_color);
|
||||||
|
|
||||||
|
bool manual_face_color() const;
|
||||||
|
|
||||||
|
class box_chart &manual_face_color(bool manual_face_color);
|
||||||
|
|
||||||
|
const color_array &edge_color() const;
|
||||||
|
|
||||||
|
class box_chart &edge_color(const color_array &edge_color);
|
||||||
|
|
||||||
|
float edge_width() const;
|
||||||
|
|
||||||
|
class box_chart &edge_width(float edge_width);
|
||||||
|
|
||||||
|
enum line_spec::marker_style whisker_style() const;
|
||||||
|
|
||||||
|
class box_chart &
|
||||||
|
whisker_style(enum line_spec::marker_style whisker_style);
|
||||||
|
|
||||||
|
float whisker_size() const;
|
||||||
|
|
||||||
|
class box_chart &whisker_size(float whisker_size);
|
||||||
|
|
||||||
|
bool whisker_face() const;
|
||||||
|
|
||||||
|
class box_chart &whisker_face(bool whisker_face);
|
||||||
|
|
||||||
|
bool jitter_outliers() const;
|
||||||
|
|
||||||
|
class box_chart &jitter_outliers(bool jitter_outliers);
|
||||||
|
|
||||||
|
float box_width() const;
|
||||||
|
|
||||||
|
class box_chart &box_width(float box_width);
|
||||||
|
|
||||||
|
float cap_size() const;
|
||||||
|
|
||||||
|
class box_chart &cap_size(float cap_size);
|
||||||
|
|
||||||
|
public /* getters and setters bypassing the line_spec */:
|
||||||
|
box_style_option box_style() const;
|
||||||
|
class box_chart &box_style(box_style_option box_style);
|
||||||
|
|
||||||
|
private /* helper functions to generate the plot */:
|
||||||
|
void maybe_update_face_color();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// sample data
|
||||||
|
std::vector<double> y_data_;
|
||||||
|
|
||||||
|
// sample groups (same length as y_data_)
|
||||||
|
// this describes the groups and the positions at the same time
|
||||||
|
std::vector<double> x_data_;
|
||||||
|
|
||||||
|
// color and style
|
||||||
|
color_array face_color_{{0.4f, 0, 0, 0}};
|
||||||
|
bool manual_face_color_{false};
|
||||||
|
color_array edge_color_{0, 0, 0, 0};
|
||||||
|
float edge_width_{0.5};
|
||||||
|
enum line_spec::marker_style whisker_style_{
|
||||||
|
line_spec::marker_style::circle};
|
||||||
|
float whisker_size_{1.};
|
||||||
|
bool whisker_face_{false};
|
||||||
|
bool jitter_outliers_{false};
|
||||||
|
float box_width_{0.5};
|
||||||
|
box_style_option box_style_{box_style_option::filled};
|
||||||
|
float cap_size_{3.};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_BOX_CHART_H
|
||||||
120
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/circles.h
vendored
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 16/07/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_CIRCLES_H
|
||||||
|
#define MATPLOTPLUSPLUS_CIRCLES_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/axis_type.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
class MATPLOT_EXPORTS circles : public axes_object {
|
||||||
|
public:
|
||||||
|
explicit circles(class axes_type *parent);
|
||||||
|
circles(class axes_type *parent, const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<double> &radius = {},
|
||||||
|
const std::vector<double> &start_angle = {},
|
||||||
|
const std::vector<double> &end_angle = {},
|
||||||
|
const std::vector<double> &color = {});
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
circles(const axes_handle &parent, Args&&... args)
|
||||||
|
: circles(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~circles() = default;
|
||||||
|
public /* mandatory virtual functions */:
|
||||||
|
// std::string set_variables_string() override;
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string legend_string(std::string_view title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
// std::string unset_variables_string() override;
|
||||||
|
bool requires_colormap() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* getters and setters */:
|
||||||
|
const std::vector<double> &x() const;
|
||||||
|
|
||||||
|
class circles &x(const std::vector<double> &x);
|
||||||
|
|
||||||
|
const std::vector<double> &y() const;
|
||||||
|
|
||||||
|
class circles &y(const std::vector<double> &y);
|
||||||
|
|
||||||
|
const std::vector<double> &radius() const;
|
||||||
|
|
||||||
|
class circles &radius(const std::vector<double> &radius);
|
||||||
|
|
||||||
|
const std::vector<double> &start_angle() const;
|
||||||
|
|
||||||
|
class circles &start_angle(const std::vector<double> &start_angle);
|
||||||
|
|
||||||
|
const std::vector<double> &end_angle() const;
|
||||||
|
|
||||||
|
class circles &end_angle(const std::vector<double> &end_angle);
|
||||||
|
|
||||||
|
const std::vector<double> &color() const;
|
||||||
|
|
||||||
|
class circles &color(const std::vector<double> &color);
|
||||||
|
|
||||||
|
const labels_handle &labels() const;
|
||||||
|
|
||||||
|
class circles &labels(const labels_handle &labels);
|
||||||
|
|
||||||
|
const color_array &face_color() const;
|
||||||
|
|
||||||
|
class circles &face_color(const color_array &face_color);
|
||||||
|
|
||||||
|
float line_width() const;
|
||||||
|
|
||||||
|
class circles &line_width(float line_width);
|
||||||
|
|
||||||
|
const color_array &line_color() const;
|
||||||
|
|
||||||
|
class circles &line_color(const color_array &line_color);
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
|
||||||
|
class circles &visible(bool visible);
|
||||||
|
|
||||||
|
public /* getters and setters bypassing the line_spec */:
|
||||||
|
protected:
|
||||||
|
void maybe_update_circles_color();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::vector<double> x_{}; // x position
|
||||||
|
std::vector<double> y_{}; // y position
|
||||||
|
std::vector<double> radius_{}; // 1
|
||||||
|
std::vector<double> start_angle_{}; // 0
|
||||||
|
std::vector<double> end_angle_{}; // 360
|
||||||
|
std::vector<double> color_{}; // colormap
|
||||||
|
|
||||||
|
// Labels around circles
|
||||||
|
labels_handle labels_;
|
||||||
|
|
||||||
|
// Style
|
||||||
|
color_array face_color_;
|
||||||
|
bool user_face_color_{false};
|
||||||
|
float line_width_{2.};
|
||||||
|
color_array line_color_{0., 0., 0., 0.};
|
||||||
|
|
||||||
|
bool visible_{true};
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_CIRCLES_H
|
||||||
291
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/contours.h
vendored
Normal file
@ -0,0 +1,291 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_CONTOURS_H
|
||||||
|
#define MATPLOTPLUSPLUS_CONTOURS_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <matplot/util/common.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/contourc.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
|
||||||
|
/// Create and store a set of contour lines or filled regions.
|
||||||
|
/// We have a class just for contours instead of using the
|
||||||
|
/// gnuplot surface. So we include functions here to
|
||||||
|
/// calculate the contour lines outside gnuplot.
|
||||||
|
/// The reason is that converting the gnuplot contours to
|
||||||
|
/// 2d xlim involves workarounds a 3d map view or plotting to a
|
||||||
|
/// temporary table, that don't interact well with other 2d
|
||||||
|
/// objects. It's also no possible to plot filled contours
|
||||||
|
/// with gnuplot. At most, one can plot a very high resolution
|
||||||
|
/// under the contour lines, but this is very. The only
|
||||||
|
/// way to have full control of how the contour lines will look
|
||||||
|
/// like is to calculate the contour lines outside gnuplot,
|
||||||
|
/// even if our algorithm is not perfect.
|
||||||
|
class MATPLOT_EXPORTS contours : public axes_object {
|
||||||
|
public:
|
||||||
|
/// X, Y grids and their Z values
|
||||||
|
/// Every X column has the same value for all rows.
|
||||||
|
/// This value increases in the next column.
|
||||||
|
/// Every Y row has the same value for all columns.
|
||||||
|
/// This value increases in the next rows.
|
||||||
|
/// Thus, the high values indices represent values
|
||||||
|
/// that are graphically on the top:
|
||||||
|
/// (X[3][0], Y[3][0]) (X[3][1], Y[3][1]) (X[3][2], Y[3][2])
|
||||||
|
/// (X[2][0], Y[2][0]) (X[2][1], Y[2][1]) (X[2][2], Y[2][2])
|
||||||
|
/// (X[1][0], Y[1][0]) (X[1][1], Y[1][1]) (X[1][2], Y[1][2])
|
||||||
|
/// (X[0][0], Y[0][0]) (X[0][1], Y[0][1]) (X[0][2], Y[0][2])
|
||||||
|
/// \param parent Parent xlim
|
||||||
|
/// \param X X grid
|
||||||
|
/// \param Y Y grid
|
||||||
|
/// \param Z Z heights
|
||||||
|
/// \param line_spec Line properties
|
||||||
|
contours(class axes_type *parent, const vector_2d &X,
|
||||||
|
const vector_2d &Y, const vector_2d &Z,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
contours(class axes_type *parent, const vector_2d &Z,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
contours(const axes_handle &parent, Args &&... args)
|
||||||
|
: contours(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~contours() = default;
|
||||||
|
|
||||||
|
public /* mandatory virtual functions */:
|
||||||
|
std::string set_variables_string() override;
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string legend_string(std::string_view title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
bool requires_colormap() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* getters and setters */:
|
||||||
|
class contours &line_style(std::string_view line_spec);
|
||||||
|
|
||||||
|
const matplot::line_spec &line_spec() const;
|
||||||
|
matplot::line_spec &line_spec();
|
||||||
|
class contours &line_spec(const class line_spec &line_spec);
|
||||||
|
|
||||||
|
const vector_2d &Y_data() const;
|
||||||
|
class contours &Y_data(const vector_2d &Y_data);
|
||||||
|
|
||||||
|
const vector_2d &X_data() const;
|
||||||
|
class contours &X_data(const vector_2d &X_data);
|
||||||
|
|
||||||
|
const vector_2d &Z_data() const;
|
||||||
|
class contours &Z_data(const vector_2d &Z_data);
|
||||||
|
|
||||||
|
const vector_2d &x_data() const;
|
||||||
|
class contours &x_data(const vector_2d &x_data);
|
||||||
|
|
||||||
|
const vector_2d &y_data() const;
|
||||||
|
class contours &y_data(const vector_2d &y_data);
|
||||||
|
|
||||||
|
const vector_2d &z_data() const;
|
||||||
|
class contours &z_data(const vector_2d &z_data);
|
||||||
|
|
||||||
|
bool contour_text() const;
|
||||||
|
class contours &contour_text(bool contour_text);
|
||||||
|
|
||||||
|
float font_size() const;
|
||||||
|
class contours &font_size(const float &font_size);
|
||||||
|
|
||||||
|
const std::string font() const;
|
||||||
|
class contours &font(std::string_view font);
|
||||||
|
|
||||||
|
const std::string &font_weight() const;
|
||||||
|
class contours &font_weight(std::string_view font_weight);
|
||||||
|
|
||||||
|
const color_array &font_color() const;
|
||||||
|
class contours &font_color(const color_array &font_color);
|
||||||
|
class contours &font_color(std::string_view font_color);
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
class contours &visible(bool visible);
|
||||||
|
|
||||||
|
size_t n_levels() const;
|
||||||
|
class contours &n_levels(size_t n_levels);
|
||||||
|
|
||||||
|
const std::vector<double> &levels() const;
|
||||||
|
class contours &levels(const std::vector<double> &levels);
|
||||||
|
|
||||||
|
bool filled() const;
|
||||||
|
class contours &filled(bool filled);
|
||||||
|
|
||||||
|
bool colormap_line_when_filled() const;
|
||||||
|
|
||||||
|
class contours &
|
||||||
|
colormap_line_when_filled(bool colormap_line_when_filled);
|
||||||
|
|
||||||
|
public /* getters and setters bypassing the line_spec */:
|
||||||
|
float line_width() const;
|
||||||
|
class contours &line_width(float line_width);
|
||||||
|
|
||||||
|
const std::array<float, 4> &color() const;
|
||||||
|
|
||||||
|
template <class T> contours &color(T c) {
|
||||||
|
line_spec().color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
inline class contours &color(std::initializer_list<float> c) {
|
||||||
|
line_spec().color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void make_sure_data_is_preprocessed();
|
||||||
|
void clear_preprocessed_data();
|
||||||
|
bool is_lower_level(size_t line_index, size_t segment_begin,
|
||||||
|
size_t segment_end);
|
||||||
|
std::pair<vector_1d, vector_1d>
|
||||||
|
fill_border_jump(double start_x, double start_y, double end_x,
|
||||||
|
double end_y, double x_min, double x_max, double y_min,
|
||||||
|
double y_max, bool is_parent);
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum class extend_option { neither, min, max, both };
|
||||||
|
|
||||||
|
/// Determine some automatic contour levels for data ranging from z_min
|
||||||
|
/// to z_max Each library will use a different algorithm to determine
|
||||||
|
/// levels. In our case, this is similar to the algorithm for automatic
|
||||||
|
/// histogram edges. The difference is that the final histogram edges
|
||||||
|
/// fall outside the range [z_min,z_max] while we want all contour lines
|
||||||
|
/// to fall inside [z_min,z_max] Select contour levels to span the data.
|
||||||
|
// The target number of levels, *N*, is used only when the
|
||||||
|
// scale is not log and default locator is used.
|
||||||
|
//
|
||||||
|
// We need two more levels for filled contours than for
|
||||||
|
// line contours, because for the latter we need to specify
|
||||||
|
// the lower and upper boundary of each range.
|
||||||
|
//
|
||||||
|
// For example,
|
||||||
|
// a single contour boundary, say at z = 0, requires only
|
||||||
|
// one contour line, but two filled regions, and therefore
|
||||||
|
// three levels to provide boundaries for both regions.
|
||||||
|
/// Assign values to :attr:`layers` based on :attr:`levels`,
|
||||||
|
/// adding extended layers as needed if contours are filled.
|
||||||
|
/// For line contours, layers simply coincide with levels;
|
||||||
|
/// a line is a thin layer. No extended levels are needed
|
||||||
|
/// with line contours.
|
||||||
|
static std::vector<double>
|
||||||
|
determine_contour_levels(double z_min, double z_max, size_t n_levels_,
|
||||||
|
extend_option ext = extend_option::neither);
|
||||||
|
static std::vector<double>
|
||||||
|
determine_contour_levels(const vector_2d &Z, size_t n_levels_,
|
||||||
|
extend_option ext = extend_option::neither);
|
||||||
|
|
||||||
|
/// Return ``(lowers, uppers)`` levels for filled contours.
|
||||||
|
std::pair<vector_1d, vector_1d> get_lowers_and_uppers();
|
||||||
|
|
||||||
|
void process_contour_levels();
|
||||||
|
void initialize_preprocessed_data();
|
||||||
|
void check_xyz();
|
||||||
|
void initialize_x_y();
|
||||||
|
|
||||||
|
void process_all_segs_and_all_kinds();
|
||||||
|
|
||||||
|
double zmin() override;
|
||||||
|
double zmax() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// Pre-processed contour lines
|
||||||
|
std::vector<QuadContourGenerator::vertices_list_type> lines_;
|
||||||
|
|
||||||
|
/// Pre-processed contour lines for filled plots
|
||||||
|
/// This uses another algorithm for pairs of levels
|
||||||
|
/// We generate the lines twice for filled plots because
|
||||||
|
/// the closed polygons of filled plots are not good enough
|
||||||
|
/// to represent everything.
|
||||||
|
/// Also, this makes it much easier to label the unfilled lines.
|
||||||
|
std::vector<QuadContourGenerator::vertices_list_type> filled_lines_;
|
||||||
|
|
||||||
|
/// These codes indicate what's happening in a filled line
|
||||||
|
/// Starting a polygon, closing a polygon, or middle of a polygon
|
||||||
|
std::vector<QuadContourGenerator::codes_list_type> codes_;
|
||||||
|
|
||||||
|
/// Object with the algorithm to generate contour lines
|
||||||
|
QuadContourGenerator contour_generator_;
|
||||||
|
|
||||||
|
/// Segments of filled contours
|
||||||
|
using level_index_type = size_t;
|
||||||
|
using begin_index_type = size_t;
|
||||||
|
using end_index_type = size_t;
|
||||||
|
using area_type = double;
|
||||||
|
using line_segment_type =
|
||||||
|
std::tuple<level_index_type, begin_index_type, end_index_type>;
|
||||||
|
using parent_and_children_type =
|
||||||
|
std::tuple<line_segment_type, std::vector<line_segment_type>,
|
||||||
|
area_type>;
|
||||||
|
std::vector<parent_and_children_type> line_segments_;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// Line style
|
||||||
|
class line_spec line_spec_;
|
||||||
|
|
||||||
|
/// Data in the xlim
|
||||||
|
vector_2d X_data_{};
|
||||||
|
vector_2d Y_data_{};
|
||||||
|
vector_2d Z_data_{};
|
||||||
|
|
||||||
|
/// Parameters
|
||||||
|
size_t n_levels_{0};
|
||||||
|
bool manual_n_levels_{false};
|
||||||
|
std::vector<double> levels_{};
|
||||||
|
bool manual_levels_{false};
|
||||||
|
std::vector<double> _levels{};
|
||||||
|
std::vector<double> layers_ = {};
|
||||||
|
|
||||||
|
/// Style
|
||||||
|
bool filled_{false};
|
||||||
|
vector_1d linewidths_ = {};
|
||||||
|
bool antialiased_ = false;
|
||||||
|
bool _corner_mask = false;
|
||||||
|
bool colormap_line_when_filled_ = false;
|
||||||
|
|
||||||
|
/// Pre-processed data
|
||||||
|
std::vector<class line_spec> linestyles_{};
|
||||||
|
vector_1d extent_ = {};
|
||||||
|
std::vector<color_array> cmap_ = {};
|
||||||
|
std::vector<color_array> colors_ = {};
|
||||||
|
double norm_ = NaN;
|
||||||
|
double vmin_ = NaN;
|
||||||
|
double vmax_ = NaN;
|
||||||
|
extend_option extend_ = extend_option::neither;
|
||||||
|
size_t nchunk_ = 0;
|
||||||
|
double zmin_{NaN};
|
||||||
|
double zmax_{NaN};
|
||||||
|
|
||||||
|
/// Text around the lines
|
||||||
|
bool contour_text_{false};
|
||||||
|
std::optional<float> font_size_{std::nullopt};
|
||||||
|
std::optional<std::string> font_{std::nullopt};
|
||||||
|
std::string font_weight_{"normal"};
|
||||||
|
color_array font_color_{0, 0, 0, 0};
|
||||||
|
|
||||||
|
/// True if visible
|
||||||
|
bool visible_{true};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_CONTOURS_H
|
||||||
91
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/error_bar.h
vendored
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 09/07/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_ERROR_BAR_H
|
||||||
|
#define MATPLOTPLUSPLUS_ERROR_BAR_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/axes_objects/line.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
|
||||||
|
class MATPLOT_EXPORTS error_bar : public line {
|
||||||
|
public:
|
||||||
|
enum class type { vertical, horizontal, both };
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit error_bar(class axes_type *parent);
|
||||||
|
|
||||||
|
/// Construct with x and y error
|
||||||
|
error_bar(class axes_type *parent, const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<double> &y_neg_delta,
|
||||||
|
const std::vector<double> &y_pos_delta,
|
||||||
|
const std::vector<double> &x_neg_delta,
|
||||||
|
const std::vector<double> &x_pos_delta,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// Construct with y error only
|
||||||
|
error_bar(class axes_type *parent, const std::vector<double> &x_data,
|
||||||
|
const std::vector<double> &y_data,
|
||||||
|
const std::vector<double> &error,
|
||||||
|
error_bar::type type = error_bar::type::vertical,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership of the xlim
|
||||||
|
template <class... Args>
|
||||||
|
error_bar(const axes_handle &parent, Args&&... args)
|
||||||
|
: error_bar(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
public /* override the plotting function for error_bar */:
|
||||||
|
std::string set_variables_string() override;
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string data_string() override;
|
||||||
|
bool requires_colormap() override;
|
||||||
|
std::string unset_variables_string() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* methods for error_bar only */:
|
||||||
|
const std::vector<double> &x_negative_delta() const;
|
||||||
|
class error_bar &
|
||||||
|
x_negative_delta(const std::vector<double> &x_negative_delta);
|
||||||
|
|
||||||
|
const std::vector<double> &x_positive_delta() const;
|
||||||
|
class error_bar &
|
||||||
|
x_positive_delta(const std::vector<double> &x_positive_delta);
|
||||||
|
|
||||||
|
const std::vector<double> &y_negative_delta() const;
|
||||||
|
class error_bar &
|
||||||
|
y_negative_delta(const std::vector<double> &y_negative_delta);
|
||||||
|
|
||||||
|
const std::vector<double> &y_positive_delta() const;
|
||||||
|
class error_bar &
|
||||||
|
y_positive_delta(const std::vector<double> &y_positive_delta);
|
||||||
|
|
||||||
|
float filled_curve_alpha() const;
|
||||||
|
class error_bar &filled_curve_alpha(float filled_curve_alpha);
|
||||||
|
|
||||||
|
bool filled_curve() const;
|
||||||
|
class error_bar &filled_curve(bool filled_curve);
|
||||||
|
|
||||||
|
float cap_size() const;
|
||||||
|
class error_bar &cap_size(float cap_size);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::vector<double> x_negative_delta_{};
|
||||||
|
std::vector<double> x_positive_delta_{};
|
||||||
|
std::vector<double> y_negative_delta_{};
|
||||||
|
std::vector<double> y_positive_delta_{};
|
||||||
|
|
||||||
|
bool filled_curve_{false};
|
||||||
|
float filled_curve_alpha_{0.9f};
|
||||||
|
|
||||||
|
float cap_size_{3.};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_ERROR_BAR_H
|
||||||
69
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/filled_area.h
vendored
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 09/07/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_FILLED_AREA_H
|
||||||
|
#define MATPLOTPLUSPLUS_FILLED_AREA_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/axes_objects/line.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
|
||||||
|
class MATPLOT_EXPORTS filled_area : public line {
|
||||||
|
public:
|
||||||
|
enum class type { vertical, horizontal, both };
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit filled_area(class axes_type *parent);
|
||||||
|
|
||||||
|
/// Construct with x and y error
|
||||||
|
filled_area(class axes_type *parent, const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<double> &base_values = {0.},
|
||||||
|
bool stacked = true, std::string_view line_spec = "k-");
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership of the xlim
|
||||||
|
template <class... Args>
|
||||||
|
filled_area(const axes_handle &parent, Args&&... args)
|
||||||
|
: filled_area(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
public /* override the plotting function for filled_area */:
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string data_string() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* methods for filled_area only */:
|
||||||
|
bool stacked() const;
|
||||||
|
class filled_area &stacked(bool stacked);
|
||||||
|
|
||||||
|
const std::vector<double> &base_data() const;
|
||||||
|
class filled_area &base_data(const std::vector<double> &base_data);
|
||||||
|
|
||||||
|
bool plot_base_line() const;
|
||||||
|
class filled_area &plot_base_line(bool plot_base_line);
|
||||||
|
|
||||||
|
const color_array &face_color() const;
|
||||||
|
class filled_area &face_color(const color_array &face_color);
|
||||||
|
|
||||||
|
bool fill_user_color() const;
|
||||||
|
class filled_area &fill_user_color(bool fill_user_color);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void maybe_update_face_color();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool stacked_{true};
|
||||||
|
|
||||||
|
std::vector<double> base_data_{0.};
|
||||||
|
bool plot_base_line_{true};
|
||||||
|
|
||||||
|
color_array face_color_{0, 0, 0, 0};
|
||||||
|
bool fill_user_color_{false};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_FILLED_AREA_H
|
||||||
85
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/function_line.h
vendored
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-06.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_FUNCTION_LINE_H
|
||||||
|
#define MATPLOTPLUSPLUS_FUNCTION_LINE_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/axes_objects/line.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class MATPLOT_EXPORTS function_line : public line {
|
||||||
|
public:
|
||||||
|
using function_type = std::function<double(double)>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit function_line(class axes_type *parent);
|
||||||
|
|
||||||
|
function_line(class axes_type *parent, const function_type &equation,
|
||||||
|
std::array<double, 2> x_range = {-5, 5},
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
function_line(class axes_type *parent, const function_type &function_x,
|
||||||
|
const function_type &function_y,
|
||||||
|
std::array<double, 2> t_range = {-5, 5},
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
function_line(class axes_type *parent, const function_type &function_x,
|
||||||
|
const function_type &function_y,
|
||||||
|
const function_type &function_z,
|
||||||
|
std::array<double, 2> t_range = {-5, 5},
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
function_line(const axes_handle &parent, Args&&... args)
|
||||||
|
: function_line(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
std::string plot_string() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
const function_type &fn() const;
|
||||||
|
class function_line &fn(const function_type &fn);
|
||||||
|
|
||||||
|
class function_line &tmin(double x);
|
||||||
|
class function_line &tmax(double x);
|
||||||
|
double tmin();
|
||||||
|
double tmax();
|
||||||
|
|
||||||
|
const std::array<double, 2> &t_range() const;
|
||||||
|
class function_line &t_range(const std::array<double, 2> &t_range);
|
||||||
|
class function_line &t_range(double t_min, double t_max);
|
||||||
|
|
||||||
|
size_t mesh_density() const;
|
||||||
|
class function_line &mesh_density(size_t mesh_density);
|
||||||
|
|
||||||
|
bool automatic_mesh_density() const;
|
||||||
|
class function_line &
|
||||||
|
automatic_mesh_density(bool automatic_mesh_density);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void make_sure_data_is_preprocessed();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::array<double, 2> t_range_;
|
||||||
|
std::vector<double> t_data_{};
|
||||||
|
size_t mesh_density_{30};
|
||||||
|
bool automatic_mesh_density_{true};
|
||||||
|
function_type fn_x_{nullptr};
|
||||||
|
function_type fn_y_{nullptr};
|
||||||
|
function_type fn_z_{nullptr};
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_FUNCTION_LINE_H
|
||||||
269
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/histogram.h
vendored
Normal file
@ -0,0 +1,269 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_HISTOGRAM_H
|
||||||
|
#define MATPLOTPLUSPLUS_HISTOGRAM_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/common.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <array>
|
||||||
|
#include <cmath>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
class MATPLOT_EXPORTS histogram : public axes_object {
|
||||||
|
public:
|
||||||
|
// source code in 'edit histcount'
|
||||||
|
enum class binning_algorithm {
|
||||||
|
automatic, // Scott's rule for doubles or integers rule for data
|
||||||
|
// distributed around integers
|
||||||
|
scott, // Scott’s rule - bin_width = 3.5*std(x)*|X|^(-1/3)
|
||||||
|
fd, // Freedman-Diaconis rule - bin width =
|
||||||
|
// 2*IQR(X(:))*numel(X)^(-1/3) (for heavy tailed distributions,
|
||||||
|
// less sensitive to outliers) - IQR = interquartile range of X
|
||||||
|
integers, // Integer rule - bin width = 1
|
||||||
|
sturges, // Sturges' rule - number of bins = ceil(1+log2(numel(X)))
|
||||||
|
sqrt // Square root rule - number of bins = ceil(sqrt(numel(X)))
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class normalization {
|
||||||
|
count, // value_i = count_i
|
||||||
|
count_density, // value_i = count_i / bin_width_i
|
||||||
|
cummulative_count, // value_i = sum_j=1^i count_j
|
||||||
|
probability, // value_i = count_i / size -> (sum(heights) <= 1)
|
||||||
|
pdf, // value_i = count_i / (size * width_i) -> (sum(areas) <= 1)
|
||||||
|
cdf // value_i = sum_j=1^i count_j / size
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit histogram(class axes_type *parent);
|
||||||
|
histogram(class axes_type *parent, const std::vector<double> &data,
|
||||||
|
size_t n_bins,
|
||||||
|
enum histogram::normalization normalization_alg =
|
||||||
|
histogram::normalization::count);
|
||||||
|
histogram(class axes_type *parent, const std::vector<double> &data,
|
||||||
|
const std::vector<double> &edges,
|
||||||
|
enum histogram::normalization normalization_alg =
|
||||||
|
histogram::normalization::count);
|
||||||
|
histogram(class axes_type *parent, const std::vector<double> &data,
|
||||||
|
binning_algorithm algorithm = binning_algorithm::automatic,
|
||||||
|
histogram::normalization normalization_alg =
|
||||||
|
histogram::normalization::count);
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
histogram(const axes_handle &parent, Args&&... args)
|
||||||
|
: histogram(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~histogram() = default;
|
||||||
|
public /* xlim object virtual functions */:
|
||||||
|
// std::string set_variables_string() override;
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string legend_string(std::string_view title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
// std::string unset_variables_string() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* useful functions for histograms */:
|
||||||
|
/// Increase number of bins
|
||||||
|
size_t morebins(double bin_increase = 0.1);
|
||||||
|
|
||||||
|
/// Decrease number of bins
|
||||||
|
size_t fewerbins(double bin_decrease = 0.1);
|
||||||
|
|
||||||
|
/// Find appropriate edges given a fixed number of bins and target bin
|
||||||
|
/// width If nbins == 0, round the bin width and create
|
||||||
|
/// (xmax-xmin)/bin_width bins If nbins != 0, bin width is set to
|
||||||
|
/// (xmax-xmin)/nbins and create nbins bins
|
||||||
|
static std::vector<double> bin_picker(double xmin, double xmax,
|
||||||
|
size_t nbins, double bin_width);
|
||||||
|
|
||||||
|
/// Find appropriate edges with a given algorithm
|
||||||
|
static std::vector<double> histogram_edges(
|
||||||
|
const std::vector<double> &data, double minx, double maxx,
|
||||||
|
binning_algorithm algorithm = binning_algorithm::automatic,
|
||||||
|
bool hard_limits = false);
|
||||||
|
|
||||||
|
/// Count points within each pair of edges
|
||||||
|
static std::vector<size_t>
|
||||||
|
histogram_count(const std::vector<double> &values,
|
||||||
|
const std::vector<double> &edges);
|
||||||
|
|
||||||
|
/// Normalize the instagram count
|
||||||
|
static std::vector<double>
|
||||||
|
histogram_normalize(const std::vector<size_t> &bin_count,
|
||||||
|
const std::vector<double> &bin_edges,
|
||||||
|
size_t data_size,
|
||||||
|
enum normalization normalization_algorithm);
|
||||||
|
|
||||||
|
public /* getters and setters */:
|
||||||
|
const std::vector<double> &data() const;
|
||||||
|
class histogram &data(const std::vector<double> &data);
|
||||||
|
|
||||||
|
const std::vector<double> &values() const;
|
||||||
|
class histogram &values(const std::vector<double> &values);
|
||||||
|
|
||||||
|
const std::vector<size_t> &bin_counts() const;
|
||||||
|
class histogram &bin_counts(const std::vector<size_t> &bin_counts);
|
||||||
|
|
||||||
|
size_t num_bins();
|
||||||
|
class histogram &num_bins(size_t num_bins);
|
||||||
|
|
||||||
|
binning_algorithm algorithm() const;
|
||||||
|
class histogram &algorithm(binning_algorithm algorithm);
|
||||||
|
|
||||||
|
std::vector<double> &bin_edges();
|
||||||
|
class histogram &bin_edges(const std::vector<double> &bin_edges);
|
||||||
|
|
||||||
|
double bin_width() const;
|
||||||
|
class histogram &bin_width(double bin_width);
|
||||||
|
|
||||||
|
double bin_limits_min() const;
|
||||||
|
class histogram &bin_limits_min(double bin_limits_min);
|
||||||
|
|
||||||
|
double bin_limits_max() const;
|
||||||
|
class histogram &bin_limits_max(double bin_limits_max);
|
||||||
|
|
||||||
|
normalization normalization() const;
|
||||||
|
class histogram &normalization(enum normalization normalization);
|
||||||
|
|
||||||
|
const color_array &face_color() const;
|
||||||
|
class histogram &face_color(const color_array &face_color);
|
||||||
|
class histogram &face_color(std::initializer_list<float> face_color);
|
||||||
|
class histogram &face_color(std::string_view color);
|
||||||
|
|
||||||
|
class histogram &face_alpha(float alpha);
|
||||||
|
class histogram &edge_alpha(float alpha);
|
||||||
|
|
||||||
|
bool manual_face_color() const;
|
||||||
|
class histogram &manual_face_color(bool manual_face_color);
|
||||||
|
|
||||||
|
const color_array &edge_color() const;
|
||||||
|
class histogram &edge_color(const color_array &edge_color);
|
||||||
|
class histogram &edge_color(std::initializer_list<float> face_color);
|
||||||
|
class histogram &edge_color(std::string_view edge_color);
|
||||||
|
|
||||||
|
const line_spec &edge_style() const;
|
||||||
|
class histogram &edge_style(const line_spec &edge_style);
|
||||||
|
|
||||||
|
float line_width() const;
|
||||||
|
class histogram &line_width(float line_width);
|
||||||
|
|
||||||
|
bool vertical_orientation() const;
|
||||||
|
class histogram &vertical_orientation(bool vertical_orientation);
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
class histogram &visible(bool visible);
|
||||||
|
|
||||||
|
float bar_width() const;
|
||||||
|
class histogram &bar_width(float bar_width);
|
||||||
|
|
||||||
|
bool polar() const;
|
||||||
|
class histogram &polar(bool polar);
|
||||||
|
|
||||||
|
bool stairs_only() const;
|
||||||
|
class histogram &stairs_only(bool stairs_only);
|
||||||
|
|
||||||
|
/// Algorithms to determine histogram edges
|
||||||
|
static std::vector<double> scotts_rule(const std::vector<double> &x,
|
||||||
|
double minx, double maxx,
|
||||||
|
bool hard_limits);
|
||||||
|
static std::vector<double> fd_rule(const std::vector<double> &x,
|
||||||
|
double minx, double maxx,
|
||||||
|
bool hard_limits);
|
||||||
|
static std::vector<double> integers_rule(const std::vector<double> &x,
|
||||||
|
double minx, double maxx,
|
||||||
|
bool hard_limits);
|
||||||
|
static std::vector<double> sqrt_rule(const std::vector<double> &x,
|
||||||
|
double minx, double maxx,
|
||||||
|
bool hard_limits);
|
||||||
|
static std::vector<double> sturges_rule(const std::vector<double> &x,
|
||||||
|
double minx, double maxx,
|
||||||
|
bool hard_limits);
|
||||||
|
static std::vector<double> automatic_rule(const std::vector<double> &x,
|
||||||
|
double minx, double maxx,
|
||||||
|
bool hard_limits);
|
||||||
|
|
||||||
|
public /* getters and setters bypassing the histogram_spec */:
|
||||||
|
private:
|
||||||
|
/// If the user has not set the face color,
|
||||||
|
/// we get a color from the xlim
|
||||||
|
void maybe_update_face_color();
|
||||||
|
|
||||||
|
/// Make sure we have already calculated the normalized values
|
||||||
|
/// for the current parameters. We reset the normalized values
|
||||||
|
/// every time the user changes the algorithm.
|
||||||
|
void make_sure_data_is_preprocessed();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// original data
|
||||||
|
std::vector<double> data_;
|
||||||
|
|
||||||
|
// normalized values (in the simplest case, values_ = bin_counts_)
|
||||||
|
std::vector<double> values_;
|
||||||
|
|
||||||
|
// number of elements in each bin
|
||||||
|
std::vector<size_t> bin_counts_;
|
||||||
|
|
||||||
|
// target num of bins (0 indicates no target: the algorithm should
|
||||||
|
// decide)
|
||||||
|
size_t num_bins_{0};
|
||||||
|
|
||||||
|
// algorithm we use to create the bins
|
||||||
|
binning_algorithm algorithm_;
|
||||||
|
|
||||||
|
// where edges start
|
||||||
|
std::vector<double> bin_edges_;
|
||||||
|
|
||||||
|
// binning mode
|
||||||
|
enum binning_mode_type {
|
||||||
|
use_algorithm, // use algorithm to decide everything
|
||||||
|
use_bin_limits, // use algorithm with bin limits
|
||||||
|
use_fixed_num_bins, // use fixed num of bins
|
||||||
|
use_fixed_bin_width, // use fixed num of bins
|
||||||
|
use_fixed_edges, // use fixed edges, including edges of variable
|
||||||
|
// size
|
||||||
|
};
|
||||||
|
binning_mode_type binning_mode_{binning_mode_type::use_algorithm};
|
||||||
|
|
||||||
|
// bin width (if zero, the algorithm determines the bin width)
|
||||||
|
double bin_width_{0.0};
|
||||||
|
|
||||||
|
// bin limits
|
||||||
|
double bin_limits_min_;
|
||||||
|
double bin_limits_max_;
|
||||||
|
|
||||||
|
// normalization algorithm
|
||||||
|
enum normalization normalization_ { normalization::count };
|
||||||
|
|
||||||
|
// color and style
|
||||||
|
color_array face_color_{0.4f, 0, 0, 0};
|
||||||
|
bool manual_face_color_{false};
|
||||||
|
color_array edge_color_{0, 0, 0, 0};
|
||||||
|
bool manual_edge_color_{false};
|
||||||
|
line_spec edge_style_{"-"};
|
||||||
|
float line_width_{0.5};
|
||||||
|
bool vertical_orientation_{true};
|
||||||
|
float bar_width_{1.0};
|
||||||
|
bool polar_{false};
|
||||||
|
bool stairs_only_{false};
|
||||||
|
|
||||||
|
// True if visible
|
||||||
|
bool visible_{true};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_HISTOGRAM_H
|
||||||
112
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/labels.h
vendored
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 16/07/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_LABELS_H
|
||||||
|
#define MATPLOTPLUSPLUS_LABELS_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/axis_type.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
class MATPLOT_EXPORTS labels : public axes_object {
|
||||||
|
public:
|
||||||
|
enum alignment { left, right, center, automatic };
|
||||||
|
|
||||||
|
public:
|
||||||
|
static constexpr double width_factor = 0.04;
|
||||||
|
static constexpr double height_factor = 0.08;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit labels(class axes_type *parent);
|
||||||
|
labels(class axes_type *parent, const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<std::string> &labels = {},
|
||||||
|
const std::vector<double> &color = {},
|
||||||
|
const std::vector<double> &sizes = {});
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
labels(const axes_handle &parent, Args&&... args)
|
||||||
|
: labels(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~labels() = default;
|
||||||
|
public /* mandatory virtual functions */:
|
||||||
|
std::string set_variables_string() override;
|
||||||
|
std::string plot_string() override;
|
||||||
|
// std::string legend_string(const std::string& title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
std::string unset_variables_string() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* getters and setters */:
|
||||||
|
bool rectangles() const;
|
||||||
|
class labels &rectangles(bool rectangles);
|
||||||
|
|
||||||
|
bool absolute_size() const;
|
||||||
|
class labels &absolute_size(bool absolute_size);
|
||||||
|
|
||||||
|
enum alignment alignment() const;
|
||||||
|
class labels &alignment(enum alignment alignment);
|
||||||
|
|
||||||
|
const std::vector<double> &x() const;
|
||||||
|
class labels &x(const std::vector<double> &x);
|
||||||
|
|
||||||
|
const std::vector<double> &y() const;
|
||||||
|
class labels &y(const std::vector<double> &y);
|
||||||
|
|
||||||
|
const std::vector<std::string> &label_values() const;
|
||||||
|
class labels &label_values(const std::vector<std::string> &labels);
|
||||||
|
|
||||||
|
const std::vector<double> &colors() const;
|
||||||
|
class labels &colors(const std::vector<double> &colors);
|
||||||
|
|
||||||
|
const std::vector<double> &sizes() const;
|
||||||
|
class labels &sizes(const std::vector<double> &sizes);
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
class labels &visible(bool visible);
|
||||||
|
|
||||||
|
const color_array &color() const;
|
||||||
|
class labels &color(const color_array &color);
|
||||||
|
template <class T> labels &color(T c) {
|
||||||
|
color(to_array(c));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string &font() const;
|
||||||
|
class labels &font(std::string_view font);
|
||||||
|
|
||||||
|
float font_size() const;
|
||||||
|
class labels &font_size(float font_size);
|
||||||
|
|
||||||
|
public /* getters and setters bypassing the line_spec */:
|
||||||
|
protected:
|
||||||
|
class line_spec line_spec_;
|
||||||
|
std::vector<double> x_{}; // x position
|
||||||
|
std::vector<double> y_{}; // y position
|
||||||
|
std::vector<std::string> labels_{}; // 1
|
||||||
|
std::vector<double> colors_{}; // colormap
|
||||||
|
std::vector<double> sizes_{}; // colormap
|
||||||
|
bool rectangles_{false}; // plot rectangles behind the words
|
||||||
|
bool absolute_size_{true}; // reduce font size for
|
||||||
|
bool visible_{true};
|
||||||
|
enum alignment alignment_ { alignment::automatic };
|
||||||
|
std::string font_{"Helvetica"};
|
||||||
|
float font_size_{10};
|
||||||
|
color_array color_{0, 0, 0, 0};
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_LABELS_H
|
||||||
198
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/line.h
vendored
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_LINE_H
|
||||||
|
#define MATPLOTPLUSPLUS_LINE_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
class MATPLOT_EXPORTS line : public axes_object {
|
||||||
|
public:
|
||||||
|
explicit line(class axes_type *parent);
|
||||||
|
line(class axes_type *parent, const std::vector<double> &y_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
line(class axes_type *parent, const std::vector<double> &x_data,
|
||||||
|
const std::vector<double> &y_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
line(class axes_type *parent, const std::vector<double> &x_data,
|
||||||
|
const std::vector<double> &y_data,
|
||||||
|
const std::vector<double> &z_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
line(const axes_handle &parent, Args &&... args)
|
||||||
|
: line(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~line() = default;
|
||||||
|
|
||||||
|
public /* mandatory virtual functions */:
|
||||||
|
void run_draw_commands() override;
|
||||||
|
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string legend_string(std::string_view title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
bool requires_colormap() override;
|
||||||
|
|
||||||
|
public /* getters and setters */:
|
||||||
|
class line &line_style(std::string_view line_spec);
|
||||||
|
|
||||||
|
const matplot::line_spec &line_spec() const;
|
||||||
|
matplot::line_spec &line_spec();
|
||||||
|
class line &line_spec(const class line_spec &line_spec);
|
||||||
|
|
||||||
|
const std::vector<double> &y_data() const;
|
||||||
|
class line &y_data(const std::vector<double> &y_data);
|
||||||
|
|
||||||
|
const std::vector<double> &x_data() const;
|
||||||
|
class line &x_data(const std::vector<double> &x_data);
|
||||||
|
|
||||||
|
const std::vector<double> &z_data() const;
|
||||||
|
class line &z_data(const std::vector<double> &z_data);
|
||||||
|
|
||||||
|
const std::vector<size_t> &marker_indices() const;
|
||||||
|
class line &marker_indices(const std::vector<size_t> &marker_indices);
|
||||||
|
|
||||||
|
bool use_y2() const;
|
||||||
|
class line &use_y2(bool use_y_2);
|
||||||
|
|
||||||
|
bool impulse() const;
|
||||||
|
class line &impulse(bool impulse);
|
||||||
|
|
||||||
|
bool fill() const;
|
||||||
|
class line &fill(bool fill);
|
||||||
|
|
||||||
|
bool use_y_2() const;
|
||||||
|
class line &use_y_2(bool use_y_2);
|
||||||
|
|
||||||
|
bool polar() const;
|
||||||
|
class line &polar(bool polar);
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
class line &visible(bool visible);
|
||||||
|
|
||||||
|
public /* getters and setters bypassing the line_spec */:
|
||||||
|
float line_width() const;
|
||||||
|
class line &line_width(float line_width);
|
||||||
|
|
||||||
|
enum line_spec::marker_style marker_style() const;
|
||||||
|
template <class T> line &marker_style(T marker_style) {
|
||||||
|
line_spec_.marker_style(marker_style);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum line_spec::marker_style marker() const;
|
||||||
|
template <class T> line &marker(T marker) {
|
||||||
|
line_spec_.marker(marker);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
float marker_size() const;
|
||||||
|
class line &marker_size(float size);
|
||||||
|
class line &marker_size(const std::vector<float> &size_vector);
|
||||||
|
class line &marker_size(const std::vector<double> &size_vector);
|
||||||
|
|
||||||
|
bool marker_face() const;
|
||||||
|
class line &marker_face(bool size);
|
||||||
|
|
||||||
|
const std::array<float, 4> &color() const;
|
||||||
|
template <class T> line &color(T c) {
|
||||||
|
line_spec().color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class line &color(std::initializer_list<float> c) {
|
||||||
|
line_spec().color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::array<float, 4> &marker_color() const;
|
||||||
|
|
||||||
|
template <class T> line &marker_color(T c) {
|
||||||
|
line_spec().marker_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class line &marker_color(std::initializer_list<float> c) {
|
||||||
|
line_spec().marker_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class line &marker_colors(const std::vector<double> &cs) {
|
||||||
|
marker_colors_ = cs;
|
||||||
|
touch();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::array<float, 4> &marker_face_color() const;
|
||||||
|
|
||||||
|
template <class T> line &marker_face_color(T c) {
|
||||||
|
line_spec().marker_face_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class line &marker_face_color(std::initializer_list<float> c) {
|
||||||
|
line_spec().marker_face_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float marker_face_alpha() {
|
||||||
|
return line_spec().marker_face_alpha();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class line &marker_face_alpha(float a) {
|
||||||
|
line_spec().marker_face_alpha(a);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual std::vector<line_spec::style_to_plot> styles_to_plot();
|
||||||
|
void maybe_update_line_spec();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// Line style
|
||||||
|
matplot::line_spec line_spec_;
|
||||||
|
|
||||||
|
/// Data in the xlim
|
||||||
|
std::vector<double> y_data_{};
|
||||||
|
std::vector<double> x_data_{};
|
||||||
|
std::vector<double> z_data_{};
|
||||||
|
|
||||||
|
/// Positions at which we want markers to appear
|
||||||
|
std::vector<size_t> marker_indices_{};
|
||||||
|
std::vector<float> marker_sizes_{};
|
||||||
|
std::vector<double> marker_colors_{};
|
||||||
|
|
||||||
|
/// Draw line as impulse
|
||||||
|
bool impulse_{false};
|
||||||
|
|
||||||
|
/// Draw line as filled area
|
||||||
|
bool fill_{false};
|
||||||
|
|
||||||
|
/// Use the y2 xlim
|
||||||
|
bool use_y2_{false};
|
||||||
|
|
||||||
|
/// This line is meant for a polar plot
|
||||||
|
bool polar_{false};
|
||||||
|
|
||||||
|
/// True if visible
|
||||||
|
bool visible_{true};
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_LINE_H
|
||||||
156
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/matrix.h
vendored
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 16/07/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_MATRIX_H
|
||||||
|
#define MATPLOTPLUSPLUS_MATRIX_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/axis_type.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/common.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
|
||||||
|
class MATPLOT_EXPORTS matrix : public axes_object {
|
||||||
|
public:
|
||||||
|
enum class color_normalization { none, rows, columns };
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit matrix(class axes_type *parent);
|
||||||
|
|
||||||
|
/// Heatmap
|
||||||
|
/// Matrix of values that can be any double
|
||||||
|
matrix(class axes_type *parent,
|
||||||
|
const std::vector<std::vector<double>> &matrix);
|
||||||
|
|
||||||
|
/// Matrix with an rgb image
|
||||||
|
matrix(class axes_type *parent,
|
||||||
|
const std::vector<std::vector<double>> &red_channel,
|
||||||
|
const std::vector<std::vector<double>> &green_channel,
|
||||||
|
const std::vector<std::vector<double>> &blue_channel,
|
||||||
|
const std::vector<std::vector<double>> &alpha_channel = {});
|
||||||
|
|
||||||
|
/// Matrix with a b&w image
|
||||||
|
matrix(class axes_type *parent, const image_channel_t &gray_image);
|
||||||
|
|
||||||
|
/// Matrix with an rgb image
|
||||||
|
matrix(class axes_type *parent, const image_channel_t &red_channel,
|
||||||
|
const image_channel_t &green_channel,
|
||||||
|
const image_channel_t &blue_channel,
|
||||||
|
const image_channel_t &alpha_channel = {});
|
||||||
|
|
||||||
|
/// Matrices with an image
|
||||||
|
matrix(class axes_type *parent, const image_channels_t &rgb_image);
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
matrix(const axes_handle &parent, Args &&... args)
|
||||||
|
: matrix(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~matrix() = default;
|
||||||
|
|
||||||
|
public /* mandatory virtual functions */:
|
||||||
|
// std::string set_variables_string() override;
|
||||||
|
std::string plot_string() override;
|
||||||
|
// std::string legend_string(const std::string& title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
// std::string unset_variables_string() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* getters and setters */:
|
||||||
|
color_normalization normalization() const;
|
||||||
|
class matrix &normalization(color_normalization normalization);
|
||||||
|
|
||||||
|
const std::vector<std::vector<double>> &matrix_r() const;
|
||||||
|
class matrix &
|
||||||
|
matrix_r(const std::vector<std::vector<double>> &matrix_r);
|
||||||
|
|
||||||
|
const std::vector<std::vector<double>> &matrix_g() const;
|
||||||
|
class matrix &
|
||||||
|
matrix_g(const std::vector<std::vector<double>> &matrix_g);
|
||||||
|
|
||||||
|
const std::vector<std::vector<double>> &matrix_b() const;
|
||||||
|
class matrix &
|
||||||
|
matrix_b(const std::vector<std::vector<double>> &matrix_b);
|
||||||
|
|
||||||
|
const std::vector<std::vector<double>> &matrix_a() const;
|
||||||
|
class matrix &
|
||||||
|
matrix_a(const std::vector<std::vector<double>> &matrix_a);
|
||||||
|
|
||||||
|
bool always_hide_labels() const;
|
||||||
|
class matrix &always_hide_labels(bool always_hide_labels);
|
||||||
|
|
||||||
|
double x() const;
|
||||||
|
class matrix &x(double x);
|
||||||
|
|
||||||
|
double y() const;
|
||||||
|
class matrix &y(double y);
|
||||||
|
|
||||||
|
double w() const;
|
||||||
|
class matrix &w(double w);
|
||||||
|
|
||||||
|
double h() const;
|
||||||
|
class matrix &h(double h);
|
||||||
|
|
||||||
|
double alpha() const;
|
||||||
|
class matrix &alpha(double alpha);
|
||||||
|
|
||||||
|
public /* functions for matrixes */:
|
||||||
|
/// Matrix has three channels
|
||||||
|
bool is_rgb() const;
|
||||||
|
|
||||||
|
/// Matrix has 4 channels
|
||||||
|
bool is_rgba() const;
|
||||||
|
|
||||||
|
/// A matrix might have alpha because of an
|
||||||
|
/// alpha channels or because alpha_ != 0.
|
||||||
|
/// In both cases we have a rgba matrix
|
||||||
|
bool has_alpha() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool should_plot_labels();
|
||||||
|
void setup_axes();
|
||||||
|
std::string matrix_data_string();
|
||||||
|
std::string image_data_string();
|
||||||
|
std::string labels_data_string();
|
||||||
|
|
||||||
|
inline double x_width() {
|
||||||
|
return (w_ - 1) / static_cast<double>(matrices_[0][0].size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline double y_width() { return (h_ - 1) / static_cast<double>(matrices_[0].size() - 1); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Main matrix
|
||||||
|
std::vector<std::vector<std::vector<double>>> matrices_{};
|
||||||
|
|
||||||
|
// For heatmaps or 1 matrix
|
||||||
|
color_normalization normalization_{color_normalization::none};
|
||||||
|
|
||||||
|
// Matrix placement
|
||||||
|
double x_{1};
|
||||||
|
double y_{1};
|
||||||
|
double w_{0.};
|
||||||
|
double h_{0.};
|
||||||
|
|
||||||
|
// Style
|
||||||
|
bool always_hide_labels_{false};
|
||||||
|
labels_handle labels_;
|
||||||
|
double alpha_ = 0.0;
|
||||||
|
|
||||||
|
bool visible_{true};
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_MATRIX_H
|
||||||
278
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/network.h
vendored
Normal file
@ -0,0 +1,278 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_NETWORK_H
|
||||||
|
#define MATPLOTPLUSPLUS_NETWORK_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/common.h>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
class MATPLOT_EXPORTS network : public axes_object {
|
||||||
|
public:
|
||||||
|
enum class layout { automatic, force, circle, kawai, random };
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit network(class axes_type *parent);
|
||||||
|
network(class axes_type *parent,
|
||||||
|
const std::vector<std::pair<size_t, size_t>> &edges,
|
||||||
|
const std::vector<double> &weights, size_t n_vertices,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
network(const axes_handle &parent, Args &&...args)
|
||||||
|
: network(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~network() = default;
|
||||||
|
public /* mandatory virtual functions */:
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string legend_string(std::string_view title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* getters and setters */:
|
||||||
|
class network &line_style(std::string_view line_spec);
|
||||||
|
|
||||||
|
const matplot::line_spec &line_spec() const;
|
||||||
|
matplot::line_spec &line_spec();
|
||||||
|
class network &line_spec(const class line_spec &line_spec);
|
||||||
|
|
||||||
|
const std::vector<double> &y_data() const;
|
||||||
|
class network &y_data(const std::vector<double> &y_data);
|
||||||
|
|
||||||
|
const std::vector<double> &x_data() const;
|
||||||
|
class network &x_data(const std::vector<double> &x_data);
|
||||||
|
|
||||||
|
const std::vector<double> &z_data() const;
|
||||||
|
class network &z_data(const std::vector<double> &z_data);
|
||||||
|
|
||||||
|
const std::vector<size_t> &marker_indices() const;
|
||||||
|
class network &
|
||||||
|
marker_indices(const std::vector<size_t> &marker_indices);
|
||||||
|
|
||||||
|
bool use_y2() const;
|
||||||
|
class network &use_y2(bool use_y_2);
|
||||||
|
|
||||||
|
bool use_y_2() const;
|
||||||
|
class network &use_y_2(bool use_y_2);
|
||||||
|
|
||||||
|
bool show_labels() const;
|
||||||
|
class network &show_labels(bool show_labels);
|
||||||
|
|
||||||
|
bool directed() const;
|
||||||
|
class network &directed(bool directed);
|
||||||
|
|
||||||
|
const std::vector<std::string> &edge_labels() const;
|
||||||
|
class network &edge_labels(const std::vector<std::string> &edge_labels);
|
||||||
|
|
||||||
|
template <class C>
|
||||||
|
network &edge_labels(const IterableValues<C> &e_labels) {
|
||||||
|
std::vector<std::string> str_labels;
|
||||||
|
std::stringstream ss;
|
||||||
|
ss.precision(10);
|
||||||
|
ss << std::fixed;
|
||||||
|
for (const auto &edge_label : e_labels) {
|
||||||
|
ss << "{/:Italic " << edge_label << " }";
|
||||||
|
str_labels.emplace_back(ss.str());
|
||||||
|
ss.str("");
|
||||||
|
}
|
||||||
|
edge_labels(str_labels);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::vector<std::string> &node_labels() const;
|
||||||
|
class network &node_labels(const std::vector<std::string> &node_labels);
|
||||||
|
|
||||||
|
template <class C>
|
||||||
|
network &node_labels(const IterableValues<C> &e_labels) {
|
||||||
|
std::vector<std::string> str_labels;
|
||||||
|
std::stringstream ss;
|
||||||
|
ss.precision(10);
|
||||||
|
ss << std::fixed;
|
||||||
|
for (const auto &edge_label : e_labels) {
|
||||||
|
ss << edge_label;
|
||||||
|
str_labels.emplace_back(ss.str());
|
||||||
|
ss.str("");
|
||||||
|
}
|
||||||
|
node_labels(str_labels);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::vector<double> &line_widths() const;
|
||||||
|
class network &line_widths(const std::vector<double> &line_widths);
|
||||||
|
|
||||||
|
const std::vector<std::pair<size_t, size_t>> &edges() const;
|
||||||
|
class network &
|
||||||
|
edges(const std::vector<std::pair<size_t, size_t>> &edges);
|
||||||
|
|
||||||
|
class network &n_vertices(size_t n_vertices);
|
||||||
|
|
||||||
|
const vector_1d &weights() const;
|
||||||
|
class network &weights(const vector_1d &weights);
|
||||||
|
|
||||||
|
layout layout_algorithm() const;
|
||||||
|
class network &layout_algorithm(layout layout_algorithm);
|
||||||
|
|
||||||
|
double layout_k() const;
|
||||||
|
class network &layout_k(double layout_k);
|
||||||
|
|
||||||
|
int layout_iterations() const;
|
||||||
|
class network &layout_iterations(int layout_iterations);
|
||||||
|
|
||||||
|
double energy_threshold() const;
|
||||||
|
class network &energy_threshold(double energy_threshold);
|
||||||
|
|
||||||
|
const std::vector<float> &marker_sizes() const;
|
||||||
|
class network &marker_sizes(const std::vector<float> &marker_sizes);
|
||||||
|
|
||||||
|
const std::vector<double> &marker_colors() const;
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
class network &visible(bool visible);
|
||||||
|
|
||||||
|
public /* getters and setters bypassing the line_spec */:
|
||||||
|
float line_width() const;
|
||||||
|
class network &line_width(float line_width);
|
||||||
|
|
||||||
|
enum line_spec::marker_style marker_style() const;
|
||||||
|
template <class T> network &marker_style(T marker_style) {
|
||||||
|
line_spec_.marker_style(marker_style);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum line_spec::marker_style marker() const;
|
||||||
|
template <class T> network &marker(T marker) {
|
||||||
|
line_spec_.marker(marker);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
float marker_size() const;
|
||||||
|
class network &marker_size(float size);
|
||||||
|
class network &marker_size(const std::vector<float> &size_vector);
|
||||||
|
class network &marker_size(const std::vector<double> &size_vector);
|
||||||
|
|
||||||
|
bool marker_face() const;
|
||||||
|
class network &marker_face(bool size);
|
||||||
|
|
||||||
|
const std::array<float, 4> &color() const;
|
||||||
|
template <class T> network &color(T c) {
|
||||||
|
line_spec().color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
inline class network &color(std::initializer_list<float> c) {
|
||||||
|
line_spec().color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::array<float, 4> &marker_color() const;
|
||||||
|
|
||||||
|
template <class T> network &marker_color(T c) {
|
||||||
|
line_spec().marker_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T> network &node_color(T c) {
|
||||||
|
marker_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class network &marker_color(std::initializer_list<float> c) {
|
||||||
|
line_spec().marker_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class network &marker_colors(const std::vector<double> &cs) {
|
||||||
|
marker_colors_ = cs;
|
||||||
|
touch();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::array<float, 4> &marker_face_color() const;
|
||||||
|
|
||||||
|
template <class T> network &marker_face_color(T c) {
|
||||||
|
line_spec().marker_face_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class network &
|
||||||
|
marker_face_color(std::initializer_list<float> c) {
|
||||||
|
line_spec().marker_face_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float marker_face_alpha() {
|
||||||
|
return line_spec().marker_face_alpha();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class network &marker_face_alpha(float a) {
|
||||||
|
line_spec().marker_face_alpha(a);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t n_vertices();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual std::vector<line_spec::style_to_plot> styles_to_plot();
|
||||||
|
void maybe_update_line_spec();
|
||||||
|
void maybe_update_graph_layout();
|
||||||
|
void infer_n_vertices();
|
||||||
|
void process_random_layout();
|
||||||
|
void process_force_layout();
|
||||||
|
void process_circle_layout();
|
||||||
|
void process_kawai_layout();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// Line style
|
||||||
|
class line_spec line_spec_;
|
||||||
|
|
||||||
|
/// Original graph
|
||||||
|
std::vector<std::pair<size_t, size_t>> edges_{};
|
||||||
|
/// The number of number is declared by the user or infered from the
|
||||||
|
/// edges
|
||||||
|
size_t n_vertices_{0};
|
||||||
|
/// Weight for each edge
|
||||||
|
vector_1d weights_{0};
|
||||||
|
|
||||||
|
/// True for directed graphs
|
||||||
|
bool directed_{false};
|
||||||
|
|
||||||
|
/// Data in the xlim
|
||||||
|
layout layout_algorithm_{layout::automatic};
|
||||||
|
double layout_k_ = -1.;
|
||||||
|
int layout_iterations_ = -1;
|
||||||
|
double energy_threshold_ = 1e-2;
|
||||||
|
std::vector<double> x_data_{};
|
||||||
|
std::vector<double> y_data_{};
|
||||||
|
std::vector<double> z_data_{};
|
||||||
|
|
||||||
|
/// Style
|
||||||
|
std::vector<float> marker_sizes_{};
|
||||||
|
std::vector<double> marker_colors_{};
|
||||||
|
bool show_labels_{true};
|
||||||
|
std::vector<std::string> edge_labels_{};
|
||||||
|
std::vector<std::string> node_labels_{};
|
||||||
|
std::vector<double> line_widths_{};
|
||||||
|
|
||||||
|
/// Use the y2 xlim
|
||||||
|
bool use_y2_{false};
|
||||||
|
|
||||||
|
/// True if visible
|
||||||
|
bool visible_{true};
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_NETWORK_H
|
||||||
81
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/parallel_lines.h
vendored
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 15/07/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_PARALLEL_LINES_H
|
||||||
|
#define MATPLOTPLUSPLUS_PARALLEL_LINES_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/axis_type.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
class MATPLOT_EXPORTS parallel_lines : public axes_object {
|
||||||
|
public:
|
||||||
|
explicit parallel_lines(class axes_type *parent);
|
||||||
|
parallel_lines(class axes_type *parent,
|
||||||
|
const std::vector<std::vector<double>> &data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
parallel_lines(const axes_handle &parent, Args&&... args)
|
||||||
|
: parallel_lines(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~parallel_lines() = default;
|
||||||
|
public /* mandatory virtual functions */:
|
||||||
|
std::string set_variables_string() override;
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string legend_string(std::string_view title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
std::string unset_variables_string() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* getters and setters */:
|
||||||
|
const matplot::line_spec &line_spec() const;
|
||||||
|
class parallel_lines &line_spec(const matplot::line_spec &line_spec);
|
||||||
|
|
||||||
|
const std::vector<std::vector<double>> &data() const;
|
||||||
|
class parallel_lines &
|
||||||
|
data(const std::vector<std::vector<double>> &data);
|
||||||
|
|
||||||
|
const std::vector<class axis_type> &axis() const;
|
||||||
|
std::vector<class axis_type> &axis();
|
||||||
|
class parallel_lines &axis(const std::vector<class axis_type> &axis);
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
class parallel_lines &visible(bool visible);
|
||||||
|
|
||||||
|
bool jitter() const;
|
||||||
|
class parallel_lines &jitter(bool jitter);
|
||||||
|
|
||||||
|
const std::vector<float> &line_widths() const;
|
||||||
|
class parallel_lines &
|
||||||
|
line_widths(const std::vector<float> &line_widths);
|
||||||
|
|
||||||
|
const std::vector<double> &line_colors() const;
|
||||||
|
class parallel_lines &
|
||||||
|
line_colors(const std::vector<double> &line_colors);
|
||||||
|
|
||||||
|
public /* getters and setters bypassing the line_spec */:
|
||||||
|
protected:
|
||||||
|
void maybe_update_line_spec();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
class line_spec line_spec_;
|
||||||
|
std::vector<std::vector<double>> data_{};
|
||||||
|
std::vector<class axis_type> axis_{};
|
||||||
|
std::vector<float> line_widths_{};
|
||||||
|
std::vector<double> line_colors_{};
|
||||||
|
bool jitter_{true};
|
||||||
|
bool visible_{true};
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_PARALLEL_LINES_H
|
||||||
66
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/stair.h
vendored
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 09/07/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_STAIR_H
|
||||||
|
#define MATPLOTPLUSPLUS_STAIR_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/axes_objects/line.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
|
||||||
|
class MATPLOT_EXPORTS stair : public line {
|
||||||
|
public:
|
||||||
|
enum class stair_style {
|
||||||
|
// trace change in x, then change in y
|
||||||
|
trace_x_first,
|
||||||
|
// trace change in y, then change in x
|
||||||
|
trace_y_first,
|
||||||
|
// histogram mode: trace
|
||||||
|
// (i) half change in x,
|
||||||
|
// (ii) then change in y,
|
||||||
|
// (iii) then half the change in x
|
||||||
|
histogram,
|
||||||
|
// fill change in x, then fill change in y
|
||||||
|
fill
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit stair(class axes_type *parent);
|
||||||
|
stair(class axes_type *parent, const std::vector<double> &y_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
stair(class axes_type *parent, const std::vector<double> &x_data,
|
||||||
|
const std::vector<double> &y_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
stair(const axes_handle &parent, Args&&... args)
|
||||||
|
: stair(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
public /* override the plotting function for stair */:
|
||||||
|
std::string plot_string() override;
|
||||||
|
// std::string data_string() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* methods for stair only */:
|
||||||
|
stair_style stair_style() const;
|
||||||
|
class stair &stair_style(enum stair_style stair_style);
|
||||||
|
|
||||||
|
bool fill() const;
|
||||||
|
class stair &fill(bool fill);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::vector<line_spec::style_to_plot> styles_to_plot() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
enum stair_style stair_style_ { stair_style::trace_x_first };
|
||||||
|
bool fill_{false};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_STAIR_H
|
||||||
45
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/string_function.h
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-06.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_STRING_FUNCTION_H
|
||||||
|
#define MATPLOTPLUSPLUS_STRING_FUNCTION_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/axes_objects/line.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class MATPLOT_EXPORTS string_function : public line {
|
||||||
|
public:
|
||||||
|
explicit string_function(class axes_type *parent);
|
||||||
|
string_function(class axes_type *parent, std::string_view equation,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
string_function(const axes_handle &parent, Args&&... args)
|
||||||
|
: string_function(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string data_string() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
const std::string &equation() const;
|
||||||
|
class string_function &equation(std::string_view equation);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string equation_;
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_STRING_FUNCTION_H
|
||||||
254
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/surface.h
vendored
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_SURFACE_H
|
||||||
|
#define MATPLOTPLUSPLUS_SURFACE_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/common.h>
|
||||||
|
#include <array>
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
|
||||||
|
/// Surfaces might include data for contours but, if you only want contours,
|
||||||
|
/// it's best to use the contour, contourf, fcontour functions to plot it in
|
||||||
|
/// 2d
|
||||||
|
class MATPLOT_EXPORTS surface : public axes_object {
|
||||||
|
public:
|
||||||
|
explicit surface(class axes_type *parent);
|
||||||
|
|
||||||
|
/// Grid surface
|
||||||
|
surface(class axes_type *parent, const vector_2d &X, const vector_2d &Y,
|
||||||
|
const vector_2d &Z, const vector_2d &C,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// Parametric surface
|
||||||
|
// surface(class xlim* parent, const vector_1d& x, const
|
||||||
|
// vector_1d& y, const vector_1d& z, const vector_1d& c, const
|
||||||
|
// std::string& line_spec = "");
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
surface(const axes_handle &parent, Args&&... args)
|
||||||
|
: surface(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~surface() = default;
|
||||||
|
public /* mandatory virtual functions */:
|
||||||
|
std::string set_variables_string() override;
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string legend_string(std::string_view title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* getters and setters */:
|
||||||
|
class surface &line_style(std::string_view line_spec);
|
||||||
|
|
||||||
|
const matplot::line_spec &line_spec() const;
|
||||||
|
matplot::line_spec &line_spec();
|
||||||
|
class surface &line_spec(const class line_spec &line_spec);
|
||||||
|
|
||||||
|
const vector_2d &Y_data() const;
|
||||||
|
class surface &Y_data(const vector_2d &Y_data);
|
||||||
|
|
||||||
|
const vector_2d &X_data() const;
|
||||||
|
class surface &X_data(const vector_2d &X_data);
|
||||||
|
|
||||||
|
const vector_2d &Z_data() const;
|
||||||
|
class surface &Z_data(const vector_2d &Z_data);
|
||||||
|
|
||||||
|
size_t norm() const;
|
||||||
|
class surface &norm(size_t norm);
|
||||||
|
|
||||||
|
const vector_2d &x_data() const;
|
||||||
|
class surface &x_data(const vector_2d &x_data);
|
||||||
|
|
||||||
|
const vector_2d &y_data() const;
|
||||||
|
class surface &y_data(const vector_2d &y_data);
|
||||||
|
|
||||||
|
const vector_2d &z_data() const;
|
||||||
|
class surface &z_data(const vector_2d &z_data);
|
||||||
|
|
||||||
|
bool hidden_3d() const;
|
||||||
|
class surface &hidden_3d(bool hidden_3_d);
|
||||||
|
|
||||||
|
bool surface_visible() const;
|
||||||
|
class surface &surface_visible(bool surface_visible);
|
||||||
|
|
||||||
|
bool surface_in_2d() const;
|
||||||
|
class surface &surface_in_2d(bool surface_in_2d);
|
||||||
|
|
||||||
|
bool palette_map_at_bottom() const;
|
||||||
|
class surface &palette_map_at_bottom(bool palette_map_at_bottom);
|
||||||
|
|
||||||
|
bool palette_map_at_surface() const;
|
||||||
|
class surface &palette_map_at_surface(bool palette_map_at_surface);
|
||||||
|
|
||||||
|
bool palette_map_at_top() const;
|
||||||
|
class surface &palette_map_at_top(bool palette_map_at_top);
|
||||||
|
|
||||||
|
bool contour_base() const;
|
||||||
|
class surface &contour_base(bool contour_base);
|
||||||
|
|
||||||
|
bool contour_surface() const;
|
||||||
|
class surface &contour_surface(bool contour_surface);
|
||||||
|
|
||||||
|
size_t contour_levels() const;
|
||||||
|
class surface &contour_levels(size_t contour_levels);
|
||||||
|
|
||||||
|
const std::vector<double> &contour_values() const;
|
||||||
|
class surface &
|
||||||
|
contour_values(const std::vector<double> &contour_values);
|
||||||
|
|
||||||
|
bool contour_text() const;
|
||||||
|
class surface &contour_text(bool contour_text);
|
||||||
|
|
||||||
|
float font_size() const;
|
||||||
|
class surface &font_size(const float &font_size);
|
||||||
|
|
||||||
|
const std::string font() const;
|
||||||
|
class surface &font(std::string_view font);
|
||||||
|
|
||||||
|
const std::string &font_weight() const;
|
||||||
|
class surface &font_weight(std::string_view font_weight);
|
||||||
|
|
||||||
|
const color_array &font_color() const;
|
||||||
|
class surface &font_color(const color_array &font_color);
|
||||||
|
class surface &font_color(std::string_view font_color);
|
||||||
|
|
||||||
|
bool depthorder() const;
|
||||||
|
|
||||||
|
class surface &depthorder(bool depthorder);
|
||||||
|
|
||||||
|
float face_alpha() const;
|
||||||
|
class surface &face_alpha(float face_alpha);
|
||||||
|
|
||||||
|
bool lighting() const;
|
||||||
|
class surface &lighting(bool lighting);
|
||||||
|
|
||||||
|
float primary() const;
|
||||||
|
class surface &primary(float amount);
|
||||||
|
|
||||||
|
float specular() const;
|
||||||
|
class surface &specular(float amount);
|
||||||
|
|
||||||
|
const class line_spec &contour_line_spec() const;
|
||||||
|
class line_spec &contour_line_spec();
|
||||||
|
class surface &
|
||||||
|
contour_line_spec(const class line_spec &contour_line_spec);
|
||||||
|
|
||||||
|
bool curtain() const;
|
||||||
|
class surface &curtain(bool curtain);
|
||||||
|
|
||||||
|
bool waterfall() const;
|
||||||
|
class surface &waterfall(bool waterfall);
|
||||||
|
|
||||||
|
bool fences() const;
|
||||||
|
class surface &fences(bool fences);
|
||||||
|
|
||||||
|
bool ribbons() const;
|
||||||
|
class surface &ribbons(bool ribbons);
|
||||||
|
|
||||||
|
double ribbon_width() const;
|
||||||
|
class surface &ribbon_width(double ribbon_width);
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
class surface &visible(bool visible);
|
||||||
|
|
||||||
|
public /* getters and setters bypassing the line_spec */:
|
||||||
|
float line_width() const;
|
||||||
|
class surface &line_width(float line_width);
|
||||||
|
|
||||||
|
const std::array<float, 4> &edge_color() const;
|
||||||
|
|
||||||
|
template <class T> surface &edge_color(T c) {
|
||||||
|
line_spec().color(c);
|
||||||
|
touch();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class surface &edge_color(std::initializer_list<float> c) {
|
||||||
|
line_spec().color(c);
|
||||||
|
touch();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
double zmin() override;
|
||||||
|
double zmax() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void maybe_update_line_spec();
|
||||||
|
std::string grid_data_string();
|
||||||
|
std::string ribbon_data_string();
|
||||||
|
size_t create_line_index();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// Data in the xlim
|
||||||
|
vector_2d X_data_{};
|
||||||
|
vector_2d Y_data_{};
|
||||||
|
vector_2d Z_data_{};
|
||||||
|
vector_2d C_data_{};
|
||||||
|
|
||||||
|
/// Interpret data as a flat array of parametrics values
|
||||||
|
/// If false, data needs to represent a grid
|
||||||
|
/// If true, data represents a free form
|
||||||
|
bool is_parametric_{false};
|
||||||
|
|
||||||
|
/// Preprocess zmin / zmax
|
||||||
|
double zmin_{NaN};
|
||||||
|
double zmax_{NaN};
|
||||||
|
|
||||||
|
/// Style
|
||||||
|
size_t norm_{2};
|
||||||
|
bool hidden3d_{false};
|
||||||
|
bool depthorder_{false};
|
||||||
|
float face_alpha_{.95f};
|
||||||
|
class line_spec line_spec_;
|
||||||
|
bool lighting_{false};
|
||||||
|
float primary_{-1.};
|
||||||
|
float specular_{-1.};
|
||||||
|
bool curtain_{false};
|
||||||
|
bool waterfall_{false};
|
||||||
|
bool fences_{false};
|
||||||
|
bool ribbons_{false};
|
||||||
|
double ribbon_width_{0.75};
|
||||||
|
|
||||||
|
// Line surface
|
||||||
|
bool surface_visible_{true};
|
||||||
|
bool surface_in_2d_{false};
|
||||||
|
|
||||||
|
// Solid surface
|
||||||
|
bool palette_map_at_bottom_{false};
|
||||||
|
bool palette_map_at_surface_{true};
|
||||||
|
bool palette_map_at_top_{false};
|
||||||
|
|
||||||
|
class line_spec contour_line_spec_;
|
||||||
|
bool contour_base_{false};
|
||||||
|
bool contour_surface_{false};
|
||||||
|
size_t contour_levels_{9};
|
||||||
|
std::vector<double> contour_values_{};
|
||||||
|
|
||||||
|
bool contour_text_{false};
|
||||||
|
std::optional<float> font_size_{std::nullopt};
|
||||||
|
std::optional<std::string> font_{std::nullopt};
|
||||||
|
std::string font_weight_{"normal"};
|
||||||
|
color_array font_color_{0, 0, 0, 0};
|
||||||
|
|
||||||
|
/// True if visible
|
||||||
|
bool visible_{true};
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_SURFACE_H
|
||||||
258
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/axes_objects/vectors.h
vendored
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_VECTORS_H
|
||||||
|
#define MATPLOTPLUSPLUS_VECTORS_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <matplot/core/axes_object.h>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
class MATPLOT_EXPORTS vectors : public axes_object {
|
||||||
|
public:
|
||||||
|
/// \brief Create empty vectors
|
||||||
|
explicit vectors(class axes_type *parent);
|
||||||
|
|
||||||
|
/// \brief Create 2D vectors with fixed origin and incremental u
|
||||||
|
/// Origin xy = (0,0), u = {1,...n}, v = {v_data}
|
||||||
|
vectors(class axes_type *parent, const std::vector<double> &v_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// \brief Create 2D vectors with fixed origin
|
||||||
|
/// Origin xy = (0,0), u = {u_data}, v = {v_data}
|
||||||
|
vectors(class axes_type *parent, const std::vector<double> &u_data,
|
||||||
|
const std::vector<double> &v_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// \brief Create 3D vectors with fixed origin
|
||||||
|
/// Origin xy = (0,0,0), u = {u_data}, v = {v_data}, w = {w_data}
|
||||||
|
vectors(class axes_type *parent, const std::vector<double> &u_data,
|
||||||
|
const std::vector<double> &v_data,
|
||||||
|
const std::vector<double> &w_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// \brief Create 2D vectors with custom origin
|
||||||
|
vectors(class axes_type *parent, const std::vector<double> &x_data,
|
||||||
|
const std::vector<double> &y_data,
|
||||||
|
const std::vector<double> &u_data,
|
||||||
|
const std::vector<double> &v_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// \brief Create 2D vectors with custom origin and colors
|
||||||
|
vectors(class axes_type *parent, const std::vector<double> &x_data,
|
||||||
|
const std::vector<double> &y_data,
|
||||||
|
const std::vector<double> &u_data,
|
||||||
|
const std::vector<double> &v_data,
|
||||||
|
const std::vector<double> &c_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// \brief Create 3D vectors with custom origin
|
||||||
|
vectors(class axes_type *parent, const std::vector<double> &x_data,
|
||||||
|
const std::vector<double> &y_data,
|
||||||
|
const std::vector<double> &z_data,
|
||||||
|
const std::vector<double> &u_data,
|
||||||
|
const std::vector<double> &v_data,
|
||||||
|
const std::vector<double> &w_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// \brief Create 3D vectors with custom origin and colors
|
||||||
|
vectors(class axes_type *parent, const std::vector<double> &x_data,
|
||||||
|
const std::vector<double> &y_data,
|
||||||
|
const std::vector<double> &z_data,
|
||||||
|
const std::vector<double> &u_data,
|
||||||
|
const std::vector<double> &v_data,
|
||||||
|
const std::vector<double> &w_data,
|
||||||
|
const std::vector<double> &c_data,
|
||||||
|
std::string_view line_spec = "");
|
||||||
|
|
||||||
|
/// If we receive an axes_handle, we can convert it to a raw
|
||||||
|
/// pointer because there is no ownership involved here
|
||||||
|
template <class... Args>
|
||||||
|
vectors(const axes_handle &parent, Args &&...args)
|
||||||
|
: vectors(parent.get(), std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
|
virtual ~vectors() = default;
|
||||||
|
public /* mandatory virtual functions */:
|
||||||
|
std::string plot_string() override;
|
||||||
|
std::string legend_string(std::string_view title) override;
|
||||||
|
std::string data_string() override;
|
||||||
|
double xmax() override;
|
||||||
|
double xmin() override;
|
||||||
|
double ymax() override;
|
||||||
|
double ymin() override;
|
||||||
|
enum axes_object::axes_category axes_category() override;
|
||||||
|
|
||||||
|
public /* getters and setters */:
|
||||||
|
class vectors &line_style(std::string_view line_spec);
|
||||||
|
|
||||||
|
const matplot::line_spec &line_spec() const;
|
||||||
|
matplot::line_spec &line_spec();
|
||||||
|
class vectors &line_spec(const class line_spec &line_spec);
|
||||||
|
|
||||||
|
const std::vector<double> &y_data() const;
|
||||||
|
class vectors &y_data(const std::vector<double> &y_data);
|
||||||
|
|
||||||
|
const std::vector<double> &x_data() const;
|
||||||
|
class vectors &x_data(const std::vector<double> &x_data);
|
||||||
|
|
||||||
|
const std::vector<double> &z_data() const;
|
||||||
|
class vectors &z_data(const std::vector<double> &z_data);
|
||||||
|
|
||||||
|
const std::vector<size_t> &marker_indices() const;
|
||||||
|
class vectors &
|
||||||
|
marker_indices(const std::vector<size_t> &marker_indices);
|
||||||
|
|
||||||
|
bool use_y2() const;
|
||||||
|
class vectors &use_y2(bool use_y_2);
|
||||||
|
|
||||||
|
bool impulse() const;
|
||||||
|
class vectors &impulse(bool impulse);
|
||||||
|
|
||||||
|
bool fill() const;
|
||||||
|
class vectors &fill(bool fill);
|
||||||
|
|
||||||
|
bool use_y_2() const;
|
||||||
|
class vectors &use_y_2(bool use_y_2);
|
||||||
|
|
||||||
|
bool polar() const;
|
||||||
|
class vectors &polar(bool polar);
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
class vectors &visible(bool visible);
|
||||||
|
|
||||||
|
bool normalize() const;
|
||||||
|
class vectors &normalize(bool normalize);
|
||||||
|
|
||||||
|
double scale() const;
|
||||||
|
class vectors &scale(double scale);
|
||||||
|
|
||||||
|
public /* getters and setters bypassing the line_spec */:
|
||||||
|
float line_width() const;
|
||||||
|
class vectors &line_width(float line_width);
|
||||||
|
|
||||||
|
enum line_spec::marker_style marker_style() const;
|
||||||
|
template <class T> vectors &marker_style(T marker_style) {
|
||||||
|
line_spec_.marker_style(marker_style);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum line_spec::marker_style marker() const;
|
||||||
|
template <class T> vectors &marker(T marker) {
|
||||||
|
line_spec_.marker(marker);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
float marker_size() const;
|
||||||
|
class vectors &marker_size(float size);
|
||||||
|
class vectors &marker_size(const std::vector<float> &size_vector);
|
||||||
|
class vectors &marker_size(const std::vector<double> &size_vector);
|
||||||
|
|
||||||
|
bool marker_face() const;
|
||||||
|
class vectors &marker_face(bool size);
|
||||||
|
|
||||||
|
const std::array<float, 4> &color() const;
|
||||||
|
template <class T> vectors &color(T c) {
|
||||||
|
line_spec().color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
inline class vectors &color(std::initializer_list<float> c) {
|
||||||
|
line_spec().color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::array<float, 4> &marker_color() const;
|
||||||
|
|
||||||
|
template <class T> vectors &marker_color(T c) {
|
||||||
|
line_spec().marker_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class vectors &marker_color(std::initializer_list<float> c) {
|
||||||
|
line_spec().marker_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class vectors &marker_colors(const std::vector<double> &cs) {
|
||||||
|
marker_colors_ = cs;
|
||||||
|
touch();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::array<float, 4> &marker_face_color() const;
|
||||||
|
|
||||||
|
template <class T> vectors &marker_face_color(T c) {
|
||||||
|
line_spec().marker_face_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class vectors &
|
||||||
|
marker_face_color(std::initializer_list<float> c) {
|
||||||
|
line_spec().marker_face_color(c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float marker_face_alpha() {
|
||||||
|
return line_spec().marker_face_alpha();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class vectors &marker_face_alpha(float a) {
|
||||||
|
line_spec().marker_face_alpha(a);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void maybe_update_line_spec();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// Line style
|
||||||
|
class line_spec line_spec_;
|
||||||
|
|
||||||
|
/// Vector origins
|
||||||
|
std::vector<double> y_data_{};
|
||||||
|
std::vector<double> x_data_{};
|
||||||
|
std::vector<double> z_data_{};
|
||||||
|
|
||||||
|
/// Vector components
|
||||||
|
std::vector<double> u_data_{};
|
||||||
|
std::vector<double> v_data_{};
|
||||||
|
std::vector<double> w_data_{};
|
||||||
|
|
||||||
|
/// Vector color mapping values
|
||||||
|
std::vector<double> c_data_{};
|
||||||
|
|
||||||
|
/// Positions at which we want markers to appear
|
||||||
|
std::vector<size_t> marker_indices_{};
|
||||||
|
std::vector<float> marker_sizes_{};
|
||||||
|
std::vector<double> marker_colors_{};
|
||||||
|
|
||||||
|
/// Scale of vectors
|
||||||
|
double scale_{1};
|
||||||
|
|
||||||
|
/// Draw line as impulse
|
||||||
|
bool impulse_{false};
|
||||||
|
|
||||||
|
/// Draw line as filled area
|
||||||
|
bool fill_{false};
|
||||||
|
|
||||||
|
/// Use the y2 xlim
|
||||||
|
bool use_y2_{false};
|
||||||
|
|
||||||
|
/// This line is meant for a polar plot
|
||||||
|
bool polar_{false};
|
||||||
|
|
||||||
|
/// True if visible
|
||||||
|
bool visible_{true};
|
||||||
|
|
||||||
|
/// True if vectors are normalized
|
||||||
|
bool normalize_{false};
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_VECTORS_H
|
||||||
222
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/backend/backend_interface.h
vendored
Normal file
@ -0,0 +1,222 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 26/08/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_BACKEND_INTERFACE_H
|
||||||
|
#define MATPLOTPLUSPLUS_BACKEND_INTERFACE_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class figure_type;
|
||||||
|
namespace backend {
|
||||||
|
/// Inherit from this class to create a new backend
|
||||||
|
/// - Interactive backends show the plots on a window
|
||||||
|
/// - Non-interactive backends save the plots to a file
|
||||||
|
/// - The only backend for which we currently provide a
|
||||||
|
/// concrete implementation is gnuplot pipes. A gnuplot
|
||||||
|
/// pipe can be an interactive or non-interactive depending
|
||||||
|
/// on the terminal.
|
||||||
|
/// - Unfortunately, backends based on gnuplot terminals
|
||||||
|
/// need to be treated differently because they consume
|
||||||
|
/// commands rather vertices. It might be technically
|
||||||
|
/// possible to come up with a workaround to make gnuplot
|
||||||
|
/// plot each vertex but this is definitely not worth it.
|
||||||
|
/// - The interface for backends that expect lists of
|
||||||
|
/// vertices to draw are somewhat inspired in ImGui backends
|
||||||
|
/// and Matplotlib backends. You can see some examples at:
|
||||||
|
/// https://github.com/matplotlib/matplotlib/blob/master/src/_backend_agg.h
|
||||||
|
/// https://github.com/ocornut/imgui/tree/master/examples
|
||||||
|
/// - If implementing such an interface, the functions
|
||||||
|
/// for gnuplot pipes should just be ignored.
|
||||||
|
/// - These are placeholders with no concrete implementation.
|
||||||
|
/// We still need to define the functions that generate vertices
|
||||||
|
/// in the classes that inherit from axes_object, and these
|
||||||
|
/// functions in the interface are likely to change as we
|
||||||
|
/// need. A good place to start is probably the line object,
|
||||||
|
/// which is fundamental for most plots.
|
||||||
|
class MATPLOT_EXPORTS backend_interface {
|
||||||
|
/// Virtual functions you can override to create any backend
|
||||||
|
public:
|
||||||
|
virtual ~backend_interface() noexcept = default;
|
||||||
|
/// \brief True if backend is in interactive mode
|
||||||
|
/// One backends might support both interactive and
|
||||||
|
/// non-interactive mode.
|
||||||
|
/// For instance, the gnuplot backend can support
|
||||||
|
/// both modes by changing its terminal.
|
||||||
|
/// It is also possible to export the OpenGL state
|
||||||
|
/// as an image with the glReadPixels function.
|
||||||
|
/// You can combine glReadPixels with CImg
|
||||||
|
/// to export the image in a variety of formats.
|
||||||
|
/// To export vector graphics from OpenGL,
|
||||||
|
/// libraries such as http://www.geuz.org/gl2ps/
|
||||||
|
/// can be used.
|
||||||
|
virtual bool is_interactive();
|
||||||
|
|
||||||
|
/// \brief If non-interactive, get the file where we should output
|
||||||
|
/// our data
|
||||||
|
virtual const std::string &output();
|
||||||
|
|
||||||
|
/// \brief If non-interactive, get the format in which we should
|
||||||
|
/// output our data
|
||||||
|
virtual const std::string &output_format();
|
||||||
|
|
||||||
|
/// \brief If non-interactive, set the file where we should output
|
||||||
|
/// our data This function can use the file extension to
|
||||||
|
/// automatically set the output format
|
||||||
|
virtual bool output(const std::string &filename);
|
||||||
|
|
||||||
|
/// \brief If non-interactive, set the file and the file format for
|
||||||
|
/// outputting data
|
||||||
|
virtual bool output(const std::string &filename,
|
||||||
|
const std::string &file_format);
|
||||||
|
|
||||||
|
/// Get the current width
|
||||||
|
/// The user might have changed the image width manually.
|
||||||
|
/// Matplot++ needs to be aware of that.
|
||||||
|
virtual unsigned int width();
|
||||||
|
|
||||||
|
/// \brief Get height
|
||||||
|
virtual unsigned int height();
|
||||||
|
|
||||||
|
/// \brief Set width
|
||||||
|
/// For when the user programmatically sets the width
|
||||||
|
virtual void width(unsigned int new_width);
|
||||||
|
|
||||||
|
/// \brief Set height
|
||||||
|
virtual void height(unsigned int new_height);
|
||||||
|
|
||||||
|
/// \brief Get the current position_x (for interactive backends)
|
||||||
|
/// The user might have changed the image position_x manually.
|
||||||
|
/// Matplot++ needs to be aware of that.
|
||||||
|
virtual unsigned int position_x();
|
||||||
|
|
||||||
|
/// \brief Get position_y (for interactive backends)
|
||||||
|
virtual unsigned int position_y();
|
||||||
|
|
||||||
|
/// \brief Set position_x (for interactive backends)
|
||||||
|
/// For when the user programmatically sets the position_x
|
||||||
|
virtual void position_x(unsigned int new_position_x);
|
||||||
|
|
||||||
|
/// \brief Set position_y (for interactive backends)
|
||||||
|
virtual void position_y(unsigned int new_position_y);
|
||||||
|
|
||||||
|
/// \brief Set window title
|
||||||
|
virtual void window_title(const std::string& title);
|
||||||
|
|
||||||
|
/// \brief Get window title
|
||||||
|
virtual std::string window_title();
|
||||||
|
|
||||||
|
/// \brief Tell the backend we are about to draw a new image
|
||||||
|
/// The backend might reject starting this new image
|
||||||
|
/// For instance, the user already closed the window
|
||||||
|
/// and there's no point in feeding commands to the backend
|
||||||
|
virtual bool new_frame();
|
||||||
|
|
||||||
|
/// \brief Tell the backend this new image is over
|
||||||
|
/// The backend is free to plot whatever it's been
|
||||||
|
/// buffering
|
||||||
|
/// \return True if everything is ok
|
||||||
|
virtual bool render_data();
|
||||||
|
|
||||||
|
/// \brief Tell the backend to wait for user interaction
|
||||||
|
/// Until then, the backend should block execution if possible
|
||||||
|
/// Figures use this in the show function
|
||||||
|
virtual void show(matplot::figure_type *);
|
||||||
|
|
||||||
|
/// \brief True if the user requested to close the window
|
||||||
|
/// This function allows the backend to send a signal
|
||||||
|
/// indicating the user has asked to close the window
|
||||||
|
virtual bool should_close();
|
||||||
|
|
||||||
|
/// \brief True if the backend supports fonts
|
||||||
|
/// We can avoid some commands if it doesn't
|
||||||
|
virtual bool supports_fonts();
|
||||||
|
|
||||||
|
/// Public functions you need to override to create a new
|
||||||
|
/// backend based on vertices, such as OpenGL, Agg, etc...
|
||||||
|
/// These functions are likely to change as we come up
|
||||||
|
/// with concrete implementations based on vertices.
|
||||||
|
/// \see
|
||||||
|
/// https://github.com/matplotlib/matplotlib/blob/master/src/_backend_agg.h
|
||||||
|
/// \see https://github.com/ocornut/imgui/tree/master/examples
|
||||||
|
public:
|
||||||
|
/// \brief Draws background on the image
|
||||||
|
virtual void draw_background(const std::array<float, 4> &color);
|
||||||
|
|
||||||
|
/// \brief Draws rectangle on the image
|
||||||
|
virtual void draw_rectangle(const double x1, const double x2,
|
||||||
|
const double y1, const double y2,
|
||||||
|
const std::array<float, 4> &color);
|
||||||
|
|
||||||
|
/// \brief Draw a path on the image
|
||||||
|
/// Many backends will require the path to be floats
|
||||||
|
/// but Matplot++ words with doubles, so it's up to
|
||||||
|
/// the backend to implement this conversion however
|
||||||
|
/// it seems more efficient
|
||||||
|
virtual void draw_path(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::array<float, 4> &color);
|
||||||
|
|
||||||
|
/// \brief Draw markers on the image
|
||||||
|
virtual void draw_markers(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<double> &z = {});
|
||||||
|
|
||||||
|
/// \brief Draw text on the image
|
||||||
|
virtual void draw_text(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<double> &z = {});
|
||||||
|
|
||||||
|
/// \brief Draw image matrix on the image
|
||||||
|
virtual void
|
||||||
|
draw_image(const std::vector<std::vector<double>> &x,
|
||||||
|
const std::vector<std::vector<double>> &y,
|
||||||
|
const std::vector<std::vector<double>> &z = {});
|
||||||
|
|
||||||
|
/// \brief Draw rectangle on the image
|
||||||
|
virtual void draw_triangle(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<double> &z = {});
|
||||||
|
|
||||||
|
/// We can certainly include more functions here, such as
|
||||||
|
/// draw_mesh, draw_rectangle, etc...
|
||||||
|
/// However, these functions should have a default implementation
|
||||||
|
/// that would recur to more primitive functions.
|
||||||
|
/// For instance, draw_rectangle should have a default
|
||||||
|
/// implementation to draw a rectangle based on two calls to
|
||||||
|
/// draw_triangle (for filled rectangles) or an implementation based
|
||||||
|
/// on draw_path (for unfilled rectangles). Otherwise, it would be
|
||||||
|
/// very expensive to start a new backend. These function should be
|
||||||
|
/// complementary functions that would be used to improve
|
||||||
|
/// performance on existing backends.
|
||||||
|
|
||||||
|
/// Public functions you need to override only if your backend
|
||||||
|
/// is based on gnuplot
|
||||||
|
/// If not, just leave it as it is and the default implementations
|
||||||
|
/// should do just fine.
|
||||||
|
public:
|
||||||
|
/// \brief If true, this backend does not work by consuming vertices
|
||||||
|
/// Most functions above will be ignored.
|
||||||
|
/// The figure object will send gnuplot commands to this backend
|
||||||
|
/// instead of vertices.
|
||||||
|
/// The default implementation returns false.
|
||||||
|
virtual bool consumes_gnuplot_commands();
|
||||||
|
|
||||||
|
/// \brief Send line and newline to gnu plot pipe and flush
|
||||||
|
/// We can buffer the lines until the end of data is sent
|
||||||
|
virtual void run_command(const std::string &text);
|
||||||
|
|
||||||
|
/// \brief Include a comment in the gnuplot code
|
||||||
|
/// This is useful when tracing the gnuplot commands
|
||||||
|
/// and when generating a gnuplot file.
|
||||||
|
virtual void include_comment(const std::string &text);
|
||||||
|
}; // class backend_interface
|
||||||
|
} // namespace backend
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_BACKEND_INTERFACE_H
|
||||||
33
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/backend/backend_registry.h
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 26/08/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_BACKEND_REGISTRY_H
|
||||||
|
#define MATPLOTPLUSPLUS_BACKEND_REGISTRY_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/backend/backend_interface.h>
|
||||||
|
#include <matplot/backend/gnuplot.h>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
template <class BACKEND_TYPE, class ... Args>
|
||||||
|
std::shared_ptr<backend::backend_interface> create_backend(Args&&... args) {
|
||||||
|
if constexpr (std::is_base_of_v<backend::backend_interface,
|
||||||
|
BACKEND_TYPE>) {
|
||||||
|
std::shared_ptr<BACKEND_TYPE> dp = std::make_shared<BACKEND_TYPE>(std::forward<Args>(args)...);
|
||||||
|
std::shared_ptr<backend::backend_interface> bp =
|
||||||
|
std::dynamic_pointer_cast<backend::backend_interface>(dp);
|
||||||
|
return bp;
|
||||||
|
} else {
|
||||||
|
throw std::invalid_argument(
|
||||||
|
std::string("The class ") + typeid(BACKEND_TYPE).name() +
|
||||||
|
" does not derive from backend::backend_interface");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::shared_ptr<backend::backend_interface> create_default_backend();
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_BACKEND_REGISTRY_H
|
||||||
145
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/backend/gnuplot.h
vendored
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 26/08/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_BACKEND_GNUPLOT_H
|
||||||
|
#define MATPLOTPLUSPLUS_BACKEND_GNUPLOT_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/backend/backend_interface.h>
|
||||||
|
#include <matplot/util/popen.h>
|
||||||
|
#include <array>
|
||||||
|
#include <chrono>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
namespace matplot::backend {
|
||||||
|
class MATPLOT_EXPORTS gnuplot : public backend_interface {
|
||||||
|
public:
|
||||||
|
gnuplot();
|
||||||
|
virtual ~gnuplot();
|
||||||
|
bool is_interactive() override;
|
||||||
|
const std::string &output() override;
|
||||||
|
const std::string &output_format() override;
|
||||||
|
bool output(const std::string &filename) override;
|
||||||
|
bool output(const std::string &filename,
|
||||||
|
const std::string &file_format) override;
|
||||||
|
unsigned int width() override;
|
||||||
|
unsigned int height() override;
|
||||||
|
unsigned int position_x() override;
|
||||||
|
unsigned int position_y() override;
|
||||||
|
void position_x(unsigned int new_position_x) override;
|
||||||
|
void position_y(unsigned int new_position_y) override;
|
||||||
|
void width(unsigned int new_width) override;
|
||||||
|
void height(unsigned int new_height) override;
|
||||||
|
bool new_frame() override;
|
||||||
|
bool render_data() override;
|
||||||
|
bool supports_fonts() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool consumes_gnuplot_commands() override;
|
||||||
|
void run_command(const std::string &command) override;
|
||||||
|
void include_comment(const std::string &comment) override;
|
||||||
|
|
||||||
|
public /* gnuplot pipe functions */:
|
||||||
|
/// We "render the data" by flushing the commands
|
||||||
|
bool flush_commands();
|
||||||
|
|
||||||
|
/// Identify the default terminal type in the system
|
||||||
|
static std::string default_terminal_type();
|
||||||
|
static bool terminal_is_available(std::string_view);
|
||||||
|
static std::tuple<int, int, int> gnuplot_version();
|
||||||
|
static bool gnuplot_includes_legends();
|
||||||
|
static bool gnuplot_has_wall_option();
|
||||||
|
static bool gnuplot_supports_keyentry();
|
||||||
|
static bool terminal_has_title_option(const std::string &t);
|
||||||
|
static bool terminal_has_size_option(const std::string &t);
|
||||||
|
static bool terminal_has_position_option(const std::string &t);
|
||||||
|
static bool terminal_has_enhanced_option(const std::string &t);
|
||||||
|
static bool terminal_has_color_option(const std::string &t);
|
||||||
|
static bool terminal_has_font_option(const std::string &t);
|
||||||
|
|
||||||
|
public: /* gnuplot pipe constexprs */
|
||||||
|
// True if the windows persist after closing the program
|
||||||
|
// False by default because this is VERY annoying in
|
||||||
|
// some repetitive tasks involving lots of plots
|
||||||
|
// You can change the default here or run the command
|
||||||
|
// set terminal "name" persist
|
||||||
|
static constexpr bool windows_should_persist_by_default = false;
|
||||||
|
|
||||||
|
// True if we should wait at least 5 seconds after the last
|
||||||
|
// flush to close gnuplot
|
||||||
|
static constexpr bool dont_let_it_close_too_fast = false;
|
||||||
|
|
||||||
|
// True if we allow to use the mouse interactively in the window
|
||||||
|
// Most of the time, this is just annoying when we scroll without
|
||||||
|
// meaning to It is very very hard to use the mouse properly
|
||||||
|
// http://www.gnuplot.info/files/gpReadMouseTest.c
|
||||||
|
static constexpr bool allow_using_mouse = true;
|
||||||
|
|
||||||
|
#if defined(MATPLOT_TRACE_GNUPLOT_COMMANDS) && \
|
||||||
|
!defined(MATPLOT_BUILD_FOR_DOCUMENTATION_IMAGES)
|
||||||
|
static constexpr bool trace_commands = true;
|
||||||
|
#else
|
||||||
|
static constexpr bool trace_commands = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static constexpr size_t pipe_capacity_worst_case = BUFSIZ;
|
||||||
|
/// File formats for figures and properties of terminals
|
||||||
|
static constexpr std::array<
|
||||||
|
std::pair<std::string_view, std::string_view>, 33>
|
||||||
|
extension_terminal() {
|
||||||
|
return std::array<std::pair<std::string_view, std::string_view>,
|
||||||
|
33>{
|
||||||
|
std::pair{".html", "canvas"}, std::pair{".cgm", "cgm"},
|
||||||
|
std::pair{".txt", "dumb"}, std::pair{".md", "dumb"},
|
||||||
|
std::pair{".dxf", "dxf"}, std::pair{".emf", "emf"},
|
||||||
|
// std::pair{".emtex", "emtex"},
|
||||||
|
std::pair{".eps", "postscript"}, std::pair{".eps", "epscairo"},
|
||||||
|
std::pair{".eps", "epslatex"}, std::pair{".gif", "gif"},
|
||||||
|
std::pair{".hpgl", "hpgl"}, std::pair{".jpeg", "jpeg"},
|
||||||
|
std::pair{".jpg", "jpeg"}, std::pair{".tex", "epslatex"},
|
||||||
|
std::pair{".mf", "mf"}, std::pair{".mp", "mp"},
|
||||||
|
std::pair{".pcl5", "pcl5"}, std::pair{".pdf", "pdf"},
|
||||||
|
std::pair{".pdf", "pdfcairo"}, std::pair{".png", "pngcairo"},
|
||||||
|
std::pair{".png", "png"}, std::pair{".tex", "pslatex"},
|
||||||
|
std::pair{".tex", "context"}, std::pair{".tex", "texdraw"},
|
||||||
|
std::pair{".tex", "tikz"},
|
||||||
|
// std::pair{".tex", "eepic"},
|
||||||
|
// std::pair{".tex", "tpic"},
|
||||||
|
std::pair{".pstex", "pstex"},
|
||||||
|
std::pair{".pstricks", "pstricks"},
|
||||||
|
// std::pair{".qms", "qms"},
|
||||||
|
std::pair{".sixel", "sixelgd"}, std::pair{".svg", "svg"},
|
||||||
|
std::pair{".tek40xx", "tek40xx"},
|
||||||
|
std::pair{".tek410x", "tek410x"},
|
||||||
|
// std::pair{".tgif", "tgif"},
|
||||||
|
std::pair{".tkcanvas", "tkcanvas"},
|
||||||
|
// std::pair{".tpic", "tpic"},
|
||||||
|
std::pair{".vttek", "vttek"}};
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Process pipe to gnuplot
|
||||||
|
opipe pipe_;
|
||||||
|
|
||||||
|
// How many bytes we put in the pipe
|
||||||
|
size_t bytes_in_pipe_{0};
|
||||||
|
|
||||||
|
// Current gnuplot terminal we should
|
||||||
|
std::string terminal_{"qt"};
|
||||||
|
|
||||||
|
// Position and size
|
||||||
|
std::array<unsigned, 4> position_{680, 558, 560, 420};
|
||||||
|
|
||||||
|
// Time we last flush, to avoid flushing results too fast
|
||||||
|
std::chrono::high_resolution_clock::time_point last_flush_;
|
||||||
|
|
||||||
|
// File output, if non-interactive
|
||||||
|
std::string output_{};
|
||||||
|
|
||||||
|
// Whether we should include comments in the commands
|
||||||
|
bool include_comments_ = trace_commands;
|
||||||
|
};
|
||||||
|
} // namespace matplot::backend
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_BACKEND_GNUPLOT_H
|
||||||
40
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/backend/opengl.h
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 26/08/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_OPENGL_H
|
||||||
|
#define MATPLOTPLUSPLUS_OPENGL_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/backend/opengl_embed.h>
|
||||||
|
#include <mutex>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
namespace matplot::backend {
|
||||||
|
class MATPLOT_EXPORTS opengl : public opengl_embed {
|
||||||
|
public:
|
||||||
|
opengl();
|
||||||
|
~opengl();
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool new_frame() override;
|
||||||
|
bool render_data() override;
|
||||||
|
void show(matplot::figure_type *) override;
|
||||||
|
bool should_close() override;
|
||||||
|
void window_title(const std::string& title) override;
|
||||||
|
std::string window_title() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static constexpr unsigned int default_screen_width = 560;
|
||||||
|
static constexpr unsigned int default_screen_height = 420;
|
||||||
|
static void initialize_glfw();
|
||||||
|
static double get_time();
|
||||||
|
private:
|
||||||
|
GLFWwindow *window_;
|
||||||
|
std::string window_title_;
|
||||||
|
std::mutex this_window_in_context_;
|
||||||
|
static bool glfw_is_initialized;
|
||||||
|
};
|
||||||
|
} // namespace matplot::backend
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_OPENGL_H
|
||||||
112
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/backend/opengl_embed.h
vendored
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 26/08/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_OPENGL_EMBED_H
|
||||||
|
#define MATPLOTPLUSPLUS_OPENGL_EMBED_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
/* Defined before OpenGL and GLUT includes to avoid deprecation messages on
|
||||||
|
* Apple */
|
||||||
|
/* What the hell is Apple thinking? */
|
||||||
|
#define GL_SILENCE_DEPRECATION
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// Because OpenGL is only really a standard/specification it is up to
|
||||||
|
/// the driver manufacturer to implement the specification to a driver
|
||||||
|
/// that the specific graphics card supports. Since there are many
|
||||||
|
/// different versions of OpenGL drivers, the location of most of its
|
||||||
|
/// functions is not known at compile-time and needs to be queried at
|
||||||
|
/// run-time. GLAD is an open source library that manages all that
|
||||||
|
/// cumbersome work we talked about.
|
||||||
|
/// \see https://learnopengl.com/Getting-started/Creating-a-window
|
||||||
|
#include <glad/glad.h>
|
||||||
|
|
||||||
|
/// GLFW gives us the bare necessities required for rendering goodies
|
||||||
|
/// to the screen. It allows us to create an OpenGL context, define
|
||||||
|
/// window parameters, and handle user input
|
||||||
|
/// \see https://learnopengl.com/Getting-started/Creating-a-window
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
#include <matplot/backend/backend_interface.h>
|
||||||
|
|
||||||
|
namespace matplot::backend {
|
||||||
|
class MATPLOT_EXPORTS opengl_embed : public backend_interface {
|
||||||
|
public:
|
||||||
|
opengl_embed();
|
||||||
|
explicit opengl_embed(bool create_shaders);
|
||||||
|
~opengl_embed();
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool is_interactive() override;
|
||||||
|
const std::string &output() override;
|
||||||
|
const std::string &output_format() override;
|
||||||
|
bool output(const std::string &filename) override;
|
||||||
|
bool output(const std::string &filename,
|
||||||
|
const std::string &file_format) override;
|
||||||
|
unsigned int width() override;
|
||||||
|
unsigned int height() override;
|
||||||
|
void width(unsigned int new_width) override;
|
||||||
|
void height(unsigned int new_height) override;
|
||||||
|
unsigned int position_x() override;
|
||||||
|
unsigned int position_y() override;
|
||||||
|
void position_x(unsigned int new_position_x) override;
|
||||||
|
void position_y(unsigned int new_position_y) override;
|
||||||
|
bool new_frame() override;
|
||||||
|
// This is only a demonstration that is blocking the main thread.
|
||||||
|
// Because glfw does not work well with multiple threads,
|
||||||
|
// the challenge is to run the rendering loop in another thread
|
||||||
|
// while we see this function only to update what should be rendered.
|
||||||
|
bool render_data() override;
|
||||||
|
void show(matplot::figure_type *) override;
|
||||||
|
bool supports_fonts() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void draw_background(const std::array<float, 4> &color) override;
|
||||||
|
void draw_rectangle(const double x1, const double x2,
|
||||||
|
const double y1, const double y2,
|
||||||
|
const std::array<float, 4> &color) override;
|
||||||
|
void draw_path(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::array<float, 4> &color) override;
|
||||||
|
void draw_markers(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<double> &z = {}) override;
|
||||||
|
void draw_text(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<double> &z = {}) override;
|
||||||
|
void
|
||||||
|
draw_image(const std::vector<std::vector<double>> &x,
|
||||||
|
const std::vector<std::vector<double>> &y,
|
||||||
|
const std::vector<std::vector<double>> &z = {}) override;
|
||||||
|
void draw_triangle(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<double> &z = {}) override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static constexpr unsigned int default_screen_width = 560;
|
||||||
|
static constexpr unsigned int default_screen_height = 420;
|
||||||
|
|
||||||
|
/// \brief glfw: whenever the window size changed (by OS or user resize)
|
||||||
|
/// this callback function executes
|
||||||
|
static void framebuffer_size_callback(GLFWwindow *window, int width,
|
||||||
|
int height);
|
||||||
|
|
||||||
|
/// \brief Process all input
|
||||||
|
/// Query GLFW whether relevant keys are pressed/released
|
||||||
|
/// this frame and react accordingly
|
||||||
|
static void process_input(GLFWwindow *window);
|
||||||
|
|
||||||
|
void create_shaders();
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned int draw_2d_single_color_shader_program_;
|
||||||
|
int n_vertex_attributes_available_;
|
||||||
|
unsigned int height_{default_screen_height};
|
||||||
|
unsigned int width_{default_screen_width};
|
||||||
|
};
|
||||||
|
} // namespace matplot::backend
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_OPENGL_EMBED_H
|
||||||
95
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/core/axes_object.h
vendored
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_CHARTOBJECT_H
|
||||||
|
#define MATPLOTPLUSPLUS_CHARTOBJECT_H
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
using axes_handle = std::shared_ptr<class axes_type>;
|
||||||
|
|
||||||
|
/// Abstract class for the objects we put in the xlim
|
||||||
|
class MATPLOT_EXPORTS axes_object {
|
||||||
|
public:
|
||||||
|
enum class axes_category {
|
||||||
|
two_dimensional,
|
||||||
|
three_dimensional,
|
||||||
|
three_dimensional_map,
|
||||||
|
polar
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit axes_object(class axes_type *parent);
|
||||||
|
|
||||||
|
explicit axes_object(axes_handle parent);
|
||||||
|
|
||||||
|
virtual ~axes_object() = default;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual double xmax();
|
||||||
|
virtual double xmin();
|
||||||
|
virtual double ymax();
|
||||||
|
virtual double ymin();
|
||||||
|
virtual double zmax();
|
||||||
|
virtual double zmin();
|
||||||
|
virtual axes_category axes_category();
|
||||||
|
virtual bool requires_colormap();
|
||||||
|
virtual std::string tag();
|
||||||
|
virtual void tag(std::string_view);
|
||||||
|
bool is_3d();
|
||||||
|
bool is_3d_map();
|
||||||
|
bool is_2d();
|
||||||
|
bool is_polar();
|
||||||
|
|
||||||
|
public /* for the backend */:
|
||||||
|
virtual void run_draw_commands();
|
||||||
|
|
||||||
|
public /* for gnuplot backend only */:
|
||||||
|
virtual std::string set_variables_string();
|
||||||
|
|
||||||
|
// Plot command for this object
|
||||||
|
virtual std::string plot_string() = 0;
|
||||||
|
|
||||||
|
// Create a legend string for this object
|
||||||
|
// https://stackoverflow.com/questions/60617211/how-to-put-a-rectangle-in-the-key-with-same-hue-as-a-shaded-area-in-gnuplot/60624922#60624922
|
||||||
|
virtual std::string legend_string(std::string_view legend);
|
||||||
|
|
||||||
|
// Take a number of legends from the range [legends_begin, legends_end]
|
||||||
|
// and advance the legends_begin iterator.
|
||||||
|
// Objects might want to take care of more than one legend.
|
||||||
|
// They can overload this method to do that.
|
||||||
|
// If not, they can just inherit the simple legend_string method.
|
||||||
|
virtual std::string
|
||||||
|
legend_string(std::vector<std::string>::iterator &legends_begin,
|
||||||
|
std::vector<std::string>::iterator &legends_end);
|
||||||
|
|
||||||
|
virtual std::string data_string();
|
||||||
|
virtual std::string unset_variables_string();
|
||||||
|
|
||||||
|
public:
|
||||||
|
const class axes_type *parent() const;
|
||||||
|
class axes_type *&parent();
|
||||||
|
void parent(class axes_type *&parent);
|
||||||
|
void touch();
|
||||||
|
|
||||||
|
// Objects might have their own display name
|
||||||
|
// In this case, we use the display name for legends
|
||||||
|
// instead of the strings in the legends object
|
||||||
|
const std::string &display_name() const;
|
||||||
|
void display_name(std::string_view display_name);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string tag_{"axes_object"};
|
||||||
|
std::string display_name_{""};
|
||||||
|
class axes_type *parent_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_CHARTOBJECT_H
|
||||||
2894
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/core/axes_type.h
vendored
Normal file
181
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/core/axis_type.h
vendored
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-03.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_AXIS_TYPE_H
|
||||||
|
#define MATPLOTPLUSPLUS_AXIS_TYPE_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <matplot/util/keywords.h>
|
||||||
|
#include <array>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
|
||||||
|
/// A two dimensional axis
|
||||||
|
class MATPLOT_EXPORTS axis_type {
|
||||||
|
public:
|
||||||
|
enum class axis_scale { linear, log };
|
||||||
|
|
||||||
|
public:
|
||||||
|
friend axes_type;
|
||||||
|
axis_type();
|
||||||
|
explicit axis_type(class axes_type *parent);
|
||||||
|
explicit axis_type(class axes_type *parent, bool visible);
|
||||||
|
axis_type(class axes_type *parent, double min, double max);
|
||||||
|
axis_type(class axes_type *parent, double min, double max,
|
||||||
|
bool visible);
|
||||||
|
|
||||||
|
public:
|
||||||
|
void touch();
|
||||||
|
|
||||||
|
public:
|
||||||
|
std::array<double, 2> limits() const;
|
||||||
|
class axis_type &limits(const std::array<double, 2> &limits);
|
||||||
|
|
||||||
|
bool limits_mode_auto() const;
|
||||||
|
bool limits_mode_manual() const;
|
||||||
|
class axis_type &limits_mode_auto(bool limits_mode_auto);
|
||||||
|
class axis_type &limits_mode_manual(bool limits_mode_manual);
|
||||||
|
std::string range_string() const;
|
||||||
|
|
||||||
|
bool reverse() const;
|
||||||
|
class axis_type &reverse(bool reverse);
|
||||||
|
|
||||||
|
const color_array &color() const;
|
||||||
|
class axis_type &color(const color_array &color);
|
||||||
|
class axis_type &color(std::string_view color);
|
||||||
|
class axis_type &color(const enum color &color);
|
||||||
|
|
||||||
|
const std::string &label() const;
|
||||||
|
class axis_type &label(std::string_view label);
|
||||||
|
|
||||||
|
const std::string &tick_label_format() const;
|
||||||
|
class axis_type &tick_label_format(std::string_view tick_label_format);
|
||||||
|
|
||||||
|
bool tick_values_automatic() const;
|
||||||
|
class axis_type &tick_values_automatic(bool tick_values_automatic);
|
||||||
|
|
||||||
|
bool tick_values_manual() const;
|
||||||
|
class axis_type &tick_values_manual(bool tick_values_manual);
|
||||||
|
|
||||||
|
/// Get tick values
|
||||||
|
/// This might be tick values provided by the user
|
||||||
|
/// or tick values calculated automatically for the range
|
||||||
|
const std::vector<double> &tick_values() const;
|
||||||
|
class axis_type &tick_values(const std::vector<double> &tick_values);
|
||||||
|
|
||||||
|
/// Get tick values
|
||||||
|
/// This might be tick labels provided by the user
|
||||||
|
/// or tick labels according to a format
|
||||||
|
const std::vector<std::string> &ticklabels() const;
|
||||||
|
class axis_type &ticklabels(const std::vector<std::string> &ticklabels);
|
||||||
|
|
||||||
|
bool ticklabels_mode() const;
|
||||||
|
class axis_type &ticklabels_mode(bool ticklabels_mode);
|
||||||
|
|
||||||
|
float tickangle() const;
|
||||||
|
class axis_type &tickangle(float tickangle);
|
||||||
|
|
||||||
|
axis_scale scale() const;
|
||||||
|
class axis_type &scale(axis_scale scale);
|
||||||
|
|
||||||
|
float tick_length() const;
|
||||||
|
class axis_type &tick_length(float tick_length);
|
||||||
|
|
||||||
|
bool zero_axis() const;
|
||||||
|
class axis_type &zero_axis(bool zero_axis);
|
||||||
|
|
||||||
|
bool geographic() const;
|
||||||
|
class axis_type &geographic(bool geographic);
|
||||||
|
|
||||||
|
bool on_axis() const;
|
||||||
|
class axis_type &on_axis(bool on_axis);
|
||||||
|
|
||||||
|
const std::string &label_weight() const;
|
||||||
|
class axis_type &label_weight(std::string_view label_weight);
|
||||||
|
|
||||||
|
float label_font_size() const;
|
||||||
|
class axis_type &label_font_size(float label_font_size);
|
||||||
|
|
||||||
|
const color_array &label_color() const;
|
||||||
|
class axis_type &label_color(const color_array &label_color);
|
||||||
|
template <class T> axis_type &label_color(T c) {
|
||||||
|
label_color(to_array(c));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_timestamp() const;
|
||||||
|
class axis_type &is_timestamp(bool is_timestamp);
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
class axis_type &visible(bool visible);
|
||||||
|
|
||||||
|
public:
|
||||||
|
std::string label_string() const;
|
||||||
|
std::string tick_values_string(bool minor_ticks = false) const;
|
||||||
|
std::string tick_rotate_string() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// range
|
||||||
|
std::array<double, 2> limits_{0, 2};
|
||||||
|
bool limits_mode_auto_{true};
|
||||||
|
bool reverse_{false};
|
||||||
|
axis_scale scale_{axis_scale::linear};
|
||||||
|
float exponent{0};
|
||||||
|
bool geographic_{false};
|
||||||
|
|
||||||
|
// tics
|
||||||
|
std::vector<double> tick_values_{0, 0.2000, 0.4000, 0.6000,
|
||||||
|
0.8000, 1, 1.2000, 1.4000,
|
||||||
|
1.6000, 1.8000, 2};
|
||||||
|
std::string tick_label_format_{"%g"};
|
||||||
|
bool tick_values_automatic_{true};
|
||||||
|
float tickangle_{0};
|
||||||
|
std::vector<std::string> ticklabels_;
|
||||||
|
bool ticklabels_mode_{true};
|
||||||
|
std::array<float, 4> color_{0, 0.15f, 0.15f, 0.15f};
|
||||||
|
float tick_length_{0.75};
|
||||||
|
|
||||||
|
// minor tics
|
||||||
|
bool minor_tick_{false};
|
||||||
|
std::vector<double> minor_tick_values_{
|
||||||
|
0.0500, 0.1000, 0.1500, 0.2500, 0.3000, 0.3500, 0.4500, 0.5000,
|
||||||
|
0.5500, 0.6500, 0.7000, 0.7500, 0.8500, 0.9000, 0.9500, 1.0500,
|
||||||
|
1.1000, 1.1500, 1.2500, 1.3000, 1.3500, 1.4500, 1.5000, 1.5500,
|
||||||
|
1.6500, 1.7000, 1.7500, 1.8500, 1.9000, 1.9500};
|
||||||
|
|
||||||
|
// font
|
||||||
|
std::string font_{"Helvetica"};
|
||||||
|
float font_size_{10};
|
||||||
|
std::string font_weight_{"normal"};
|
||||||
|
|
||||||
|
// label
|
||||||
|
std::string label_{""};
|
||||||
|
std::string label_weight_{"normal"};
|
||||||
|
float label_font_size_{11};
|
||||||
|
color_array label_color_{0, 0, 0, 0};
|
||||||
|
|
||||||
|
bool is_timestamp_{false};
|
||||||
|
|
||||||
|
// line
|
||||||
|
float line_width_{0.5};
|
||||||
|
|
||||||
|
// draw zero axis
|
||||||
|
bool zero_axis_{false};
|
||||||
|
|
||||||
|
// Draw the tics on the axis
|
||||||
|
bool on_axis_{false};
|
||||||
|
|
||||||
|
bool visible_{true};
|
||||||
|
|
||||||
|
// parent xlim
|
||||||
|
class axes_type *parent_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_AXIS_TYPE_H
|
||||||
52
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/core/figure_registry.h
vendored
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 04/08/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_FIGURE_REGISTRY_H
|
||||||
|
#define MATPLOTPLUSPLUS_FIGURE_REGISTRY_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
using figure_handle = std::shared_ptr<figure_type>;
|
||||||
|
|
||||||
|
/// \brief Create a new figure
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
figure_handle figure_no_backend(bool quiet_mode);
|
||||||
|
|
||||||
|
/// \brief Create a new figure with a given backend
|
||||||
|
template <class BACKEND = backend::gnuplot>
|
||||||
|
figure_handle figure(bool quiet_mode) {
|
||||||
|
std::shared_ptr<backend::backend_interface> b =
|
||||||
|
create_backend<BACKEND>();
|
||||||
|
figure_handle f = figure_no_backend(quiet_mode);
|
||||||
|
f->backend(b);
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \brief Create a new figure (reactive mode)
|
||||||
|
template <class BACKEND = backend::gnuplot> figure_handle figure() {
|
||||||
|
/// Take default mode from backend?
|
||||||
|
return figure<BACKEND>(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \brief Set the current figure
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
figure_handle figure(figure_handle h);
|
||||||
|
|
||||||
|
/// \brief Set the current figure
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
figure_handle figure(class figure_type *h);
|
||||||
|
|
||||||
|
/// \brief Get the current figure
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
figure_handle gcf();
|
||||||
|
|
||||||
|
/// \brief Get current figure in quiet mode
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
figure_handle gcf(bool quiet);
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_FIGURE_REGISTRY_H
|
||||||
326
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/core/figure_type.h
vendored
Normal file
@ -0,0 +1,326 @@
|
|||||||
|
#ifndef MATPLOTPLUSPLUS_FIGURE_TYPE_H
|
||||||
|
#define MATPLOTPLUSPLUS_FIGURE_TYPE_H
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <matplot/backend/backend_registry.h>
|
||||||
|
#include <matplot/backend/gnuplot.h>
|
||||||
|
#include <matplot/util/colors.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <matplot/util/popen.h>
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
|
||||||
|
/// \class Figure
|
||||||
|
/// From Figures, we can create plot handles and
|
||||||
|
/// multiplot handles that contain other plot handles.
|
||||||
|
/// - Figure objects have axis objects
|
||||||
|
/// - Axis objects have plot object
|
||||||
|
///
|
||||||
|
/// When we plot the any of these subobjects, they will
|
||||||
|
/// send the appropriate commands to the parent Figure/pipe
|
||||||
|
/// to plot it.
|
||||||
|
///
|
||||||
|
/// If we create more Figures, we create more plot windows,
|
||||||
|
/// but we don't really recommend doing that. It's better
|
||||||
|
/// to only use the default pipe for everything and use
|
||||||
|
/// multiplots if more plots are needed.
|
||||||
|
class MATPLOT_EXPORTS figure_type {
|
||||||
|
public:
|
||||||
|
friend class axes_type;
|
||||||
|
// Remove the copy operators because users are not
|
||||||
|
// supposed to use this object directly.
|
||||||
|
// Users will use a figure_handle which can be copied
|
||||||
|
// and still reference to the same object.
|
||||||
|
figure_type(figure_type const &) = delete;
|
||||||
|
void operator=(figure_type const &) = delete;
|
||||||
|
|
||||||
|
/// \brief Create a Figure window
|
||||||
|
figure_type();
|
||||||
|
|
||||||
|
/// \brief Create a Figure window
|
||||||
|
explicit figure_type(bool quiet_mode);
|
||||||
|
|
||||||
|
/// \brief Create a Figure window
|
||||||
|
explicit figure_type(size_t index);
|
||||||
|
|
||||||
|
/// \brief Create a Figure window
|
||||||
|
explicit figure_type(size_t index, bool quiet_mode);
|
||||||
|
|
||||||
|
/// \brief The destructor closes the pipe
|
||||||
|
virtual ~figure_type();
|
||||||
|
|
||||||
|
public /* manage axes */:
|
||||||
|
/// \brief Create new axes in a figure
|
||||||
|
axes_handle add_axes(bool replace_if_overlap = false);
|
||||||
|
|
||||||
|
/// \brief Create new axes in position
|
||||||
|
/// Don't replace any axes that might overlap
|
||||||
|
/// Replace any axes exactly in the same position
|
||||||
|
/// \param position: x, y, width, height (all from 0 to 1)
|
||||||
|
/// \return Handle to new axes
|
||||||
|
axes_handle add_axes(std::array<float, 4> position);
|
||||||
|
|
||||||
|
/// \brief Add existing axes to the figure
|
||||||
|
/// If we find axes in the exact same position, we can replace
|
||||||
|
/// the axes with the new axes or we can get a handle
|
||||||
|
/// to the existing axes. If we don't find axes in the exact
|
||||||
|
/// same position, we remove any other axes overlapping the new
|
||||||
|
/// axes and return a handle to the new axes.
|
||||||
|
/// \param ax Handle to the new axes
|
||||||
|
/// \param replace_if_overlap Replace any axes that overlap at all
|
||||||
|
/// \param replace_if_same_position Replace any axes that are exactly in
|
||||||
|
/// the same position \return Handle to new axes
|
||||||
|
axes_handle add_axes(std::shared_ptr<class axes_type> ax,
|
||||||
|
bool replace_if_overlap,
|
||||||
|
bool replace_if_same_position);
|
||||||
|
|
||||||
|
/// \brief Add a subplot
|
||||||
|
/// The subplot is an axes with its position determined by the number of
|
||||||
|
/// rows, columns, and id
|
||||||
|
axes_handle add_subplot(size_t rows, size_t cols, size_t plot_id,
|
||||||
|
bool replace_if_same_position = false);
|
||||||
|
|
||||||
|
/// \brief Make axes a subplot of this figure
|
||||||
|
axes_handle add_subplot(size_t rows, size_t cols, size_t plot_id,
|
||||||
|
axes_handle axes);
|
||||||
|
|
||||||
|
/// \brief Create new axes in a subplot covering all positions in P
|
||||||
|
axes_handle add_subplot(size_t rows, size_t cols,
|
||||||
|
std::initializer_list<size_t> P,
|
||||||
|
bool replace_if_same_position = false);
|
||||||
|
|
||||||
|
/// \brief Create new subplot in a specific position
|
||||||
|
axes_handle add_subplot(std::array<float, 4> position,
|
||||||
|
bool replace_if_same_position = false);
|
||||||
|
|
||||||
|
/// \brief Get next tile in a tiled layout
|
||||||
|
/// In tiled layouts, we create new axes for each new tile.
|
||||||
|
/// The tile positions are determined according to the number
|
||||||
|
/// of rows/columns provided by `tiledlayout()`.
|
||||||
|
/// When creating a new tile, if there are more tiles than rows *
|
||||||
|
/// columns, we increase the number of rows or columns to make the new
|
||||||
|
/// tile fit. The position of old tiled is adjusted to the new number of
|
||||||
|
/// rows and columns.
|
||||||
|
void tiledlayout(size_t rows = 1, size_t cols = 1);
|
||||||
|
|
||||||
|
/// \brief Add next tile to plot
|
||||||
|
axes_handle nexttile();
|
||||||
|
|
||||||
|
/// \brief Add next tile to plot at position index
|
||||||
|
axes_handle nexttile(size_t index);
|
||||||
|
|
||||||
|
/// Get reference to current axes / create new axes if it does not exist
|
||||||
|
std::shared_ptr<class axes_type> current_axes();
|
||||||
|
|
||||||
|
/// Get reference to current axes
|
||||||
|
std::shared_ptr<class axes_type> current_axes() const;
|
||||||
|
|
||||||
|
/// Set current axes in the figure
|
||||||
|
void current_axes(const std::shared_ptr<class axes_type> ¤t_axes);
|
||||||
|
|
||||||
|
/// \brief Get reference to vector with all child axes
|
||||||
|
const std::vector<std::shared_ptr<class axes_type>> &children() const;
|
||||||
|
void
|
||||||
|
children(const std::vector<std::shared_ptr<class axes_type>> &children);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static std::array<float, 4>
|
||||||
|
calculate_subplot_position(size_t rows, size_t cols, size_t plot_id);
|
||||||
|
|
||||||
|
public /* manage figure reactive mode */:
|
||||||
|
/// \brief Draw the current figure (for figures in quiet/non-reactive
|
||||||
|
/// mode) Flush the buffer to the pipe, updating or creating the plot
|
||||||
|
/// window
|
||||||
|
void draw();
|
||||||
|
|
||||||
|
/// \brief Draw the current figure and pause the console
|
||||||
|
/// This is useful to keep the figure open, usually by the end
|
||||||
|
/// of a program. Never use this function inside a library
|
||||||
|
/// meant to be used non-interactively.
|
||||||
|
void show();
|
||||||
|
|
||||||
|
/// \brief Plot the figure if not in quiet mode
|
||||||
|
/// In some applications, we want the default behaviour
|
||||||
|
/// where we update the plot whenever we change a figure
|
||||||
|
/// property. This is usually what we want when tracking
|
||||||
|
/// the behaviour of an algorithm of something like that.
|
||||||
|
/// In some other applications, however, we just want
|
||||||
|
/// to plot when we explicitly call the plot function.
|
||||||
|
/// This is the case when producing plots for papers, etc.
|
||||||
|
/// This is also the case in applications where we need
|
||||||
|
/// performance.
|
||||||
|
void touch();
|
||||||
|
|
||||||
|
/// True if user required the backend to close
|
||||||
|
bool should_close();
|
||||||
|
|
||||||
|
/// True if in quiet mode (not reactive)
|
||||||
|
bool quiet_mode() const;
|
||||||
|
|
||||||
|
/// Set quite mode (non-reactive)
|
||||||
|
void quiet_mode(bool quiet_mode);
|
||||||
|
|
||||||
|
/// True if in quiet mode (not reactive)
|
||||||
|
bool reactive_mode() const;
|
||||||
|
|
||||||
|
/// Set quite mode (non-reactive)
|
||||||
|
void reactive_mode(bool reactive_mode);
|
||||||
|
|
||||||
|
/// Turn on reactive mode (off quiet mode)
|
||||||
|
void ion();
|
||||||
|
|
||||||
|
/// Turn off reactive mode (on quiet mode)
|
||||||
|
void ioff();
|
||||||
|
|
||||||
|
public /* save figure */:
|
||||||
|
/// Save figure
|
||||||
|
bool save(const std::string &filename, const std::string &format);
|
||||||
|
bool save(const std::string &filename);
|
||||||
|
|
||||||
|
public /* plot functions for figure */:
|
||||||
|
/// Create matrix of axes with scatter plots - X / Y
|
||||||
|
std::tuple<std::vector<std::vector<scatter_handle>>,
|
||||||
|
std::vector<histogram_handle>,
|
||||||
|
std::vector<std::vector<axes_handle>>>
|
||||||
|
plotmatrix(const std::vector<std::vector<double>> &X,
|
||||||
|
const std::vector<std::vector<double>> &Y,
|
||||||
|
std::string_view line_spec = "of",
|
||||||
|
bool histogram_on_diagonals = false);
|
||||||
|
|
||||||
|
/// Create matrix of axes with scatter plots - X / X
|
||||||
|
std::tuple<std::vector<std::vector<scatter_handle>>,
|
||||||
|
std::vector<histogram_handle>,
|
||||||
|
std::vector<std::vector<axes_handle>>>
|
||||||
|
plotmatrix(const std::vector<std::vector<double>> &X,
|
||||||
|
std::string_view line_spec = "of",
|
||||||
|
bool histogram_on_diagonals = false) {
|
||||||
|
return this->plotmatrix(X, X, line_spec, histogram_on_diagonals);
|
||||||
|
}
|
||||||
|
|
||||||
|
public /* figure properties */:
|
||||||
|
const std::shared_ptr<backend::backend_interface> &backend() const;
|
||||||
|
void
|
||||||
|
backend(const std::shared_ptr<backend::backend_interface> &new_backend);
|
||||||
|
|
||||||
|
void name(std::string_view name);
|
||||||
|
std::string name() const;
|
||||||
|
|
||||||
|
size_t number() const;
|
||||||
|
|
||||||
|
void color(const color_array &c);
|
||||||
|
void color(const std::array<float, 3> &c);
|
||||||
|
void color(std::string_view c);
|
||||||
|
void color(const enum color &c);
|
||||||
|
color_array color() const;
|
||||||
|
|
||||||
|
bool custom_color() const;
|
||||||
|
void custom_color(bool custom_color);
|
||||||
|
|
||||||
|
void position(const std::array<unsigned, 4> &c);
|
||||||
|
void position(unsigned x, unsigned y, unsigned w, unsigned h);
|
||||||
|
void position(unsigned x, unsigned y);
|
||||||
|
void size(unsigned w, unsigned h);
|
||||||
|
std::array<unsigned, 4> position() const;
|
||||||
|
|
||||||
|
unsigned x_position() const;
|
||||||
|
void x_position(unsigned x);
|
||||||
|
unsigned y_position() const;
|
||||||
|
void y_position(unsigned y);
|
||||||
|
unsigned width() const;
|
||||||
|
void width(unsigned w);
|
||||||
|
unsigned height() const;
|
||||||
|
void height(unsigned h);
|
||||||
|
|
||||||
|
void number_title(bool number_title);
|
||||||
|
bool number_title() const;
|
||||||
|
|
||||||
|
const std::string &font() const;
|
||||||
|
void font(std::string_view font);
|
||||||
|
|
||||||
|
float font_size() const;
|
||||||
|
void font_size(float font_size);
|
||||||
|
|
||||||
|
const std::string &title() const;
|
||||||
|
void title(std::string_view title);
|
||||||
|
|
||||||
|
const color_array &title_color() const;
|
||||||
|
void title_color(const color_array &title_color);
|
||||||
|
|
||||||
|
float title_font_size_multiplier() const;
|
||||||
|
void title_font_size_multiplier(float title_font_size_multiplier);
|
||||||
|
|
||||||
|
/// Return if Figure is valid
|
||||||
|
explicit operator bool() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Draw, depending on the backend type
|
||||||
|
void send_draw_commands();
|
||||||
|
void send_gnuplot_draw_commands();
|
||||||
|
|
||||||
|
protected /* run commands on a gnuplot pipe if that's our backend */:
|
||||||
|
/// \brief Send line and newline to gnu plot pipe and flush
|
||||||
|
/// We can buffer the lines until the end of data is sent
|
||||||
|
void run_command(const std::string &text);
|
||||||
|
|
||||||
|
/// \brief Include a comment in the gnuplot code
|
||||||
|
/// This is useful when tracing the gnuplot commands
|
||||||
|
/// and when generating a gnuplot file.
|
||||||
|
void include_comment(const std::string &text);
|
||||||
|
|
||||||
|
/// \brief Send commands to gnuplots
|
||||||
|
void flush_commands();
|
||||||
|
|
||||||
|
/// Plots an empty plot command
|
||||||
|
void plot_empty_plot();
|
||||||
|
|
||||||
|
/// \brief Run commands to set the appropriate window properties
|
||||||
|
/// This applies of member objects to the window (font, size, ...)
|
||||||
|
void run_figure_properties_command();
|
||||||
|
void run_terminal_init_command();
|
||||||
|
void run_window_color_command();
|
||||||
|
void run_unset_window_color_command();
|
||||||
|
void run_multiplot_command();
|
||||||
|
|
||||||
|
private:
|
||||||
|
[[nodiscard]] std::string generate_window_title() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// The default backend for this figure
|
||||||
|
std::shared_ptr<backend::backend_interface> backend_{nullptr};
|
||||||
|
|
||||||
|
// Figure properties
|
||||||
|
bool quiet_mode_ = true;
|
||||||
|
bool is_plotting_{false};
|
||||||
|
std::string name_;
|
||||||
|
std::string title_;
|
||||||
|
color_array title_color_{0, 0, 0, 0};
|
||||||
|
float title_font_size_multiplier_{1.4f};
|
||||||
|
size_t number_{1};
|
||||||
|
bool number_title_{true};
|
||||||
|
// ARGB
|
||||||
|
color_array color_{0., 0.94f, 0.94f, 0.94f};
|
||||||
|
bool custom_color_{false}; // was this color defined by the user
|
||||||
|
std::string font_{"Helvetica"};
|
||||||
|
float font_size_{10.};
|
||||||
|
|
||||||
|
// Axes
|
||||||
|
std::vector<std::shared_ptr<class axes_type>> children_;
|
||||||
|
std::shared_ptr<class axes_type> current_axes_;
|
||||||
|
|
||||||
|
// Axes tiles
|
||||||
|
size_t current_tile_index_ = 0;
|
||||||
|
size_t tiledlayout_rows_ = 1;
|
||||||
|
size_t tiledlayout_cols_ = 1;
|
||||||
|
bool tiledlayout_flow_ = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_FIGURE_TYPE_H
|
||||||
166
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/core/legend.h
vendored
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_LEGEND_H
|
||||||
|
#define MATPLOTPLUSPLUS_LEGEND_H
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <matplot/core/line_spec.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class axes_type;
|
||||||
|
|
||||||
|
class MATPLOT_EXPORTS legend {
|
||||||
|
public:
|
||||||
|
enum class horizontal_alignment { left, center, right };
|
||||||
|
|
||||||
|
enum class vertical_alignment { top, center, bottom };
|
||||||
|
|
||||||
|
enum class general_alignment {
|
||||||
|
topleft,
|
||||||
|
top,
|
||||||
|
topright,
|
||||||
|
left,
|
||||||
|
center,
|
||||||
|
right,
|
||||||
|
bottomleft,
|
||||||
|
bottom,
|
||||||
|
bottomright,
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
legend() = default;
|
||||||
|
legend(class axes_type *parent);
|
||||||
|
legend(class axes_type *parent,
|
||||||
|
std::initializer_list<std::string> names);
|
||||||
|
legend(class axes_type *parent, const std::vector<std::string> &names);
|
||||||
|
|
||||||
|
public /* useful functions */:
|
||||||
|
void touch();
|
||||||
|
const std::string &operator[](size_t index) const;
|
||||||
|
std::string &operator[](size_t index);
|
||||||
|
bool empty() const;
|
||||||
|
size_t size() const;
|
||||||
|
std::vector<std::string>::const_iterator begin() const;
|
||||||
|
std::vector<std::string>::iterator begin();
|
||||||
|
std::vector<std::string>::const_iterator end() const;
|
||||||
|
std::vector<std::string>::iterator end();
|
||||||
|
|
||||||
|
public /* getter and setters */:
|
||||||
|
std::vector<std::string> &strings();
|
||||||
|
const std::vector<std::string> &strings() const;
|
||||||
|
void strings(const std::vector<std::string> &strings);
|
||||||
|
|
||||||
|
void inside(bool inside);
|
||||||
|
bool inside() const;
|
||||||
|
|
||||||
|
bool label_after_sample() const;
|
||||||
|
void label_after_sample(bool label_after_sample);
|
||||||
|
|
||||||
|
bool box() const;
|
||||||
|
void box(bool box);
|
||||||
|
|
||||||
|
const line_spec &box_line() const;
|
||||||
|
line_spec &box_line();
|
||||||
|
void box_line(const line_spec &box_line);
|
||||||
|
|
||||||
|
bool vertical() const;
|
||||||
|
void vertical(bool vertical);
|
||||||
|
|
||||||
|
bool horizontal() const;
|
||||||
|
void horizontal(bool horizontal);
|
||||||
|
|
||||||
|
// Legend location given a reference position
|
||||||
|
// If the position is automatic, the reference is the xlim
|
||||||
|
// If the position is a manual point, the reference is this point
|
||||||
|
general_alignment location() const;
|
||||||
|
void location(general_alignment alignment);
|
||||||
|
|
||||||
|
horizontal_alignment horizontal_location() const;
|
||||||
|
void horizontal_location(horizontal_alignment horizontal_location);
|
||||||
|
|
||||||
|
vertical_alignment vertical_location() const;
|
||||||
|
void vertical_location(vertical_alignment vertical_location);
|
||||||
|
|
||||||
|
bool manual_position() const;
|
||||||
|
void manual_position(bool manual_position);
|
||||||
|
|
||||||
|
const std::array<float, 2> &position() const;
|
||||||
|
void position(const std::array<float, 2> &position);
|
||||||
|
|
||||||
|
bool invert() const;
|
||||||
|
void invert(bool invert);
|
||||||
|
|
||||||
|
size_t num_columns() const;
|
||||||
|
void num_columns(size_t num_columns);
|
||||||
|
|
||||||
|
size_t num_rows() const;
|
||||||
|
void num_rows(size_t num_rows);
|
||||||
|
|
||||||
|
bool visible() const;
|
||||||
|
void visible(bool visible);
|
||||||
|
|
||||||
|
const std::string &title() const;
|
||||||
|
void title(std::string_view title);
|
||||||
|
|
||||||
|
const std::string &font_name() const;
|
||||||
|
void font_name(std::string_view font_name);
|
||||||
|
|
||||||
|
float font_size() const;
|
||||||
|
void font_size(float font_size);
|
||||||
|
|
||||||
|
const std::string &font_angle() const;
|
||||||
|
void font_angle(std::string_view font_angle);
|
||||||
|
|
||||||
|
const std::string &font_weight() const;
|
||||||
|
void font_weight(std::string_view font_weight);
|
||||||
|
|
||||||
|
const color_array &text_color() const;
|
||||||
|
void text_color(const color_array &text_color);
|
||||||
|
template <class T> void text_color(T c) { text_color(to_array(c)); }
|
||||||
|
|
||||||
|
bool opaque() const;
|
||||||
|
void opaque(bool opaque);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// The keys
|
||||||
|
std::vector<std::string> strings_{};
|
||||||
|
std::string title_{""};
|
||||||
|
|
||||||
|
// Positioning
|
||||||
|
bool inside_{true};
|
||||||
|
bool manual_position_{false};
|
||||||
|
std::array<float, 2> position_{0.0, 0.0};
|
||||||
|
horizontal_alignment horizontal_location_{horizontal_alignment::right};
|
||||||
|
vertical_alignment vertical_location_{vertical_alignment::top};
|
||||||
|
|
||||||
|
// Font
|
||||||
|
std::string font_name_{"Helvetica"};
|
||||||
|
float font_size_{11};
|
||||||
|
std::string font_angle_{"normal"};
|
||||||
|
std::string font_weight_{"bold"};
|
||||||
|
color_array text_color_{0., 0, 0, 0};
|
||||||
|
|
||||||
|
// Style
|
||||||
|
bool box_{true};
|
||||||
|
line_spec box_line_{"k-"};
|
||||||
|
// color_array color_{0., 1, 1, 1};
|
||||||
|
bool vertical_{true};
|
||||||
|
bool label_after_sample_{true};
|
||||||
|
bool invert_{false};
|
||||||
|
bool visible_{true};
|
||||||
|
bool opaque_{true};
|
||||||
|
|
||||||
|
size_t num_columns_{0};
|
||||||
|
size_t num_rows_{0};
|
||||||
|
|
||||||
|
// Parent xlim
|
||||||
|
class axes_type *parent_{nullptr};
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_LEGEND_H
|
||||||
186
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/core/line_spec.h
vendored
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-06.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_LINE_SPEC_H
|
||||||
|
#define MATPLOTPLUSPLUS_LINE_SPEC_H
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <functional>
|
||||||
|
#include <matplot/util/colors.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class MATPLOT_EXPORTS line_spec {
|
||||||
|
public:
|
||||||
|
enum class line_style {
|
||||||
|
none, // no line
|
||||||
|
solid_line, // "-"
|
||||||
|
dashed_line, // "--"
|
||||||
|
dotted_line, // ":"
|
||||||
|
dash_dot_line, // "-."
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class marker_style {
|
||||||
|
none, // "" -> gnuplot linetype -1
|
||||||
|
plus_sign, // "+" -> gnuplot linetype 1
|
||||||
|
circle, // "o" -> gnuplot linetype 6
|
||||||
|
asterisk, // "*" -> gnuplot linetype 3
|
||||||
|
point, // "." -> gnuplot linetype 7
|
||||||
|
cross, // "x" -> gnuplot linetype 2
|
||||||
|
square, // "s" / "square" -> gnuplot linetype 4 / 5
|
||||||
|
diamond, // "d" / "diamond" -> gnuplot linetype 12 / 13
|
||||||
|
upward_pointing_triangle, // "^" -> gnuplot linetype 8 / 9
|
||||||
|
downward_pointing_triangle, // "v" -> gnuplot linetype 10 / 11
|
||||||
|
right_pointing_triangle, // ">" -> gnuplot linetype (doest not
|
||||||
|
// exist)
|
||||||
|
left_pointing_triangle, // "<" -> gnuplot linetype (does not exist)
|
||||||
|
pentagram, // "p" / "pentagram" -> gnuplot linetype 14 / 15
|
||||||
|
hexagram, // "h" / "hexagram" -> gnuplot linetype (does not exist)
|
||||||
|
custom, // https://stackoverflow.com/questions/16189187/gnuplot-using-custom-point-shapes-with-legend-entry
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class style_to_plot {
|
||||||
|
// plot line with markers together
|
||||||
|
plot_line_and_marker,
|
||||||
|
// plot only line
|
||||||
|
plot_line_only,
|
||||||
|
// plot only markers
|
||||||
|
plot_marker_only,
|
||||||
|
// plot only marker face
|
||||||
|
plot_marker_face_only
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
line_spec();
|
||||||
|
explicit line_spec(std::string_view expr);
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
line_spec(Pointer<T> parent, std::string_view expr)
|
||||||
|
: line_spec(expr) {
|
||||||
|
touch_function_ = [parent]() { parent->touch(); };
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// \brief Create string to apply this style in gnuplot
|
||||||
|
/// This includes the style for the line and the marker
|
||||||
|
/// It's only possible to set the color for one of them
|
||||||
|
std::string
|
||||||
|
plot_string(style_to_plot sty = style_to_plot::plot_line_and_marker,
|
||||||
|
bool include_style = true);
|
||||||
|
|
||||||
|
/// Get line_spec properties from a string
|
||||||
|
void parse_string(std::string_view expr);
|
||||||
|
|
||||||
|
/// \brief True if we can plot line and marker with only one plot
|
||||||
|
/// command We can plot them together "with linespoints" if:
|
||||||
|
/// - They both are different from none
|
||||||
|
/// - They have the same color
|
||||||
|
bool can_plot_line_and_marker_together();
|
||||||
|
|
||||||
|
/// \brief True if style includes a line
|
||||||
|
bool has_line();
|
||||||
|
|
||||||
|
/// \brief True if style includes a non custom marker
|
||||||
|
bool has_non_custom_marker();
|
||||||
|
|
||||||
|
/// \brief True if style includes a marker face
|
||||||
|
bool has_marker_face();
|
||||||
|
|
||||||
|
/// \brief True if line, marker, and marker face are the same color
|
||||||
|
[[nodiscard]] bool line_and_marker_are_the_same_color() const;
|
||||||
|
|
||||||
|
/// \brief True if marker and marker face are the same color
|
||||||
|
[[nodiscard]] bool marker_and_face_are_the_same_color() const;
|
||||||
|
|
||||||
|
/// Touch the parent element
|
||||||
|
void touch();
|
||||||
|
|
||||||
|
[[nodiscard]] const std::array<float, 4> &color() const;
|
||||||
|
[[nodiscard]] float alpha() const;
|
||||||
|
void color(const std::array<float, 3> &color);
|
||||||
|
void color(const std::array<float, 4> &color);
|
||||||
|
void color(std::initializer_list<float> color);
|
||||||
|
void color(std::string_view color);
|
||||||
|
void color(enum color marker_color);
|
||||||
|
void alpha(float alpha);
|
||||||
|
[[nodiscard]] bool user_color() const;
|
||||||
|
void user_color(bool user_color);
|
||||||
|
|
||||||
|
[[nodiscard]] line_style line_style() const;
|
||||||
|
void line_style(enum line_style line_style);
|
||||||
|
|
||||||
|
[[nodiscard]] float line_width() const;
|
||||||
|
void line_width(float line_width);
|
||||||
|
|
||||||
|
[[nodiscard]] enum marker_style marker_style() const;
|
||||||
|
void marker_style(enum marker_style marker_style);
|
||||||
|
void marker_style(std::string_view marker_style);
|
||||||
|
[[nodiscard]] enum marker_style marker() const;
|
||||||
|
template <class T> void marker(T marker) { marker_style(marker); }
|
||||||
|
|
||||||
|
[[nodiscard]] const std::string &custom_marker() const;
|
||||||
|
void custom_marker(std::string_view custom_marker);
|
||||||
|
|
||||||
|
[[nodiscard]] float marker_size() const;
|
||||||
|
void marker_size(float marker_size);
|
||||||
|
|
||||||
|
const std::array<float, 4> &marker_color() const;
|
||||||
|
float marker_alpha() const;
|
||||||
|
void marker_color(const std::array<float, 3> &color);
|
||||||
|
void marker_color(const std::array<float, 4> &color);
|
||||||
|
void marker_color(std::initializer_list<float> color);
|
||||||
|
void marker_color(std::string_view color);
|
||||||
|
void marker_color(enum color marker_color);
|
||||||
|
void marker_alpha(float alpha);
|
||||||
|
bool marker_user_color() const;
|
||||||
|
void marker_user_color(bool user_color);
|
||||||
|
|
||||||
|
const std::array<float, 4> &marker_face_color() const;
|
||||||
|
float marker_face_alpha() const;
|
||||||
|
void marker_face_color(const std::array<float, 3> &color);
|
||||||
|
void marker_face_color(const std::array<float, 4> &color);
|
||||||
|
void marker_face_color(std::initializer_list<float> color);
|
||||||
|
void marker_face_color(std::string_view color);
|
||||||
|
void marker_face_color(enum color marker_face_color);
|
||||||
|
void marker_face_alpha(float alpha);
|
||||||
|
bool marker_face_user_color() const;
|
||||||
|
void marker_face_user_color(bool user_color);
|
||||||
|
|
||||||
|
bool marker_face() const;
|
||||||
|
void marker_face(bool marker_face);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// use labels for non-custom markers:
|
||||||
|
// set label '▶︎' at 2,2
|
||||||
|
// set label '◀' at 3,3
|
||||||
|
// set label '✶' at 4,4
|
||||||
|
// plot cos(x) with linespoints linecolor rgb "#000000" dashtype 3
|
||||||
|
// linewidth 3 linetype 4 unset label
|
||||||
|
private:
|
||||||
|
// Line
|
||||||
|
std::array<float, 4> color_{0, 0, 0.447f, 0.741f};
|
||||||
|
// Did the user provide a color or is the color just a placeholder
|
||||||
|
bool user_color_{false};
|
||||||
|
enum line_style line_style_ { line_style::none };
|
||||||
|
float line_width_{0.5000};
|
||||||
|
|
||||||
|
// Marker
|
||||||
|
enum marker_style marker_style_ { marker_style::none };
|
||||||
|
std::array<float, 4> marker_color_{0, 0, 0.447f, 0.741f};
|
||||||
|
bool marker_user_color_{false};
|
||||||
|
std::string custom_marker_{""};
|
||||||
|
float marker_size_{6};
|
||||||
|
|
||||||
|
// Marker face
|
||||||
|
std::array<float, 4> marker_face_color_{0, 0.84f, 1., 1.};
|
||||||
|
bool marker_face_user_color_{false};
|
||||||
|
bool marker_face_ = false;
|
||||||
|
|
||||||
|
// Function to touch the parent element
|
||||||
|
std::function<void()> touch_function_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_LINE_SPEC_H
|
||||||
13
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/detail/config.h
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2023 alandefreitas (alandefreitas@gmail.com)
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
|
// https://www.boost.org/LICENSE_1_0.txt
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOT_DETAIL_CONFIG_H
|
||||||
|
#define MATPLOT_DETAIL_CONFIG_H
|
||||||
|
|
||||||
|
#include <matplot/detail/exports.h>
|
||||||
|
|
||||||
|
#endif //MATPLOT_DETAIL_CONFIG_H
|
||||||
42
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/detail/exports.h
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
#ifndef MATPLOT_EXPORTS_H
|
||||||
|
#define MATPLOT_EXPORTS_H
|
||||||
|
|
||||||
|
#ifdef SHARED_EXPORTS_BUILT_AS_STATIC
|
||||||
|
# define MATPLOT_EXPORTS
|
||||||
|
# define MATPLOT_NO_EXPORT
|
||||||
|
#else
|
||||||
|
# ifndef MATPLOT_EXPORTS
|
||||||
|
# ifdef matplot_EXPORTS
|
||||||
|
/* We are building this library */
|
||||||
|
# define MATPLOT_EXPORTS __attribute__((visibility("default")))
|
||||||
|
# else
|
||||||
|
/* We are using this library */
|
||||||
|
# define MATPLOT_EXPORTS __attribute__((visibility("default")))
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef MATPLOT_NO_EXPORT
|
||||||
|
# define MATPLOT_NO_EXPORT __attribute__((visibility("hidden")))
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MATPLOT_DEPRECATED
|
||||||
|
# define MATPLOT_DEPRECATED __attribute__ ((__deprecated__))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MATPLOT_DEPRECATED_EXPORT
|
||||||
|
# define MATPLOT_DEPRECATED_EXPORT MATPLOT_EXPORTS MATPLOT_DEPRECATED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MATPLOT_DEPRECATED_NO_EXPORT
|
||||||
|
# define MATPLOT_DEPRECATED_NO_EXPORT MATPLOT_NO_EXPORT MATPLOT_DEPRECATED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0 /* DEFINE_NO_DEPRECATED */
|
||||||
|
# ifndef MATPLOT_NO_DEPRECATED
|
||||||
|
# define MATPLOT_NO_DEPRECATED
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* MATPLOT_EXPORTS_H */
|
||||||
485
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/freestanding/axes_functions.h
vendored
Normal file
@ -0,0 +1,485 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 10/08/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_AXES_FUNCTIONS_H
|
||||||
|
#define MATPLOTPLUSPLUS_AXES_FUNCTIONS_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/core/axes_type.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
using axes_handle = std::shared_ptr<class axes_type>;
|
||||||
|
|
||||||
|
/// \brief Create new axes
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle axes();
|
||||||
|
|
||||||
|
/// \brief Create new axes
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle axes(figure_handle parent, bool replace_if_overlap = false);
|
||||||
|
|
||||||
|
/// \brief Set the current axes
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle axes(axes_handle h);
|
||||||
|
|
||||||
|
/// \brief Put axes in parent
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle axes(axes_handle h, figure_handle parent,
|
||||||
|
bool replace_if_overlap = false);
|
||||||
|
|
||||||
|
/// \brief Create new axes in a specific position with replace = false
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle axes(std::array<float, 4> position);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void hold(bool);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void hold(axes_handle, bool);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void hold(const std::vector<axes_handle> &axs, bool);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void box(bool);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void box(axes_handle, bool);
|
||||||
|
|
||||||
|
/// Set view with azimuth and elevation
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void view(float azimuth, float elevation);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void view(axes_handle ax, float azimuth, float elevation);
|
||||||
|
|
||||||
|
/// Set view with azimuth and elevation
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void rotate(float azimuth = 10., float elevation = 0.);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void rotate(axes_handle ax, float azimuth = 10., float elevation = 0.);
|
||||||
|
|
||||||
|
/// Coordinates of a vector that starts at the center of the
|
||||||
|
/// plot box and points toward the camera (line-of-sight vector)
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<float, float> view(float x, float y, float z);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<float, float> view(axes_handle ax, float x, float y, float z);
|
||||||
|
|
||||||
|
/// Default line of sight for dim-D plots
|
||||||
|
/// If dim=2 "set view map"
|
||||||
|
/// If dim=3 set view to default
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void view(size_t dim);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void view(axes_handle ax, size_t dim);
|
||||||
|
|
||||||
|
/// Get view values
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<float, float> view();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<float, float> view(axes_handle ax);
|
||||||
|
|
||||||
|
/// \brief Create new axes in a subplot
|
||||||
|
/// If the axes exist, make it the current axes.
|
||||||
|
/// If the axes overlap with existing axes, these are deleted,
|
||||||
|
/// unless the position is identical.
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle subplot(size_t rows, size_t cols, size_t plot_id,
|
||||||
|
bool replace_if_same_position = false);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle subplot(figure_handle, size_t rows, size_t cols, size_t plot_id,
|
||||||
|
bool replace_if_same_position = false);
|
||||||
|
|
||||||
|
/// \brief Make axes a subplot of its figure
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle subplot(size_t rows, size_t cols, size_t plot_id,
|
||||||
|
axes_handle axes);
|
||||||
|
|
||||||
|
/// \brief Create new axes in a subplot covering all positions in P
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle subplot(size_t rows, size_t cols,
|
||||||
|
std::initializer_list<size_t> P,
|
||||||
|
bool replace_if_same_position = false);
|
||||||
|
|
||||||
|
/// \brief Create new axes in a specific position
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle subplot(figure_handle f, std::array<float, 4> position,
|
||||||
|
bool replace_if_same_position = false);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle subplot(std::array<float, 4> position,
|
||||||
|
bool replace_if_same_position = false);
|
||||||
|
|
||||||
|
/// \brief Make axes the current axes
|
||||||
|
/// Another way to axes(h)
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle subplot(axes_handle h);
|
||||||
|
|
||||||
|
/// \brief Make axes in a tiled layout
|
||||||
|
/// This is only very basic support for tiled
|
||||||
|
/// layouts. It does not include a tiledlayout
|
||||||
|
/// class we can use to adjust padding, spacing,
|
||||||
|
/// title, etc.
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void tiledlayout();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void tiledlayout(size_t rows, size_t cols);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle nexttile();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle nexttile(size_t index);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void title(std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void title(std::string_view str, const color_array &c);
|
||||||
|
|
||||||
|
template <class COLOR_TYPE>
|
||||||
|
void title(std::string_view str, COLOR_TYPE c) {
|
||||||
|
title(str, to_array(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void title(axes_handle ax, std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void title(axes_handle ax, std::string_view str, const color_array &c);
|
||||||
|
|
||||||
|
template <class COLOR_TYPE>
|
||||||
|
void title(axes_handle ax, std::string_view str, COLOR_TYPE c) {
|
||||||
|
title(ax, str, to_array(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void title(legend_handle lgd, std::string_view str);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void sgtitle(std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void sgtitle(std::string_view str, const color_array &c);
|
||||||
|
|
||||||
|
template <class COLOR_TYPE>
|
||||||
|
void sgtitle(std::string_view str, COLOR_TYPE c) {
|
||||||
|
sgtitle(str, to_array(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void sgtitle(axes_handle ax, std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void sgtitle(axes_handle ax, std::string_view str, const color_array &c);
|
||||||
|
|
||||||
|
template <class COLOR_TYPE>
|
||||||
|
void sgtitle(axes_handle ax, std::string_view str, COLOR_TYPE c) {
|
||||||
|
sgtitle(ax, str, to_array(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xlabel(std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xlabel(axes_handle ax, std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void ylabel(std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void ylabel(axes_handle ax, std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2label(std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2label(axes_handle ax, std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zlabel(std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zlabel(axes_handle ax, std::string_view str);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xtickformat(std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xtickformat(axes_handle ax, std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void ytickformat(std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void ytickformat(axes_handle ax, std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void ztickformat(std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void ztickformat(axes_handle ax, std::string_view str);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string xtickformat();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string xtickformat(axes_handle ax);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string ytickformat();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string ytickformat(axes_handle ax);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string ztickformat();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string ztickformat(axes_handle ax);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticks(const std::vector<double> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticks(axes_handle ax, const std::vector<double> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticks(const std::vector<double> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticks(axes_handle ax, const std::vector<double> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticks(const std::vector<double> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticks(axes_handle ax, const std::vector<double> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticks(const std::vector<double> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticks(axes_handle ax, const std::vector<double> &ticks);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticks(std::initializer_list<double> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticks(axes_handle ax, std::initializer_list<double> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticks(std::initializer_list<double> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticks(axes_handle ax, std::initializer_list<double> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticks(std::initializer_list<double> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticks(axes_handle ax, std::initializer_list<double> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticks(std::initializer_list<double> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticks(axes_handle ax, std::initializer_list<double> ticks);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticks(keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticks(axes_handle ax, keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticks(keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticks(axes_handle ax, keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticks(keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticks(axes_handle ax, keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticks(keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticks(axes_handle ax, keyword_automatic_type);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticklabels(const std::vector<std::string> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticklabels(axes_handle ax, const std::vector<std::string> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticklabels(const std::vector<std::string> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticklabels(axes_handle ax, const std::vector<std::string> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticklabels(const std::vector<std::string> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticklabels(axes_handle ax, const std::vector<std::string> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticklabels(const std::vector<std::string> &ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticklabels(axes_handle ax, const std::vector<std::string> &ticks);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticklabels(std::initializer_list<std::string> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticklabels(axes_handle ax, std::initializer_list<std::string> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticklabels(std::initializer_list<std::string> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticklabels(axes_handle ax, std::initializer_list<std::string> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticklabels(std::initializer_list<std::string> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticklabels(axes_handle ax, std::initializer_list<std::string> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticklabels(std::initializer_list<std::string> ticks);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticklabels(axes_handle ax, std::initializer_list<std::string> ticks);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticklabels(keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xticklabels(axes_handle ax, keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticklabels(keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yticklabels(axes_handle ax, keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticklabels(keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2ticklabels(axes_handle ax, keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticklabels(keyword_automatic_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void zticklabels(axes_handle ax, keyword_automatic_type);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xtickangle(double degrees);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xtickangle(axes_handle ax, double degrees);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void ytickangle(double degrees);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void ytickangle(axes_handle ax, double degrees);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2tickangle(double degrees);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void y2tickangle(axes_handle ax, double degrees);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void ztickangle(double degrees);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void ztickangle(axes_handle ax, double degrees);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double xtickangle();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double xtickangle(axes_handle ax);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double ytickangle();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double ytickangle(axes_handle ax);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double y2tickangle();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double y2tickangle(axes_handle ax);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double ztickangle();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double ztickangle(axes_handle ax);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void grid(axes_handle ax, bool v);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void grid(bool v);
|
||||||
|
|
||||||
|
/// \brief Get the current axes
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axes_handle gca();
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void cla();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void cla(axes_handle);
|
||||||
|
|
||||||
|
/// Put legends on the figure
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
legend_handle legend(axes_handle ax, const std::vector<std::string> &names);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
legend_handle legend(const std::vector<std::string> &names);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
legend_handle legend(axes_handle ax, bool visible = true);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
legend_handle legend(bool visible = true);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
legend_handle legend(std::vector<axes_object_handle> objs,
|
||||||
|
const std::vector<std::string> &names);
|
||||||
|
|
||||||
|
// Hackfix for a compiler bug in MSVC
|
||||||
|
namespace {
|
||||||
|
template <typename... Args>
|
||||||
|
legend_handle legend(axes_handle ax, std::string_view name,
|
||||||
|
Args const &... next_name) {
|
||||||
|
std::vector<std::string> legends = {std::string(name), std::string(next_name)...};
|
||||||
|
return ::matplot::legend(ax, legends);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename... Args>
|
||||||
|
legend_handle legend(std::string_view name,
|
||||||
|
Args const &... next_name) {
|
||||||
|
return legend(gca(), name, next_name...);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void colormap(axes_handle ax, const std::vector<std::vector<double>> &map);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void colormap(const std::vector<std::vector<double>> &map);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> colormap(axes_handle ax);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> colormap();
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void colororder(axes_handle ax, const std::vector<T> &order) {
|
||||||
|
ax->colororder(order);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T> void colororder(const std::vector<T> &order) {
|
||||||
|
colororder(gca(), order);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T> void colororder(std::initializer_list<T> order) {
|
||||||
|
colororder(gca(), std::vector<T>{order});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set x limits
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xrange(const std::array<double, 2> &range);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void xrange(axes_handle ah, const std::array<double, 2> &range);
|
||||||
|
|
||||||
|
/// Set y limits
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yrange(const std::array<double, 2> &range);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void yrange(axes_handle ah, const std::array<double, 2> &range);
|
||||||
|
|
||||||
|
/// Enable colorbar axis
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axis_type &colorbar();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
axis_type &colorbar(axes_handle ah);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
class axis_type &colorbar(bool v);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
class axis_type &colorbar(axes_handle ah, bool v);
|
||||||
|
|
||||||
|
/// Set limits of x and y axes
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(const std::array<double, 4> &limits_x_y);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(axes_handle axes_handle, const std::array<double, 4> &limits_x_y);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(std::initializer_list<axes_handle> axes_handles,
|
||||||
|
const std::array<double, 4> &limits_x_y);
|
||||||
|
|
||||||
|
/// Make axis visible invisible
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(bool);
|
||||||
|
|
||||||
|
/// Set limits to automatic
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(keyword_automatic_type);
|
||||||
|
|
||||||
|
/// Set limits to manual
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(keyword_manual_type);
|
||||||
|
|
||||||
|
/// Reverse y-axis
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(keyword_ij_type);
|
||||||
|
|
||||||
|
/// Make xlim equal size (ratio -1)
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(keyword_equal_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(axes_handle, keyword_equal_type);
|
||||||
|
|
||||||
|
/// Make xlim equal size (ratio -1)
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(keyword_tight_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(axes_handle, keyword_tight_type);
|
||||||
|
|
||||||
|
/// Make xlim equal size (ratio 1)
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(keyword_square_type);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void axis(axes_handle, keyword_square_type);
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_AXES_FUNCTIONS_H
|
||||||
239
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/freestanding/axes_lim.h
vendored
Normal file
@ -0,0 +1,239 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 04/08/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_AXES_LIM_H
|
||||||
|
#define MATPLOTPLUSPLUS_AXES_LIM_H
|
||||||
|
|
||||||
|
#include <matplot/core/axes_type.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
inline std::array<double, 2> xlim() { return gca()->xlim(); }
|
||||||
|
|
||||||
|
inline void xlim(const std::array<double, 2> &lim) { gca()->xlim(lim); }
|
||||||
|
|
||||||
|
inline void xlim(std::initializer_list<double> lim) {
|
||||||
|
if (lim.size() >= 2) {
|
||||||
|
gca()->xlim(to_array<2>(lim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args> void xlim(axes_handle ax, Args&&... args) {
|
||||||
|
ax->xlim(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args>
|
||||||
|
void xlim(NotAxesHandle<T> x, Args&&... args) {
|
||||||
|
gca()->xlim(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> cblim() { return gca()->cblim(); }
|
||||||
|
|
||||||
|
inline void cblim(const std::array<double, 2> &lim) { gca()->cblim(lim); }
|
||||||
|
|
||||||
|
inline void cblim(std::initializer_list<double> lim) {
|
||||||
|
if (lim.size() >= 2) {
|
||||||
|
gca()->cblim(to_array<2>(lim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args> void cblim(axes_handle ax, Args&&... args) {
|
||||||
|
ax->cblim(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args>
|
||||||
|
void cblim(NotAxesHandle<T> x, Args&&... args) {
|
||||||
|
gca()->cblim(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> caxis() { return gca()->cblim(); }
|
||||||
|
|
||||||
|
inline void caxis(const std::array<double, 2> &lim) { gca()->cblim(lim); }
|
||||||
|
|
||||||
|
inline void caxis(std::initializer_list<double> lim) {
|
||||||
|
if (lim.size() >= 2) {
|
||||||
|
gca()->cblim(to_array<2>(lim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args> void caxis(axes_handle ax, Args&&... args) {
|
||||||
|
ax->cblim(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args>
|
||||||
|
void caxis(NotAxesHandle<T> x, Args&&... args) {
|
||||||
|
gca()->cblim(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> x2lim() { return gca()->x2lim(); }
|
||||||
|
|
||||||
|
inline void x2lim(const std::array<double, 2> &lim) { gca()->x2lim(lim); }
|
||||||
|
|
||||||
|
inline void x2lim(std::initializer_list<double> lim) {
|
||||||
|
if (lim.size() >= 2) {
|
||||||
|
gca()->x2lim(to_array<2>(lim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args> void x2lim(axes_handle ax, Args&&... args) {
|
||||||
|
ax->x2lim(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args>
|
||||||
|
void x2lim(NotAxesHandle<T> x, Args&&... args) {
|
||||||
|
gca()->x2lim(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> ylim() { return gca()->ylim(); }
|
||||||
|
|
||||||
|
inline void ylim(const std::array<double, 2> &lim) { gca()->ylim(lim); }
|
||||||
|
|
||||||
|
inline void ylim(std::initializer_list<double> lim) {
|
||||||
|
if (lim.size() >= 2) {
|
||||||
|
gca()->ylim(to_array<2>(lim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args> void ylim(axes_handle ax, Args&&... args) {
|
||||||
|
ax->ylim(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args>
|
||||||
|
void ylim(NotAxesHandle<T> x, Args&&... args) {
|
||||||
|
gca()->ylim(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> y2lim() { return gca()->y2lim(); }
|
||||||
|
|
||||||
|
inline void y2lim(const std::array<double, 2> &lim) { gca()->y2lim(lim); }
|
||||||
|
|
||||||
|
inline void y2lim(std::initializer_list<double> lim) {
|
||||||
|
if (lim.size() >= 2) {
|
||||||
|
gca()->y2lim(to_array<2>(lim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args> void y2lim(axes_handle ax, Args&&... args) {
|
||||||
|
ax->y2lim(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args>
|
||||||
|
void y2lim(NotAxesHandle<T> x, Args&&... args) {
|
||||||
|
gca()->y2lim(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> zlim() { return gca()->zlim(); }
|
||||||
|
|
||||||
|
inline void zlim(const std::array<double, 2> &lim) { gca()->zlim(lim); }
|
||||||
|
|
||||||
|
inline void zlim(std::initializer_list<double> lim) {
|
||||||
|
if (lim.size() >= 2) {
|
||||||
|
gca()->zlim(to_array<2>(lim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args> void zlim(axes_handle ax, Args&&... args) {
|
||||||
|
ax->zlim(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args>
|
||||||
|
void zlim(NotAxesHandle<T> x, Args&&... args) {
|
||||||
|
gca()->zlim(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> rlim() { return gca()->rlim(); }
|
||||||
|
|
||||||
|
inline void rlim(const std::array<double, 2> &lim) { gca()->rlim(lim); }
|
||||||
|
|
||||||
|
inline void rlim(std::initializer_list<double> lim) {
|
||||||
|
if (lim.size() >= 2) {
|
||||||
|
gca()->rlim(to_array<2>(lim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args> void rlim(axes_handle ax, Args&&... args) {
|
||||||
|
ax->rlim(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args>
|
||||||
|
void rlim(NotAxesHandle<T> x, Args&&... args) {
|
||||||
|
gca()->rlim(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> tlim() { return gca()->tlim(); }
|
||||||
|
|
||||||
|
inline void tlim(const std::array<double, 2> &lim) { gca()->tlim(lim); }
|
||||||
|
|
||||||
|
inline void tlim(std::initializer_list<double> lim) {
|
||||||
|
if (lim.size() >= 2) {
|
||||||
|
gca()->tlim(to_array<2>(lim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args> void tlim(axes_handle ax, Args&&... args) {
|
||||||
|
ax->tlim(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class... Args>
|
||||||
|
void tlim(NotAxesHandle<T> x, Args&&... args) {
|
||||||
|
gca()->tlim(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> xlim(axes_handle ax) {
|
||||||
|
return ax->xlim();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void xlim(axes_handle ax, const std::array<double, 2> &lim) {
|
||||||
|
ax->xlim(lim);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> x2lim(axes_handle ax) {
|
||||||
|
return ax->x2lim();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void x2lim(axes_handle ax, const std::array<double, 2> &lim) {
|
||||||
|
ax->x2lim(lim);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> ylim(axes_handle ax) {
|
||||||
|
return ax->ylim();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ylim(axes_handle ax, const std::array<double, 2> &lim) {
|
||||||
|
ax->ylim(lim);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> y2lim(axes_handle ax) {
|
||||||
|
return ax->y2lim();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void y2lim(axes_handle ax, const std::array<double, 2> &lim) {
|
||||||
|
ax->y2lim(lim);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> zlim(axes_handle ax) {
|
||||||
|
return ax->zlim();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void zlim(axes_handle ax, const std::array<double, 2> &lim) {
|
||||||
|
ax->zlim(lim);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> rlim(axes_handle ax) {
|
||||||
|
return ax->rlim();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void rlim(axes_handle ax, const std::array<double, 2> &lim) {
|
||||||
|
ax->rlim(lim);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::array<double, 2> tlim(axes_handle ax) {
|
||||||
|
return ax->tlim();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void tlim(axes_handle ax, const std::array<double, 2> &lim) {
|
||||||
|
ax->tlim(lim);
|
||||||
|
}
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_AXES_LIM_H
|
||||||
10
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/freestanding/figure_functions.h
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 11/08/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_FIGURE_FUNCTIONS_H
|
||||||
|
#define MATPLOTPLUSPLUS_FIGURE_FUNCTIONS_H
|
||||||
|
|
||||||
|
namespace matplot {}
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_FIGURE_FUNCTIONS_H
|
||||||
64
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/freestanding/histcounts.h
vendored
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 10/08/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_HISTCOUNTS_H
|
||||||
|
#define MATPLOTPLUSPLUS_HISTCOUNTS_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <matplot/axes_objects/histogram.h>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
/// Histogram count with custom binning and custom normalization
|
||||||
|
/// \return Pair with <values per bin, edges>
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<std::vector<double>, std::vector<double>>
|
||||||
|
histcounts(const std::vector<double> &data,
|
||||||
|
enum histogram::binning_algorithm binning_alg =
|
||||||
|
histogram::binning_algorithm::automatic,
|
||||||
|
enum histogram::normalization normalization_alg =
|
||||||
|
histogram::normalization::count);
|
||||||
|
|
||||||
|
/// Histogram count with automatic binning and custom normalization
|
||||||
|
/// \return pair with <values,edges>
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<std::vector<double>, std::vector<double>>
|
||||||
|
histcounts(const std::vector<double> &data,
|
||||||
|
enum histogram::normalization normalization_alg);
|
||||||
|
|
||||||
|
/// Histogram count with fixed number of bins
|
||||||
|
/// \return pair with <values,edges>
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<std::vector<double>, std::vector<double>>
|
||||||
|
histcounts(const std::vector<double> &data, size_t nbins,
|
||||||
|
enum histogram::normalization normalization_alg =
|
||||||
|
histogram::normalization::count);
|
||||||
|
|
||||||
|
/// Histogram count with fixed edges
|
||||||
|
/// \return normalized values for each edge
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double>
|
||||||
|
histcounts(const std::vector<double> &data,
|
||||||
|
const std::vector<double> &edges,
|
||||||
|
enum histogram::normalization normalization_alg =
|
||||||
|
histogram::normalization::count);
|
||||||
|
|
||||||
|
/// Normalize the number of points in a bin
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>>
|
||||||
|
histnormalize2(const std::vector<std::vector<size_t>> &bin_count,
|
||||||
|
const std::vector<double> &xbin_edges,
|
||||||
|
const std::vector<double> &ybin_edges, size_t data_size,
|
||||||
|
enum histogram::normalization normalization_algorithm);
|
||||||
|
|
||||||
|
/// Count number of points in each bin defined by the 2 dimensional edges
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> histcounts2(
|
||||||
|
const std::vector<double> &x_data, const std::vector<double> &y_data,
|
||||||
|
const std::vector<double> &x_edges, const std::vector<double> &y_edges,
|
||||||
|
enum histogram::normalization normalization_algorithm =
|
||||||
|
histogram::normalization::count);
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_HISTCOUNTS_H
|
||||||
989
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/freestanding/plot.h
vendored
Normal file
@ -0,0 +1,989 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-08.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_PLOT_H
|
||||||
|
#define MATPLOTPLUSPLUS_PLOT_H
|
||||||
|
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
|
||||||
|
#include <matplot/core/axes_type.h>
|
||||||
|
#include <matplot/core/figure_registry.h>
|
||||||
|
|
||||||
|
#include <matplot/axes_objects/function_line.h>
|
||||||
|
#include <matplot/axes_objects/string_function.h>
|
||||||
|
|
||||||
|
#include <matplot/freestanding/axes_functions.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* These are the freestanding plot functions
|
||||||
|
* These functions will call the corresponding functions in the axes handle
|
||||||
|
* If no axes handle is given, it will call the function in the current
|
||||||
|
* axes handle in the current figure.
|
||||||
|
* If there is no current axes handle, one is created in the current figure.
|
||||||
|
* If there is no current figure, one is created.
|
||||||
|
*
|
||||||
|
* They always forward the arguments as a parameter pack class ...Args.
|
||||||
|
* One problem with this is that the functions cannot infer what to do with
|
||||||
|
* initializer lists. So one needs to pass an explicit vector or array to
|
||||||
|
* the functions. In some cases, we explicitly define these shortcut
|
||||||
|
* functions without templates to make the use of initializer lists
|
||||||
|
* possible.
|
||||||
|
*/
|
||||||
|
namespace matplot {
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto plot(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->plot(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto plot(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->plot(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline line_handle plot(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
std::string_view line_spec = "") {
|
||||||
|
return gca()->plot(x, y, line_spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline line_handle plot(const std::vector<double> &y,
|
||||||
|
std::string_view line_spec = "") {
|
||||||
|
return gca()->plot(y, line_spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args>
|
||||||
|
auto plot(const std::vector<double> &x, const std::vector<double> &y,
|
||||||
|
std::string_view line_spec, Args&&... args) {
|
||||||
|
return gca()->plot(x, y, line_spec, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args>
|
||||||
|
auto plot(const std::vector<double> &x, const std::vector<double> &y,
|
||||||
|
const std::vector<double> &x2, Args&&... args) {
|
||||||
|
return gca()->plot(x, y, x2, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args>
|
||||||
|
auto plot(const std::vector<double> &y, std::string_view line_spec,
|
||||||
|
Args&&... args) {
|
||||||
|
return gca()->plot(y, line_spec, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline line_handle plot(axes_handle ax, const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
std::string_view line_spec = "") {
|
||||||
|
return ax->plot(x, y, line_spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline line_handle plot(axes_handle ax, const std::vector<double> &y,
|
||||||
|
std::string_view line_spec = "") {
|
||||||
|
return ax->plot(y, line_spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args>
|
||||||
|
auto plot(axes_handle ax, const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y, std::string_view line_spec,
|
||||||
|
Args&&... args) {
|
||||||
|
return ax->plot(x, y, line_spec, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args>
|
||||||
|
auto plot(axes_handle ax, const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y, const std::vector<double> &x2,
|
||||||
|
Args&&... args) {
|
||||||
|
return ax->plot(x, y, x2, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args>
|
||||||
|
auto plot(axes_handle ax, const std::vector<double> &y,
|
||||||
|
std::string_view line_spec, Args&&... args) {
|
||||||
|
return ax->plot(y, line_spec, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto loglog(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->loglog(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto loglog(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->loglog(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto semilogx(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->semilogx(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto semilogx(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->semilogx(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto semilogy(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->semilogy(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto semilogy(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->semilogy(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto rgbplot(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->rgbplot(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto rgbplot(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->rgbplot(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto plot3(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->plot3(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto plot3(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->plot3(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto stairs(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->stairs(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto stairs(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->stairs(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto errorbar(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->errorbar(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto errorbar(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->errorbar(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto area(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->area(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto area(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->area(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto fplot(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->fplot(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto fplot(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->fplot(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto fimplicit(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->fimplicit(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto fimplicit(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->fimplicit(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto fplot3(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->fplot3(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto fplot3(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->fplot3(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto hist(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->hist(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto hist(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->hist(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline size_t morebins(histogram_handle h, double bin_increase = 0.1) {
|
||||||
|
return h->morebins(bin_increase);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline size_t fewerbins(histogram_handle h, double bin_decrease = 0.1) {
|
||||||
|
return h->fewerbins(bin_decrease);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto binscatter(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->binscatter(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto binscatter(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->binscatter(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto hist2(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->hist2(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto hist2(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->hist2(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto bar(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->bar(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto bar(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->bar(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto barstacked(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->barstacked(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto barstacked(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->barstacked(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto heatmap(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->heatmap(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto heatmap(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->heatmap(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto pcolor(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->pcolor(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto pcolor(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->pcolor(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto parallelplot(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->parallelplot(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto parallelplot(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->parallelplot(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto pie(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->pie(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto pie(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->pie(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto plotmatrix(NotFigureHandle<T1> x, Args&&... args) {
|
||||||
|
return gcf()->plotmatrix(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto plotmatrix(figure_handle f, Args&&... args) {
|
||||||
|
return f->plotmatrix(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto scatter(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->scatter(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto scatter(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->scatter(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto scatter3(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->scatter3(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto scatter3(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->scatter3(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto wordcloud(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->wordcloud(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto wordcloud(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->wordcloud(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto pareto(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->pareto(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto pareto(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->pareto(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto stem(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->stem(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto stem(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->stem(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto stem3(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->stem3(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto stem3(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->stem3(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto geobubble(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->geobubble(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto geobubble(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->geobubble(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto geodensityplot(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->geodensityplot(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto geodensityplot(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->geodensityplot(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto geoplot(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->geoplot(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto geoplot(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->geoplot(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline auto geoplot() { return gca()->geoplot(); }
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
void geolimits(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
gca()->geolimits(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> void geolimits(axes_handle ax, Args&&... args) {
|
||||||
|
ax->geolimits(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void geolimits(const std::array<double, 2> &latitude,
|
||||||
|
const std::array<double, 2> &longitude) {
|
||||||
|
gca()->geolimits(latitude, longitude);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void geolimits(axes_handle ax, const std::array<double, 2> &latitude,
|
||||||
|
const std::array<double, 2> &longitude) {
|
||||||
|
ax->geolimits(latitude, longitude);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto geoscatter(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->geoscatter(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto geoscatter(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->geoscatter(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto compass(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->compass(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto compass(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->compass(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto ezpolar(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->ezpolar(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto ezpolar(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->ezpolar(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto polarhistogram(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->polarhistogram(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto polarhistogram(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->polarhistogram(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto polarplot(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->polarplot(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto polarplot(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->polarplot(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto polarscatter(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->polarscatter(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto polarscatter(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->polarscatter(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto contour(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->contour(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class T2, class T3>
|
||||||
|
auto contour(axes_handle ax, T1 v1, T2 v2, T3 v3,
|
||||||
|
const std::vector<double> &il) {
|
||||||
|
return ax->contour(v1, v2, v3, il);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto contour(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return contour(gca(), x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto contourf(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->contourf(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class T2, class T3>
|
||||||
|
auto contourf(axes_handle ax, T1 v1, T2 v2, T3 v3,
|
||||||
|
const std::vector<double> &il) {
|
||||||
|
return ax->contourf(v1, v2, v3, il);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class T2, class T3>
|
||||||
|
auto contourf(T1 v1, T2 v2, T3 v3, const std::vector<double> &il) {
|
||||||
|
return gca()->contourf(v1, v2, v3, il);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto contourf(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return contourf(gca(), x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto fcontour(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->fcontour(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto fcontour(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->fcontour(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline contours_handle fcontour(axes_type::fcontour_function_type fn,
|
||||||
|
const std::array<double, 4> &xy_range,
|
||||||
|
std::vector<double> levels,
|
||||||
|
std::string_view line_spec = "") {
|
||||||
|
return gca()->fcontour(fn, xy_range, levels, line_spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline contours_handle fcontour(axes_type::fcontour_function_type fn,
|
||||||
|
std::string_view line_spec) {
|
||||||
|
return gca()->fcontour(fn, line_spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline contours_handle fcontour(axes_handle ax,
|
||||||
|
axes_type::fcontour_function_type fn,
|
||||||
|
const std::array<double, 4> &xy_range,
|
||||||
|
std::vector<double> levels,
|
||||||
|
std::string_view line_spec = "") {
|
||||||
|
return ax->fcontour(fn, xy_range, levels, line_spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline contours_handle fcontour(axes_handle ax,
|
||||||
|
axes_type::fcontour_function_type fn,
|
||||||
|
std::string_view line_spec) {
|
||||||
|
return ax->fcontour(fn, line_spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto feather(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->feather(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto feather(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->feather(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto quiver(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->quiver(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto quiver(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->quiver(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto quiver3(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->quiver3(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto quiver3(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->quiver3(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto fence(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->fence(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto fence(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->fence(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto fmesh(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->fmesh(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto fmesh(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->fmesh(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto fsurf(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->fsurf(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto fsurf(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->fsurf(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline surface_handle fsurf(axes_type::fcontour_function_type fn,
|
||||||
|
const std::array<double, 2> &x_range,
|
||||||
|
const std::array<double, 2> &y_range,
|
||||||
|
std::string_view line_spec = "",
|
||||||
|
double mesh_density = 40) {
|
||||||
|
return gca()->fsurf(fn, x_range, y_range, line_spec, mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline surface_handle fsurf(axes_type::fcontour_function_type funx,
|
||||||
|
axes_type::fcontour_function_type funy,
|
||||||
|
axes_type::fcontour_function_type funz,
|
||||||
|
const std::array<double, 2> &u_range,
|
||||||
|
const std::array<double, 2> &v_range,
|
||||||
|
std::string_view line_spec = "",
|
||||||
|
double mesh_density = 40) {
|
||||||
|
return gca()->fsurf(funx, funy, funz, u_range, v_range, line_spec,
|
||||||
|
mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function surf
|
||||||
|
/// Grid / Both ranges in the same array size 4
|
||||||
|
inline surface_handle fsurf(axes_type::fcontour_function_type fn,
|
||||||
|
const std::array<double, 4> &xy_range,
|
||||||
|
std::string_view line_spec = "",
|
||||||
|
double mesh_density = 40) {
|
||||||
|
return gca()->fsurf(fn, xy_range, line_spec, mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function surf
|
||||||
|
/// Grid / Both ranges in the same array size 4
|
||||||
|
inline surface_handle fsurf(axes_type::fcontour_function_type fn,
|
||||||
|
std::initializer_list<double> xy_range,
|
||||||
|
std::string_view line_spec = "",
|
||||||
|
double mesh_density = 40) {
|
||||||
|
return gca()->fsurf(fn, xy_range, line_spec, mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parametric / Both ranges in the same array size 4
|
||||||
|
inline surface_handle fsurf(axes_type::fcontour_function_type funx,
|
||||||
|
axes_type::fcontour_function_type funy,
|
||||||
|
axes_type::fcontour_function_type funz,
|
||||||
|
const std::array<double, 4> &uv_range,
|
||||||
|
std::string_view line_spec = "",
|
||||||
|
double mesh_density = 40) {
|
||||||
|
return gca()->fsurf(funx, funy, funz, uv_range, line_spec,
|
||||||
|
mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function surf
|
||||||
|
/// Grid / Both ranges in the same array size 2
|
||||||
|
inline surface_handle
|
||||||
|
fsurf(axes_type::fcontour_function_type fn,
|
||||||
|
const std::array<double, 2> &xy_range = {-5, +5},
|
||||||
|
std::string_view line_spec = "", double mesh_density = 40) {
|
||||||
|
return gca()->fsurf(fn, xy_range, line_spec, mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function surf
|
||||||
|
/// Parametric / Both ranges in the same array size 2
|
||||||
|
inline surface_handle
|
||||||
|
fsurf(axes_type::fcontour_function_type funx,
|
||||||
|
axes_type::fcontour_function_type funy,
|
||||||
|
axes_type::fcontour_function_type funz,
|
||||||
|
const std::array<double, 2> &uv_range = {-5, +5},
|
||||||
|
std::string_view line_spec = "", double mesh_density = 40) {
|
||||||
|
return gca()->fsurf(funx, funy, funz, uv_range, line_spec,
|
||||||
|
mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline surface_handle fsurf(axes_type::fcontour_function_type funx,
|
||||||
|
axes_type::fcontour_function_type funy,
|
||||||
|
axes_type::fcontour_function_type funz,
|
||||||
|
std::initializer_list<double> &uv_range,
|
||||||
|
std::string_view line_spec = "",
|
||||||
|
double mesh_density = 40) {
|
||||||
|
return gca()->fsurf(funx, funy, funz, uv_range, line_spec,
|
||||||
|
mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function surf - Core function
|
||||||
|
inline surface_handle fsurf(axes_handle ax,
|
||||||
|
axes_type::fcontour_function_type fn,
|
||||||
|
const std::array<double, 2> &x_range,
|
||||||
|
const std::array<double, 2> &y_range,
|
||||||
|
std::string_view line_spec = "",
|
||||||
|
double mesh_density = 40) {
|
||||||
|
return ax->fsurf(fn, x_range, y_range, line_spec, mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function surf - Parametric
|
||||||
|
/// Core parametric function
|
||||||
|
inline surface_handle fsurf(axes_handle ax,
|
||||||
|
axes_type::fcontour_function_type funx,
|
||||||
|
axes_type::fcontour_function_type funy,
|
||||||
|
axes_type::fcontour_function_type funz,
|
||||||
|
const std::array<double, 2> &u_range,
|
||||||
|
const std::array<double, 2> &v_range,
|
||||||
|
std::string_view line_spec = "",
|
||||||
|
double mesh_density = 40) {
|
||||||
|
return ax->fsurf(funx, funy, funz, u_range, v_range, line_spec,
|
||||||
|
mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function surf
|
||||||
|
/// Grid / Both ranges in the same array size 4
|
||||||
|
inline surface_handle fsurf(axes_handle ax,
|
||||||
|
axes_type::fcontour_function_type fn,
|
||||||
|
const std::array<double, 4> &xy_range,
|
||||||
|
std::string_view line_spec = "",
|
||||||
|
double mesh_density = 40) {
|
||||||
|
return ax->fsurf(fn, xy_range, line_spec, mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parametric / Both ranges in the same array size 4
|
||||||
|
inline surface_handle fsurf(axes_handle ax,
|
||||||
|
axes_type::fcontour_function_type funx,
|
||||||
|
axes_type::fcontour_function_type funy,
|
||||||
|
axes_type::fcontour_function_type funz,
|
||||||
|
const std::array<double, 4> &uv_range,
|
||||||
|
std::string_view line_spec = "",
|
||||||
|
double mesh_density = 40) {
|
||||||
|
return ax->fsurf(funx, funy, funz, uv_range, line_spec, mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function surf
|
||||||
|
/// Grid / Both ranges in the same array size 2
|
||||||
|
inline surface_handle
|
||||||
|
fsurf(axes_handle ax, axes_type::fcontour_function_type fn,
|
||||||
|
const std::array<double, 2> &xy_range = {-5, +5},
|
||||||
|
std::string_view line_spec = "", double mesh_density = 40) {
|
||||||
|
return ax->fsurf(fn, xy_range, line_spec, mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function surf
|
||||||
|
/// Parametric / Both ranges in the same array size 2
|
||||||
|
inline surface_handle
|
||||||
|
fsurf(axes_handle ax, axes_type::fcontour_function_type funx,
|
||||||
|
axes_type::fcontour_function_type funy,
|
||||||
|
axes_type::fcontour_function_type funz,
|
||||||
|
const std::array<double, 2> &uv_range = {-5, +5},
|
||||||
|
std::string_view line_spec = "", double mesh_density = 40) {
|
||||||
|
return ax->fsurf(funx, funy, funz, uv_range, line_spec, mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline surface_handle fsurf(axes_handle ax,
|
||||||
|
axes_type::fcontour_function_type funx,
|
||||||
|
axes_type::fcontour_function_type funy,
|
||||||
|
axes_type::fcontour_function_type funz,
|
||||||
|
std::initializer_list<double> &uv_range,
|
||||||
|
std::string_view line_spec = "",
|
||||||
|
double mesh_density = 40) {
|
||||||
|
return ax->fsurf(funx, funy, funz, uv_range, line_spec, mesh_density);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto mesh(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->mesh(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto mesh(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->mesh(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto meshc(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->meshc(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto meshc(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->meshc(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto meshz(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->meshz(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto meshz(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->meshz(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto ribbon(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->ribbon(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto ribbon(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->ribbon(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto surf(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->surf(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto surf(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->surf(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto surfc(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->surfc(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto surfc(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->surfc(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto waterfall(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->waterfall(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto waterfall(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->waterfall(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto graph(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->graph(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto graph(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->graph(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto imshow(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->imshow(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto imshow(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->imshow(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto image(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->image(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto image(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->image(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto text(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->text(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto text(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->text(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline labels_handle text(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<std::string> &texts) {
|
||||||
|
return gca()->text(x, y, texts);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline labels_handle text(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
std::string_view str) {
|
||||||
|
return gca()->text(x, y, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline labels_handle text(axes_handle ax, const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<std::string> &texts) {
|
||||||
|
return ax->text(x, y, texts);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline labels_handle text(axes_handle ax, const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
std::string_view str) {
|
||||||
|
return ax->text(x, y, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto arrow(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->arrow(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto arrow(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->arrow(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline auto line(double x1, double y1, double x2, double y2) {
|
||||||
|
return gca()->line(x1, y1, x2, y2);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline auto line(axes_handle ax, double x1, double y1, double x2,
|
||||||
|
double y2) {
|
||||||
|
return ax->line(x1, y1, x2, y2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto textarrow(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->textarrow(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto textarrow(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->textarrow(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto rectangle(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->rectangle(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto rectangle(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->rectangle(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto textbox(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->textbox(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto textbox(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->textbox(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto fill(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->fill(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto fill(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->fill(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto polygon(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->polygon(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto polygon(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->polygon(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto ellipse(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->ellipse(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto ellipse(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->ellipse(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto digraph(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->digraph(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto digraph(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->digraph(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto imagesc(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->imagesc(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto imagesc(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->imagesc(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto boxplot(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->boxplot(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto boxplot(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->boxplot(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T1, class... Args>
|
||||||
|
auto boxchart(NotAxesHandle<T1> x, Args&&... args) {
|
||||||
|
return gca()->boxchart(x, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class... Args> auto boxchart(axes_handle ax, Args&&... args) {
|
||||||
|
return ax->boxchart(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void show() { return gcf()->show(); }
|
||||||
|
|
||||||
|
inline void show(figure_handle f) { f->show(); }
|
||||||
|
|
||||||
|
inline bool save(const std::string &filename) {
|
||||||
|
return gcf()->save(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool save(figure_handle f, const std::string &filename,
|
||||||
|
const std::string &format) {
|
||||||
|
return f->save(filename, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool save(const std::string &filename, const std::string &format) {
|
||||||
|
return gcf()->save(filename, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool save(figure_handle f, const std::string &filename) {
|
||||||
|
return f->save(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_PLOT_H
|
||||||
51
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/matplot.h
vendored
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-03.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_MATPLOT_H
|
||||||
|
#define MATPLOTPLUSPLUS_MATPLOT_H
|
||||||
|
|
||||||
|
// Common / util
|
||||||
|
#include <matplot/util/common.h>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <matplot/util/geodata.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <matplot/util/type_traits.h>
|
||||||
|
|
||||||
|
// Backends
|
||||||
|
#include <matplot/backend/backend_interface.h>
|
||||||
|
#include <matplot/backend/backend_registry.h>
|
||||||
|
#include <matplot/backend/gnuplot.h>
|
||||||
|
// #include <matplot/backend/opengl_3.h> // Don't include opengl by default
|
||||||
|
|
||||||
|
// Figure and axes
|
||||||
|
#include <matplot/core/axes_type.h>
|
||||||
|
#include <matplot/core/axis_type.h>
|
||||||
|
#include <matplot/core/figure_type.h>
|
||||||
|
|
||||||
|
// Axes objects
|
||||||
|
#include <matplot/axes_objects/bars.h>
|
||||||
|
#include <matplot/axes_objects/box_chart.h>
|
||||||
|
#include <matplot/axes_objects/circles.h>
|
||||||
|
#include <matplot/axes_objects/contours.h>
|
||||||
|
#include <matplot/axes_objects/error_bar.h>
|
||||||
|
#include <matplot/axes_objects/filled_area.h>
|
||||||
|
#include <matplot/axes_objects/function_line.h>
|
||||||
|
#include <matplot/axes_objects/histogram.h>
|
||||||
|
#include <matplot/axes_objects/labels.h>
|
||||||
|
#include <matplot/axes_objects/line.h>
|
||||||
|
#include <matplot/axes_objects/matrix.h>
|
||||||
|
#include <matplot/axes_objects/network.h>
|
||||||
|
#include <matplot/axes_objects/parallel_lines.h>
|
||||||
|
#include <matplot/axes_objects/stair.h>
|
||||||
|
#include <matplot/axes_objects/string_function.h>
|
||||||
|
#include <matplot/axes_objects/surface.h>
|
||||||
|
#include <matplot/axes_objects/vectors.h>
|
||||||
|
|
||||||
|
// Free-standing functions
|
||||||
|
#include <matplot/freestanding/axes_functions.h>
|
||||||
|
#include <matplot/freestanding/axes_lim.h>
|
||||||
|
#include <matplot/freestanding/histcounts.h>
|
||||||
|
#include <matplot/freestanding/plot.h>
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_MATPLOT_H
|
||||||
242
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/util/colors.h
vendored
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-04.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_COLORS_H
|
||||||
|
#define MATPLOTPLUSPLUS_COLORS_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <array>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
enum class color {
|
||||||
|
blue,
|
||||||
|
black,
|
||||||
|
red,
|
||||||
|
green,
|
||||||
|
yellow,
|
||||||
|
cyan,
|
||||||
|
magenta,
|
||||||
|
white,
|
||||||
|
none,
|
||||||
|
};
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string to_string(matplot::color c);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
matplot::color string_to_color(std::string_view s);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
matplot::color char_to_color(char c);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
bool is_valid_color_char(char c);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::array<float, 4> to_array(matplot::color c);
|
||||||
|
|
||||||
|
template <class T> std::array<float, 4> to_array(std::vector<T> c) {
|
||||||
|
std::array<float, 4> r{0.f, 0.f, 0.f, 0.f};
|
||||||
|
if (c.size() == 1) {
|
||||||
|
r[0] = 0.f;
|
||||||
|
r[1] = static_cast<float>(c[0]);
|
||||||
|
r[2] = static_cast<float>(c[0]);
|
||||||
|
r[3] = static_cast<float>(c[0]);
|
||||||
|
} else if (c.size() == 3) {
|
||||||
|
r[0] = 0.f;
|
||||||
|
r[1] = static_cast<float>(c[0]);
|
||||||
|
r[2] = static_cast<float>(c[1]);
|
||||||
|
r[3] = static_cast<float>(c[2]);
|
||||||
|
} else if (c.size() == 4) {
|
||||||
|
r[0] = static_cast<float>(c[0]);
|
||||||
|
r[1] = static_cast<float>(c[1]);
|
||||||
|
r[2] = static_cast<float>(c[2]);
|
||||||
|
r[3] = static_cast<float>(c[3]);
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::array<float, 4> to_array(std::string_view str_color);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string to_string(const std::array<float, 4> &c);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string to_string(const std::array<float, 3> &c);
|
||||||
|
|
||||||
|
constexpr std::array<float, 4> default_color(size_t index) {
|
||||||
|
constexpr size_t num_default_colors = 7;
|
||||||
|
size_t color_index = index % num_default_colors;
|
||||||
|
switch (color_index) {
|
||||||
|
case 0:
|
||||||
|
return {0, 0, 0.447f, 0.741f};
|
||||||
|
case 1:
|
||||||
|
return {0, 0.85f, 0.325f, 0.098f};
|
||||||
|
case 2:
|
||||||
|
return {0, 0.929f, 0.694f, 0.125f};
|
||||||
|
case 3:
|
||||||
|
return {0, 0.494f, 0.184f, 0.556f};
|
||||||
|
case 4:
|
||||||
|
return {0, 0.466f, 0.674f, 0.188f};
|
||||||
|
case 5:
|
||||||
|
return {0, 0.301f, 0.745f, 0.933f};
|
||||||
|
case 6:
|
||||||
|
return {0, 0.635f, 0.078f, 0.184f};
|
||||||
|
default:
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace palette {
|
||||||
|
/*
|
||||||
|
* \see
|
||||||
|
* - https://doi.org/10.1179%2Fcaj.1996.33.2.79
|
||||||
|
* - https://bids.github.io/colormap/
|
||||||
|
* - https://dx.doi.org/10.1371/journal.pone.0199239
|
||||||
|
* - https://dx.doi.org/10.5670/oceanog.2016.66
|
||||||
|
* - https://dx.doi.org/10.1071/aseg2015ab107
|
||||||
|
* - https://zenodo.org/record/4153113
|
||||||
|
*/
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> accent(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> blues(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> brbg(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> bugn(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> bupu(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> chromajs(size_t n = 9);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> dark2(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> gnbu(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> gnpu(size_t n = 10);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> greens(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> greys(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> inferno(size_t n = 256);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> jet(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> turbo(size_t n = 256);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> magma(size_t n = 256);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> oranges(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> orrd(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> paired(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> parula(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> pastel1(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> pastel2(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> piyg(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> plasma(size_t n = 256);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> prgn(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> pubu(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> pubugn(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> puor(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> purd(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> purples(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> rdbu(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> rdgy(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> rdpu(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> rdylbu(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> rdylgn(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> reds(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> sand(size_t n = 10);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> set1(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> set2(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> set3(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> spectral(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> viridis(size_t n = 256);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> whylrd(size_t n = 5);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> ylgn(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> ylgnbu(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> ylorbr(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> ylorrd(size_t n = 8);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> ylrd(size_t n = 4);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> hsv(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> hot(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> cool(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> spring(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> summer(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> autumn(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> winter(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> gray(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> bone(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> copper(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> pink(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> lines(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> colorcube(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> prism(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> flag(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> white(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> default_map(size_t n = 64);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::vector<double>> default_colors_map(size_t n = 7);
|
||||||
|
} // namespace palette
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::array<float, 4>
|
||||||
|
colormap_interpolation(double value, double min, double max,
|
||||||
|
const std::vector<std::vector<double>> &cm);
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_COLORS_H
|
||||||
679
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/util/common.h
vendored
Normal file
@ -0,0 +1,679 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-03.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_COMMON_H
|
||||||
|
#define MATPLOTPLUSPLUS_COMMON_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cctype>
|
||||||
|
#include <complex>
|
||||||
|
#include <functional>
|
||||||
|
#include <map>
|
||||||
|
#include <matplot/util/concepts.h>
|
||||||
|
#include <numeric>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
bool iequals(std::string_view str1, std::string_view str2);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
bool is_true(std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
bool is_false(std::string_view str);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string run_and_get_output(const std::string &command);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string escape(std::string_view label);
|
||||||
|
|
||||||
|
inline void ltrim(std::string &s) {
|
||||||
|
s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int ch) {
|
||||||
|
return !std::isspace(ch);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void rtrim(std::string &s) {
|
||||||
|
s.erase(std::find_if(s.rbegin(), s.rend(),
|
||||||
|
[](int ch) { return !std::isspace(ch); })
|
||||||
|
.base(),
|
||||||
|
s.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void rtrim(std::string &s, char d) {
|
||||||
|
s.erase(
|
||||||
|
std::find_if(s.rbegin(), s.rend(), [d](int ch) { return ch != d; })
|
||||||
|
.base(),
|
||||||
|
s.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T> std::string num2str(Arithmetic<T> num) {
|
||||||
|
std::ostringstream ss;
|
||||||
|
ss.precision(10);
|
||||||
|
ss << std::fixed;
|
||||||
|
ss << num;
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
std::string num2str(Arithmetic<T> num, const std::string &format) {
|
||||||
|
constexpr int max_buffer_size = 100;
|
||||||
|
char buffer[max_buffer_size];
|
||||||
|
int cx = snprintf(buffer, max_buffer_size, format.c_str(), num);
|
||||||
|
if (cx >= 0 && cx < max_buffer_size) {
|
||||||
|
return std::string(buffer);
|
||||||
|
} else {
|
||||||
|
return num2str(num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T = double> T str2num(std::string_view text) {
|
||||||
|
std::istringstream ss((std::string(text)));
|
||||||
|
T result;
|
||||||
|
return ss >> result ? result : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
using vector_1d = std::vector<double>;
|
||||||
|
|
||||||
|
using vector_2d = std::vector<vector_1d>;
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> linspace(double lower_bound, double upper_bound);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> linspace(double lower_bound, double upper_bound,
|
||||||
|
size_t n);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> logspace(double lower_bound, double upper_bound);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> logspace(double lower_bound, double upper_bound,
|
||||||
|
size_t n);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> iota(double lower_bound, double upper_bound);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> iota(double lower_bound, double step,
|
||||||
|
double upper_bound);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_1d transform(const vector_1d &x, std::function<double(double)> fn);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_1d transform(const vector_1d &x, const vector_1d &y,
|
||||||
|
std::function<double(double, double)> fn);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_2d transform(const vector_2d &x, std::function<double(double)> fn);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_2d transform(const vector_2d &x, const vector_2d &y,
|
||||||
|
std::function<double(double, double)> fn);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_1d flatten(const vector_2d &x);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> unique(const std::vector<double> &x);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double min(const std::vector<double> &x);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double min(const std::vector<std::vector<double>> &x);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double max(const std::vector<double> &x);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double max(const std::vector<std::vector<double>> &x);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<double, double> minmax(const std::vector<double> &x);
|
||||||
|
|
||||||
|
template <typename T> T min(T val1, T val2) {
|
||||||
|
return val1 < val2 ? val1 : val2;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename... Ts> T min(T val1, T val2, Ts &&...vs) {
|
||||||
|
return val1 < val2 ? min(val1, std::forward<Ts>(vs)...)
|
||||||
|
: min(val2, std::forward<Ts>(vs)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T> T max(T val1, T val2) {
|
||||||
|
return val1 > val2 ? val1 : val2;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename... Ts> T max(T val1, T val2, Ts &&...vs) {
|
||||||
|
return val1 > val2 ? max(val1, std::forward<Ts>(vs)...)
|
||||||
|
: max(val2, std::forward<Ts>(vs)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double mean(const std::vector<double> &x);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double stddev(const std::vector<double> &x);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void wait();
|
||||||
|
|
||||||
|
constexpr double pi =
|
||||||
|
3.141592653589793238462643383279502884197169399375105820974944592307816406286;
|
||||||
|
constexpr double NaN = std::numeric_limits<double>::quiet_NaN();
|
||||||
|
|
||||||
|
template <class T> std::vector<T> vectorize(const std::vector<T> &result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T> std::vector<T> vectorize(const T &result) {
|
||||||
|
return std::vector<T>({result});
|
||||||
|
}
|
||||||
|
|
||||||
|
template <size_t N, class T>
|
||||||
|
inline std::array<T, N> to_array(std::initializer_list<T> il) {
|
||||||
|
std::array<T, N> r{};
|
||||||
|
auto r_it = r.begin();
|
||||||
|
auto il_it = il.begin();
|
||||||
|
while (r_it != r.end() && il_it != il.end()) {
|
||||||
|
*r_it = *il_it;
|
||||||
|
++r_it;
|
||||||
|
++il_it;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <size_t N, class T>
|
||||||
|
inline std::array<T, N> to_array(const std::vector<T> &v) {
|
||||||
|
std::array<T, N> r{};
|
||||||
|
auto r_it = r.begin();
|
||||||
|
auto v_it = v.begin();
|
||||||
|
while (r_it != r.end() && v_it != v.end()) {
|
||||||
|
*r_it = *v_it;
|
||||||
|
++r_it;
|
||||||
|
++v_it;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
template <typename T, typename U>
|
||||||
|
using forward_or_copy =
|
||||||
|
std::conditional_t<std::is_same_v<T, U>, const U &, U>;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
detail::forward_or_copy<T, vector_1d> to_vector_1d(const T &v) {
|
||||||
|
if constexpr (std::is_same_v<T, vector_1d>) {
|
||||||
|
return v;
|
||||||
|
} else {
|
||||||
|
using std::begin, std::end;
|
||||||
|
vector_1d r(v.size());
|
||||||
|
std::transform(v.begin(), v.end(), r.begin(), [](const auto &x) {
|
||||||
|
return static_cast<double>(x);
|
||||||
|
});
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
detail::forward_or_copy<T, vector_2d> to_vector_2d(const T &v) {
|
||||||
|
if constexpr (std::is_same_v<T, vector_2d>) {
|
||||||
|
return v;
|
||||||
|
} else {
|
||||||
|
using std::begin, std::end;
|
||||||
|
|
||||||
|
vector_2d r(std::distance(begin(v), end(v)));
|
||||||
|
std::transform(
|
||||||
|
begin(v), end(v), r.begin(),
|
||||||
|
[](auto &&e) -> vector_1d { return to_vector_1d(e); });
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
detail::forward_or_copy<T, std::vector<vector_2d>>
|
||||||
|
to_vector_3d(const T &v) {
|
||||||
|
if constexpr (std::is_same_v<T, std::vector<vector_2d>>) {
|
||||||
|
return v;
|
||||||
|
} else {
|
||||||
|
using std::begin, std::end;
|
||||||
|
|
||||||
|
std::vector<vector_2d> r(std::distance(begin(v), end(v)));
|
||||||
|
std::transform(
|
||||||
|
begin(v), end(v), r.begin(),
|
||||||
|
[](auto &&e) -> vector_2d { return to_vector_2d(e); });
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T> inline T norm(const std::vector<T> &v) {
|
||||||
|
T sum = 0.;
|
||||||
|
for (const auto &vk : v) {
|
||||||
|
sum += pow(vk, 2.);
|
||||||
|
}
|
||||||
|
return sqrt(sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double randn(double mean, double stddev);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> randn(size_t n, double mean, double stddev);
|
||||||
|
|
||||||
|
/// Exponential distribution
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double rande(double lambda, double multiplier = 1.0);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> rande(size_t n, double lambda, double multiplier = 1.0);
|
||||||
|
|
||||||
|
/// Pareto distribution
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double randp(double scale, double shape = 1.0);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> randp(size_t n, double scale, double shape = 1.0);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
int randi(int imin, int imax);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<int> randi(size_t n, int imin, int imax);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double rand(double lower_bound, double upper_bound);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_1d rand(size_t n, double lower_bound, double upper_bound);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_2d rand(size_t rows, size_t cols, double lower_bound,
|
||||||
|
double upper_bound);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> reshape(const std::vector<std::vector<double>> &X);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> concat(const std::vector<double> &a,
|
||||||
|
const std::vector<double> &b);
|
||||||
|
|
||||||
|
template <class... Args>
|
||||||
|
std::vector<double> concat(const std::vector<double> &a,
|
||||||
|
const std::vector<double> &b, Args &&...args) {
|
||||||
|
std::vector<double> r = concat(a, b);
|
||||||
|
return concat(r, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double truncate(double x, double lower_bound, double upper_bound);
|
||||||
|
|
||||||
|
template <class Arg1, class TUPLE>
|
||||||
|
void reorder_parameter_pack_in_tuple(TUPLE &t, Arg1 x) {
|
||||||
|
std::get<Arg1>(t) = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Arg1, class... Args, class TUPLE>
|
||||||
|
void reorder_parameter_pack_in_tuple(TUPLE &t, Arg1 x, Args &&...args) {
|
||||||
|
std::get<Arg1>(t) = x;
|
||||||
|
reorder_parameter_pack_in_tuple(t, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::string fileread(const std::string &filename);
|
||||||
|
|
||||||
|
template <class T, class T2 = T, class FN = std::less<T>>
|
||||||
|
void rank_elements(T first, T last, T2 rank_input,
|
||||||
|
FN comp = std::less<T>()) {
|
||||||
|
using value_and_rank =
|
||||||
|
std::pair<std::remove_reference_t<decltype(*first)> const *,
|
||||||
|
size_t>;
|
||||||
|
std::vector<value_and_rank> v;
|
||||||
|
size_t r = 0;
|
||||||
|
while (first != last) {
|
||||||
|
v.emplace_back(&(*first), r);
|
||||||
|
++first;
|
||||||
|
++r;
|
||||||
|
}
|
||||||
|
std::sort(v.begin(), v.end(), [comp](const auto &a, const auto &b) {
|
||||||
|
return comp(*a.first, *b.first);
|
||||||
|
});
|
||||||
|
for (const auto &[ptr, ranking] : v) {
|
||||||
|
(void)ptr;
|
||||||
|
*rank_input = ranking;
|
||||||
|
++rank_input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Cosine of argument in degreescollapse
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double cosd(double degrees);
|
||||||
|
|
||||||
|
/// Sine of argument in degreescollapse
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double sind(double degrees);
|
||||||
|
|
||||||
|
/// Sine of argument in degreescollapse
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<double> deg2rad(const std::vector<double> °rees);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double deg2rad(double rho);
|
||||||
|
|
||||||
|
/// Round up the maximum polar value
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double round_polar_max(double polar_max);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double to_positive_radian(double radian);
|
||||||
|
|
||||||
|
/// Calculate the radians rho of a vector (u,v)
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double vector_radians(double u, double v);
|
||||||
|
|
||||||
|
/// Calculate the magnitude theta of a vector (u,v)
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double vector_magnitude(double u, double v);
|
||||||
|
|
||||||
|
/// Calculate the radians rho of a complex number u + iv
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double vector_radians(std::complex<double> v);
|
||||||
|
|
||||||
|
/// Calculate the magnitude theta of a complex number u + iv
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double vector_magnitude(std::complex<double> v);
|
||||||
|
|
||||||
|
/// Calculate cartesian coordinates of vector in polar coordinates
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<double, double> pol2cart(double theta, double rho);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<vector_1d, vector_1d> pol2cart(vector_1d theta, vector_1d rho);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<vector_1d, vector_1d> pol2cart(vector_1d theta, double rho);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<double, double> elliptic2cart(double theta, double rho_w,
|
||||||
|
double rho_h);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<vector_1d, vector_1d> elliptic2cart(vector_1d theta, double rho_w,
|
||||||
|
double rho_h);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<vector_1d, vector_1d>
|
||||||
|
elliptic2cart(vector_1d theta, vector_1d rho_w, vector_1d rho_h);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<vector_2d, vector_2d> meshgrid(const vector_1d &x,
|
||||||
|
const vector_1d &y);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<vector_2d, vector_2d> meshgrid(const vector_1d &x_and_y);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_1d gradient(const vector_1d &z, double spacing = 1.0);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<vector_2d, vector_2d> gradient(const vector_2d &z,
|
||||||
|
double spacing = 1.0);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<vector_2d, vector_2d>
|
||||||
|
gradient(const vector_2d &z, double spacing_x, double spacing_y);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double peaks(double x, double y);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_2d peaks(const vector_2d &X, const vector_2d &Y);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::tuple<vector_2d, vector_2d, vector_2d> peaks(size_t N = 49);
|
||||||
|
|
||||||
|
template <class T1, class T2> struct pair_hash {
|
||||||
|
std::size_t operator()(const std::pair<T1, T2> &p) const {
|
||||||
|
std::size_t h1 = std::hash<T1>()(p.first);
|
||||||
|
std::size_t h2 = std::hash<T2>()(p.second);
|
||||||
|
return h1 ^ h2;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T> std::pair<size_t, size_t> size(const std::vector<T> &v) {
|
||||||
|
if (v.empty()) {
|
||||||
|
return std::make_pair(0, 0);
|
||||||
|
} else {
|
||||||
|
return std::make_pair(v.size(), v[0].size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_2d zeros(size_t rows, size_t cols);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_2d ones(size_t rows, size_t cols);
|
||||||
|
|
||||||
|
using image_row_t = std::vector<unsigned char>;
|
||||||
|
using image_channel_t = std::vector<image_row_t>;
|
||||||
|
// The image might have 1 channel (B&W), 3 channels (RGB), or 4 channels
|
||||||
|
// (RGBA)
|
||||||
|
using image_channels_t = std::vector<image_channel_t>;
|
||||||
|
|
||||||
|
/// Core imread function
|
||||||
|
/// Return grayscale image (vector::size() == 1),
|
||||||
|
/// rgb image (vector::size() == 3),
|
||||||
|
/// rgba image (vector::size() == 4),
|
||||||
|
/// empty image (vector::size() == 0)
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
image_channels_t imread(const std::string &filename);
|
||||||
|
|
||||||
|
enum class image_interpolation {
|
||||||
|
raw,
|
||||||
|
additional_space,
|
||||||
|
nearest,
|
||||||
|
moving_average,
|
||||||
|
bilinear,
|
||||||
|
grid,
|
||||||
|
bicubic,
|
||||||
|
lanczos
|
||||||
|
};
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
image_channel_t rgb2gray(const image_channels_t &A);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
image_channels_t gray2rgb(const image_channel_t &A,
|
||||||
|
const std::vector<std::vector<double>> &colormap);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
image_channels_t gray2rgb(const image_channel_t &A);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
image_channels_t gray2rgb(const image_channels_t &A,
|
||||||
|
const std::vector<std::vector<double>> &colormap);
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
image_channels_t gray2rgb(const image_channels_t &A);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
image_channels_t
|
||||||
|
imresize(const image_channels_t &A, double scale,
|
||||||
|
image_interpolation m = image_interpolation::bicubic);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
image_channels_t
|
||||||
|
imresize(const image_channels_t &A, size_t height, size_t width,
|
||||||
|
image_interpolation m = image_interpolation::bicubic);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void imwrite(const image_channels_t &A, const std::string &filename);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void imwrite(const image_channel_t &A,
|
||||||
|
const std::vector<std::vector<double>> &colormap,
|
||||||
|
const std::string &filename);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
void imwrite(const image_channels_t &A, const std::string &filename);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
image_channels_t imvignette(const image_channels_t &A,
|
||||||
|
double min_radius = 1., double exponent = 0.5);
|
||||||
|
|
||||||
|
template <class T = double> std::vector<std::vector<T>> eye(size_t n) {
|
||||||
|
std::vector<std::vector<T>> r(n, std::vector<T>(n, static_cast<T>(0)));
|
||||||
|
for (size_t i = 0; i < n; ++i) {
|
||||||
|
r[i][i] = 1.;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
vector_2d transpose(const vector_2d &z);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<std::string>
|
||||||
|
tokenize(std::string_view text,
|
||||||
|
std::string_view delimiters = " ',\n\r\t\".!?:");
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<std::vector<std::string>, std::vector<size_t>>
|
||||||
|
wordcount(const std::vector<std::string> &tokens,
|
||||||
|
const std::vector<std::string> &black_list,
|
||||||
|
size_t max_cloud_size = 100);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<std::vector<std::string>, std::vector<size_t>>
|
||||||
|
wordcount(std::string_view text, const std::vector<std::string> &black_list,
|
||||||
|
std::string_view delimiters = " ',\n\r\t\".!?:;",
|
||||||
|
size_t max_cloud_size = 100);
|
||||||
|
|
||||||
|
// Distance from x to the next larger floating point number
|
||||||
|
template <class FLOAT>
|
||||||
|
std::enable_if_t<std::is_same_v<FLOAT, float> ||
|
||||||
|
std::is_same_v<FLOAT, double> ||
|
||||||
|
std::is_same_v<FLOAT, long double>,
|
||||||
|
FLOAT>
|
||||||
|
eps(FLOAT x = 1.) {
|
||||||
|
constexpr long double max_long_double =
|
||||||
|
std::numeric_limits<long double>::max();
|
||||||
|
// std::nexttoward is more precise than std::nextafter
|
||||||
|
if constexpr (std::is_same_v<FLOAT, double>) {
|
||||||
|
return std::nexttoward(x, max_long_double) - x;
|
||||||
|
} else if constexpr (std::is_same_v<FLOAT, float>) {
|
||||||
|
return std::nexttowardf(x, max_long_double) - x;
|
||||||
|
} else if constexpr (std::is_same_v<FLOAT, long double>) {
|
||||||
|
return std::nexttowardl(x, max_long_double) - x;
|
||||||
|
} else {
|
||||||
|
throw std::logic_error(
|
||||||
|
"eps: FLOAT type needs to be float, double or long double");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
std::vector<T> repmat(const std::vector<T> &a, size_t n) {
|
||||||
|
std::vector<T> b(a.size() * n);
|
||||||
|
for (size_t i = 0; i < n; ++i) {
|
||||||
|
for (size_t j = 0; j < a.size(); ++j) {
|
||||||
|
b[i * a.size() + j] = a[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ticks_results {
|
||||||
|
std::vector<double> ticks;
|
||||||
|
std::vector<std::string> tickLabels;
|
||||||
|
std::string scaleStr;
|
||||||
|
std::vector<double> minorTicks;
|
||||||
|
std::vector<double> overhang;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// \brief Find ticks at "nice" intervals for an axis
|
||||||
|
/// For now, we only use our own ticks when we need to take control
|
||||||
|
/// over the gnuplot ticks. Sometimes the gnuplot ticks does not
|
||||||
|
/// give us the behaviour we expect. For instance, this is the case
|
||||||
|
/// when plotting parallel coordinates.
|
||||||
|
/// We could easily adapt class axis to always use this function
|
||||||
|
/// instead of the automatic gnuplot ticks but there's no need
|
||||||
|
/// for that at the moment.
|
||||||
|
/// The algorithm in this function is inspired by this matplot script:
|
||||||
|
/// https://www.mathworks.com/matlabcentral/fileexchange/30671-calcticks
|
||||||
|
/// We don't implement the version for log scale because, by coincidence,
|
||||||
|
/// the library does not need it at this point.
|
||||||
|
/// \param limits_min Minimum value
|
||||||
|
/// \param limits_max Maximum value
|
||||||
|
/// \param horizontal True if axis is horizontal (this changes the room for
|
||||||
|
/// labels) \param text_size Size in height or width of a char \param log
|
||||||
|
/// True if scale is logarithmic (this will throw an error for now) \return
|
||||||
|
/// Nice ticks and their labels in a ticks_results struct \see
|
||||||
|
/// https://www.mathworks.com/matlabcentral/fileexchange/30671-calcticks
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
ticks_results calcticks(double limits_min = -5, double limits_max = +5,
|
||||||
|
bool horizontal = false, double text_size = 1.25,
|
||||||
|
bool separateExp = true, bool log = false);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
double distance(double x1, double y1, double x2, double y2);
|
||||||
|
|
||||||
|
/// \brief Simple read-only 2d view for vector_2d.
|
||||||
|
/// It could iterates over all vector's elements and get value using
|
||||||
|
/// only one index (offset).
|
||||||
|
class MATPLOT_EXPORTS vector_2d_view {
|
||||||
|
using vector_2d = matplot::vector_2d;
|
||||||
|
const vector_2d &_vec;
|
||||||
|
const std::size_t _sz;
|
||||||
|
|
||||||
|
/// \brief Helper method for determining the whole array size.
|
||||||
|
/// Required for caching inner vector's size.
|
||||||
|
std::size_t calculate_size(const vector_2d &vec) {
|
||||||
|
return std::accumulate(vec.begin(), vec.end(), (std::size_t)(0),
|
||||||
|
[](auto cnt, const auto &inner_vec) {
|
||||||
|
return cnt + inner_vec.size();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
static const double &get_element_from_offset(const vector_2d &vec,
|
||||||
|
std::size_t offset) {
|
||||||
|
std::size_t row_size = vec[0].size();
|
||||||
|
std::size_t cur_row = offset / row_size;
|
||||||
|
std::size_t cur_column = offset % row_size;
|
||||||
|
return vec[cur_row][cur_column];
|
||||||
|
}
|
||||||
|
|
||||||
|
static vector_2d_view from_vector_2d(const vector_2d &vec) {
|
||||||
|
return vector_2d_view(vec);
|
||||||
|
}
|
||||||
|
std::size_t size() const { return _sz; }
|
||||||
|
vector_2d_view(const vector_2d &vec)
|
||||||
|
: _vec(vec), _sz(calculate_size(vec)) {}
|
||||||
|
|
||||||
|
double operator()(std::size_t i, std::size_t j) {
|
||||||
|
return _vec.at(i).at(j);
|
||||||
|
}
|
||||||
|
friend class iterator;
|
||||||
|
|
||||||
|
class iterator {
|
||||||
|
vector_2d_view *const _vec;
|
||||||
|
std::size_t _row_offset;
|
||||||
|
std::size_t _col_offset;
|
||||||
|
|
||||||
|
static bool is_empty_iterator(const iterator &it) {
|
||||||
|
return it._vec == nullptr;
|
||||||
|
}
|
||||||
|
static bool is_end_iterator(const iterator &it) {
|
||||||
|
return is_empty_iterator(it) ||
|
||||||
|
it._row_offset * it._col_offset >= it._vec->size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
iterator(vector_2d_view *const vec)
|
||||||
|
: _vec(vec), _row_offset(0), _col_offset(0) {}
|
||||||
|
|
||||||
|
bool operator==(const iterator &it) const {
|
||||||
|
return is_end_iterator(it)
|
||||||
|
? is_end_iterator(*this)
|
||||||
|
: it._vec == _vec && it._row_offset == _row_offset &&
|
||||||
|
it._col_offset == _col_offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto operator*() const { return (*_vec)(_row_offset, _col_offset); }
|
||||||
|
|
||||||
|
iterator &operator++() {
|
||||||
|
_col_offset++;
|
||||||
|
if (_col_offset >= _vec->_vec.at(_row_offset).size()) {
|
||||||
|
_col_offset = 0;
|
||||||
|
_row_offset++;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// iterator traits
|
||||||
|
using value_type = double;
|
||||||
|
};
|
||||||
|
iterator begin() { return iterator{this}; }
|
||||||
|
iterator end() { return iterator{nullptr}; }
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_COMMON_H
|
||||||
134
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/util/concepts.h
vendored
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-03.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_CONCEPTS_H
|
||||||
|
#define MATPLOTPLUSPLUS_CONCEPTS_H
|
||||||
|
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <matplot/util/type_traits.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
// https://github.com/Neargye/yacppl/blob/master/include/concepts.hpp
|
||||||
|
// Fallback to type T if Enable is not void
|
||||||
|
template <typename T, typename Enable = void> using type_concept = T;
|
||||||
|
|
||||||
|
// type_concept where Enable is void if C is false
|
||||||
|
template <typename T, bool C>
|
||||||
|
using TypeConcept = type_concept<T, typename std::enable_if_t<C>>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is RValue
|
||||||
|
template <typename T>
|
||||||
|
using RValue = TypeConcept<
|
||||||
|
T, std::is_rvalue_reference<T>::value &&
|
||||||
|
!std::is_const<typename std::remove_reference<T>::type>::value>
|
||||||
|
&&;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is Const
|
||||||
|
template <typename T>
|
||||||
|
using Const = TypeConcept<
|
||||||
|
T, std::is_const<typename std::remove_reference<T>::type>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is NotConst
|
||||||
|
template <typename T>
|
||||||
|
using NotConst = TypeConcept<
|
||||||
|
T, !std::is_const<typename std::remove_reference<T>::type>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is Arithmetic
|
||||||
|
template <typename T>
|
||||||
|
using Arithmetic = TypeConcept<
|
||||||
|
T, std::is_arithmetic<typename std::remove_reference<T>::type>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is Integral
|
||||||
|
template <typename T>
|
||||||
|
using Integral = TypeConcept<
|
||||||
|
T, std::is_integral<typename std::remove_reference<T>::type>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is Pointer
|
||||||
|
template <typename T>
|
||||||
|
using Pointer = TypeConcept<
|
||||||
|
T, std::is_pointer<typename std::remove_reference<T>::type>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is Trivial
|
||||||
|
template <typename T>
|
||||||
|
using Trivial = TypeConcept<
|
||||||
|
T, std::is_trivial<typename std::remove_reference<T>::type>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is TriviallyCopyable
|
||||||
|
template <typename T>
|
||||||
|
using TriviallyCopyable =
|
||||||
|
TypeConcept<T, std::is_trivially_copyable<
|
||||||
|
typename std::remove_reference<T>::type>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is String
|
||||||
|
template <typename T>
|
||||||
|
using String = TypeConcept<T, std::is_same_v<std::decay_t<T>, std::string>>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is NotString
|
||||||
|
template <typename T>
|
||||||
|
using NotString =
|
||||||
|
TypeConcept<T, !std::is_same_v<std::decay_t<T>, std::string>>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is NotString
|
||||||
|
template <typename T>
|
||||||
|
using NotStringConvertible =
|
||||||
|
TypeConcept<T, !std::is_convertible_v<std::decay_t<T>, std::string>>;
|
||||||
|
|
||||||
|
class figure_type;
|
||||||
|
// TypeConcept where C is true only if T is FigureHandle
|
||||||
|
template <typename T>
|
||||||
|
using FigureHandle = TypeConcept<
|
||||||
|
T, std::is_same_v<std::decay_t<T>, std::shared_ptr<class figure_type>>>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is NotFigureHandle
|
||||||
|
template <typename T>
|
||||||
|
using NotFigureHandle =
|
||||||
|
TypeConcept<T, !std::is_same_v<std::decay_t<T>,
|
||||||
|
std::shared_ptr<class figure_type>>>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is Iterable
|
||||||
|
template <typename T>
|
||||||
|
using Iterable = TypeConcept<T, is_iterable_v<std::decay_t<T>>>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is IterableValues
|
||||||
|
template <typename T>
|
||||||
|
using IterableValues = TypeConcept<T, is_iterable_value_v<std::decay_t<T>>>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is IterablePair
|
||||||
|
template <typename T>
|
||||||
|
using IterablePairs = TypeConcept<T, is_iterable_pair_v<std::decay_t<T>>>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is IterableIterables
|
||||||
|
template <typename T>
|
||||||
|
using IterableIterables =
|
||||||
|
TypeConcept<T, is_iterable_iterable_v<std::decay_t<T>>>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is IterableValues
|
||||||
|
template <typename T>
|
||||||
|
using NotAxesHandle =
|
||||||
|
TypeConcept<T, !std::is_same_v<std::decay_t<T>, axes_handle>>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is an initializer list
|
||||||
|
template <typename T>
|
||||||
|
using InitializerList = TypeConcept<T, is_initializer_list<T>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is not an initializer list
|
||||||
|
template <typename T>
|
||||||
|
using NotInitializerList = TypeConcept<T, !is_initializer_list<T>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is a vector
|
||||||
|
template <typename T> using Vector = TypeConcept<T, is_vector<T>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is not a vector
|
||||||
|
template <typename T> using NotVector = TypeConcept<T, is_vector<T>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is a pair
|
||||||
|
template <typename T> using Pair = TypeConcept<T, is_pair<T>::value>;
|
||||||
|
|
||||||
|
// TypeConcept where C is true only if T is not a pair
|
||||||
|
template <typename T> using NotPair = TypeConcept<T, is_pair<T>::value>;
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_CONCEPTS_H
|
||||||
622
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/util/contourc.h
vendored
Normal file
@ -0,0 +1,622 @@
|
|||||||
|
//
|
||||||
|
// Adapted from
|
||||||
|
// https://github.com/matplotlib/matplotlib/blob/master/src/_contour.h
|
||||||
|
// and
|
||||||
|
// https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/contour.py
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_CONTOURC_H
|
||||||
|
#define MATPLOTPLUSPLUS_CONTOURC_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* QuadContourGenerator
|
||||||
|
* --------------------
|
||||||
|
* A QuadContourGenerator generates contours for scalar fields defined on
|
||||||
|
* quadrilateral grids. A single QuadContourGenerator object can create both
|
||||||
|
* line contours (at single levels) and filled contours (between pairs of
|
||||||
|
* levels) for the same field.
|
||||||
|
*
|
||||||
|
* A field to be contoured has nx, ny points in the x- and y-directions
|
||||||
|
* respectively. The quad grid is defined by x and y arrays of shape(ny, nx),
|
||||||
|
* and the field itself is the z array also of shape(ny, nx). There is an
|
||||||
|
* optional boolean mask; if it exists then it also has shape(ny, nx). The
|
||||||
|
* mask applies to grid points rather than quads.
|
||||||
|
*
|
||||||
|
* How quads are masked based on the point mask is determined by the boolean
|
||||||
|
* 'corner_mask' flag. If false then any quad that has one or more of its four
|
||||||
|
* corner points masked is itself masked. If true the behaviour is the same
|
||||||
|
* except that any quad which has exactly one of its four corner points masked
|
||||||
|
* has only the triangular corner (half of the quad) adjacent to that point
|
||||||
|
* masked; the opposite triangular corner has three unmasked points and is not
|
||||||
|
* masked.
|
||||||
|
*
|
||||||
|
* By default the entire domain of nx*ny points is contoured together which can
|
||||||
|
* result in some very long polygons. The alternative is to break up the
|
||||||
|
* domain into subdomains or 'chunks' of smaller size, each of which is
|
||||||
|
* independently contoured. The size of these chunks is controlled by the
|
||||||
|
* 'nchunk' (or 'chunk_size') parameter. Chunking not only results in shorter
|
||||||
|
* polygons but also requires slightly less RAM. It can result in rendering
|
||||||
|
* artifacts though, depending on backend, antialiased flag and alpha value.
|
||||||
|
*
|
||||||
|
* Notation
|
||||||
|
* --------
|
||||||
|
* i and j are array indices in the x- and y-directions respectively. Although
|
||||||
|
* a single element of an array z can be accessed using z[j][i] or z(j,i), it
|
||||||
|
* is often convenient to use the single quad index z[quad], where
|
||||||
|
* quad = i + j*nx
|
||||||
|
* and hence
|
||||||
|
* i = quad % nx
|
||||||
|
* j = quad / nx
|
||||||
|
*
|
||||||
|
* Rather than referring to x- and y-directions, compass directions are used
|
||||||
|
* instead such that W, E, S, N refer to the -x, +x, -y, +y directions
|
||||||
|
* respectively. To move one quad to the E you would therefore add 1 to the
|
||||||
|
* quad index, to move one quad to the N you would add nx to the quad index.
|
||||||
|
*
|
||||||
|
* Cache
|
||||||
|
* -----
|
||||||
|
* Lots of information that is reused during contouring is stored as single
|
||||||
|
* bits in a mesh-sized cache, indexed by quad. Each quad's cache entry stores
|
||||||
|
* information about the quad itself such as if it is masked, and about the
|
||||||
|
* point at the SW corner of the quad, and about the W and S edges. Hence
|
||||||
|
* information about each point and each edge is only stored once in the cache.
|
||||||
|
*
|
||||||
|
* Cache information is divided into two types: that which is constant over the
|
||||||
|
* lifetime of the QuadContourGenerator, and that which changes for each
|
||||||
|
* contouring operation. The former is all grid-specific information such
|
||||||
|
* as quad and corner masks, and which edges are boundaries, either between
|
||||||
|
* masked and non-masked regions or between adjacent chunks. The latter
|
||||||
|
* includes whether points lie above or below the current contour levels, plus
|
||||||
|
* some flags to indicate how the contouring is progressing.
|
||||||
|
*
|
||||||
|
* Line Contours
|
||||||
|
* -------------
|
||||||
|
* A line contour connects points with the same z-value. Each point of such a
|
||||||
|
* contour occurs on an edge of the grid, at a point linearly interpolated to
|
||||||
|
* the contour z-level from the z-values at the end points of the edge. The
|
||||||
|
* direction of a line contour is such that higher values are to the left of
|
||||||
|
* the contour, so any edge that the contour passes through will have a left-
|
||||||
|
* hand end point with z > contour level and a right-hand end point with
|
||||||
|
* z <= contour level.
|
||||||
|
*
|
||||||
|
* Line contours are of two types. Firstly there are open line strips that
|
||||||
|
* start on a boundary, traverse the interior of the domain and end on a
|
||||||
|
* boundary. Secondly there are closed line loops that occur completely within
|
||||||
|
* the interior of the domain and do not touch a boundary.
|
||||||
|
*
|
||||||
|
* The QuadContourGenerator makes two sweeps through the grid to generate line
|
||||||
|
* contours for a particular level. In the first sweep it looks only for start
|
||||||
|
* points that occur on boundaries, and when it finds one it follows the
|
||||||
|
* contour through the interior until it finishes on another boundary edge.
|
||||||
|
* Each quad that is visited by the algorithm has a 'visited' flag set in the
|
||||||
|
* cache to indicate that the quad does not need to be visited again. In the
|
||||||
|
* second sweep all non-visited quads are checked to see if they contain part
|
||||||
|
* of an interior closed loop, and again each time one is found it is followed
|
||||||
|
* through the domain interior until it returns back to its start quad and is
|
||||||
|
* therefore completed.
|
||||||
|
*
|
||||||
|
* The situation is complicated by saddle quads that have two opposite corners
|
||||||
|
* with z >= contour level and the other two corners with z < contour level.
|
||||||
|
* These therefore contain two segments of a line contour, and the visited
|
||||||
|
* flags take account of this by only being set on the second visit. On the
|
||||||
|
* first visit a number of saddle flags are set in the cache to indicate which
|
||||||
|
* one of the two segments has been completed so far.
|
||||||
|
*
|
||||||
|
* Filled Contours
|
||||||
|
* ---------------
|
||||||
|
* Filled contours are produced between two contour levels and are always
|
||||||
|
* closed polygons. They can occur completely within the interior of the
|
||||||
|
* domain without touching a boundary, following either the lower or upper
|
||||||
|
* contour levels. Those on the lower level are exactly like interior line
|
||||||
|
* contours with higher values on the left. Those on the upper level are
|
||||||
|
* reversed such that higher values are on the right.
|
||||||
|
*
|
||||||
|
* Filled contours can also involve a boundary in which case they consist of
|
||||||
|
* one or more sections along a boundary and one or more sections through the
|
||||||
|
* interior. Interior sections can be on either level, and again those on the
|
||||||
|
* upper level have higher values on the right. Boundary sections can remain
|
||||||
|
* on either contour level or switch between the two.
|
||||||
|
*
|
||||||
|
* Once the start of a filled contour is found, the algorithm is similar to
|
||||||
|
* that for line contours in that it follows the contour to its end, which
|
||||||
|
* because filled contours are always closed polygons will be by returning
|
||||||
|
* back to the start. However, because two levels must be considered, each
|
||||||
|
* level has its own set of saddle and visited flags and indeed some extra
|
||||||
|
* visited flags for boundary edges.
|
||||||
|
*
|
||||||
|
* The major complication for filled contours is that some polygons can be
|
||||||
|
* holes (with points ordered clockwise) within other polygons (with points
|
||||||
|
* ordered anticlockwise). When it comes to rendering filled contours each
|
||||||
|
* non-hole polygon must be rendered along with its zero or more contained
|
||||||
|
* holes or the rendering will not be correct. The filled contour finding
|
||||||
|
* algorithm could progress pretty much as the line contour algorithm does,
|
||||||
|
* taking each polygon as it is found, but then at the end there would have to
|
||||||
|
* be an extra step to identify the parent non-hole polygon for each hole.
|
||||||
|
* This is not a particularly onerous task but it does not scale well and can
|
||||||
|
* easily dominate the execution time of the contour finding for even modest
|
||||||
|
* problems. It is much better to identity each hole's parent non-hole during
|
||||||
|
* the sweep algorithm.
|
||||||
|
*
|
||||||
|
* This requirement dictates the order that filled contours are identified. As
|
||||||
|
* the algorithm sweeps up through the grid, every time a polygon passes
|
||||||
|
* through a quad a ParentCache object is updated with the new possible parent.
|
||||||
|
* When a new hole polygon is started, the ParentCache is used to find the
|
||||||
|
* first possible parent in the same quad or to the S of it. Great care is
|
||||||
|
* needed each time a new quad is checked to see if a new polygon should be
|
||||||
|
* started, as a single quad can have multiple polygon starts, e.g. a quad
|
||||||
|
* could be a saddle quad for both lower and upper contour levels, meaning it
|
||||||
|
* has four contour line segments passing through it which could all be from
|
||||||
|
* different polygons. The S-most polygon must be started first, then the next
|
||||||
|
* S-most and so on until the N-most polygon is started in that quad.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// #include "numpy_cpp.h"
|
||||||
|
// https://github.com/matplotlib/matplotlib/blob/master/src/numpy_cpp.h
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <matplot/core/axes_type.h>
|
||||||
|
#include <matplot/util/common.h>
|
||||||
|
#include <matplot/util/handle_types.h>
|
||||||
|
#include <array>
|
||||||
|
#include <cmath>
|
||||||
|
#include <iostream>
|
||||||
|
#include <list>
|
||||||
|
#include <numeric>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
|
||||||
|
// Edge of a quad including diagonal edges of masked quads if _corner_mask
|
||||||
|
// true.
|
||||||
|
enum class Edge {
|
||||||
|
// Listing values here so easier to check for debug purposes.
|
||||||
|
Edge_None = -1,
|
||||||
|
Edge_E = 0,
|
||||||
|
Edge_N = 1,
|
||||||
|
Edge_W = 2,
|
||||||
|
Edge_S = 3,
|
||||||
|
// The following are only used if _corner_mask is true.
|
||||||
|
Edge_NE = 4,
|
||||||
|
Edge_NW = 5,
|
||||||
|
Edge_SW = 6,
|
||||||
|
Edge_SE = 7
|
||||||
|
};
|
||||||
|
|
||||||
|
// Combination of a quad and an edge of that quad.
|
||||||
|
// An invalid quad edge has quad of -1.
|
||||||
|
struct MATPLOT_EXPORTS QuadEdge {
|
||||||
|
QuadEdge();
|
||||||
|
|
||||||
|
QuadEdge(long quad_, Edge edge_);
|
||||||
|
|
||||||
|
bool operator<(const QuadEdge &other) const;
|
||||||
|
|
||||||
|
bool operator==(const QuadEdge &other) const;
|
||||||
|
|
||||||
|
bool operator!=(const QuadEdge &other) const;
|
||||||
|
|
||||||
|
friend std::ostream &operator<<(std::ostream &os,
|
||||||
|
const QuadEdge &quad_edge);
|
||||||
|
|
||||||
|
long quad;
|
||||||
|
Edge edge;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 2D point with x,y coordinates.
|
||||||
|
struct MATPLOT_EXPORTS XY {
|
||||||
|
XY();
|
||||||
|
|
||||||
|
XY(const double &x_, const double &y_);
|
||||||
|
|
||||||
|
bool operator==(const XY &other) const;
|
||||||
|
|
||||||
|
bool operator!=(const XY &other) const;
|
||||||
|
|
||||||
|
XY operator*(const double &multiplier) const;
|
||||||
|
|
||||||
|
const XY &operator+=(const XY &other);
|
||||||
|
|
||||||
|
const XY &operator-=(const XY &other);
|
||||||
|
|
||||||
|
XY operator+(const XY &other) const;
|
||||||
|
|
||||||
|
XY operator-(const XY &other) const;
|
||||||
|
|
||||||
|
friend std::ostream &operator<<(std::ostream &os, const XY &xy);
|
||||||
|
|
||||||
|
double x, y;
|
||||||
|
};
|
||||||
|
|
||||||
|
// A single line of a contour, which may be a closed line loop or an open
|
||||||
|
// line strip. Identical adjacent points are avoided using push_back(). A
|
||||||
|
// ContourLine is either a hole (points ordered clockwise) or it is not
|
||||||
|
// (points ordered anticlockwise). Each hole has a parent ContourLine that
|
||||||
|
// is not a hole; each non-hole contains zero or more child holes. A
|
||||||
|
// non-hole and its child holes must be rendered together to obtain the
|
||||||
|
// correct results.
|
||||||
|
class MATPLOT_EXPORTS ContourLine : public std::vector<XY> {
|
||||||
|
public:
|
||||||
|
typedef std::list<ContourLine *> Children;
|
||||||
|
|
||||||
|
ContourLine(bool is_hole);
|
||||||
|
|
||||||
|
void add_child(ContourLine *child);
|
||||||
|
|
||||||
|
void clear_parent();
|
||||||
|
|
||||||
|
const Children &get_children() const;
|
||||||
|
|
||||||
|
const ContourLine *get_parent() const;
|
||||||
|
|
||||||
|
ContourLine *get_parent();
|
||||||
|
|
||||||
|
bool is_hole() const;
|
||||||
|
|
||||||
|
void push_back(const XY &point);
|
||||||
|
|
||||||
|
void set_parent(ContourLine *parent);
|
||||||
|
|
||||||
|
void write() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _is_hole;
|
||||||
|
ContourLine *_parent; // Only set if is_hole, not owned.
|
||||||
|
Children _children; // Only set if !is_hole, not owned.
|
||||||
|
};
|
||||||
|
|
||||||
|
// A Contour is a collection of zero or more ContourLines.
|
||||||
|
class MATPLOT_EXPORTS Contour : public std::vector<ContourLine *> {
|
||||||
|
public:
|
||||||
|
Contour();
|
||||||
|
|
||||||
|
virtual ~Contour();
|
||||||
|
|
||||||
|
void delete_contour_lines();
|
||||||
|
|
||||||
|
void write() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Single chunk of ContourLine parents, indexed by quad. As a chunk's
|
||||||
|
// filled contours are created, the ParentCache is updated each time a
|
||||||
|
// ContourLine passes through each quad. When a new ContourLine is created,
|
||||||
|
// if it is a hole its parent ContourLine is read from the ParentCache by
|
||||||
|
// looking at the start quad, then each quad to the S in turn until a
|
||||||
|
// non-zero ContourLine is found.
|
||||||
|
class MATPLOT_EXPORTS ParentCache {
|
||||||
|
public:
|
||||||
|
ParentCache() = default;
|
||||||
|
|
||||||
|
ParentCache(long nx, long x_chunk_points, long y_chunk_points);
|
||||||
|
|
||||||
|
ContourLine *get_parent(long quad);
|
||||||
|
|
||||||
|
void set_chunk_starts(long istart, long jstart);
|
||||||
|
|
||||||
|
void set_parent(long quad, ContourLine &contour_line);
|
||||||
|
|
||||||
|
private:
|
||||||
|
long quad_to_index(long quad) const;
|
||||||
|
|
||||||
|
long _nx;
|
||||||
|
long _x_chunk_points, _y_chunk_points; // Number of points not quads.
|
||||||
|
std::vector<ContourLine *> _lines; // Not owned.
|
||||||
|
long _istart, _jstart;
|
||||||
|
};
|
||||||
|
|
||||||
|
// See overview of algorithm at top of file.
|
||||||
|
class MATPLOT_EXPORTS QuadContourGenerator {
|
||||||
|
public:
|
||||||
|
// using CoordinateArray = numpy::array_view<const double, 2>;
|
||||||
|
using CoordinateArray = vector_2d;
|
||||||
|
// using MaskArray = numpy::array_view<const bool, 2>;
|
||||||
|
using MaskArray = std::array<const bool, 2>;
|
||||||
|
|
||||||
|
// This constructor is just a placeholder
|
||||||
|
// This object will obviously not work
|
||||||
|
QuadContourGenerator() = default;
|
||||||
|
|
||||||
|
// Constructor with optional mask.
|
||||||
|
// x, y, z: double arrays of shape (ny,nx).
|
||||||
|
// mask: boolean array, ether empty (if no mask), or of shape (ny,nx).
|
||||||
|
// corner_mask: flag for different masking behaviour.
|
||||||
|
// chunk_size: 0 for no chunking, or +ve integer for size of chunks
|
||||||
|
// that
|
||||||
|
// the domain is subdivided into.
|
||||||
|
// https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/contour.py
|
||||||
|
QuadContourGenerator(const vector_2d &x, const vector_2d &y,
|
||||||
|
const vector_2d &z, bool corner_mask,
|
||||||
|
long chunk_size);
|
||||||
|
|
||||||
|
// Create and return polygons for a line (i.e. non-filled) contour at
|
||||||
|
// the specified level.
|
||||||
|
using vertices_list_type = std::pair<vector_1d, vector_1d>;
|
||||||
|
vertices_list_type create_contour(const double &level);
|
||||||
|
|
||||||
|
// Create and return polygons for a filled contour between the two
|
||||||
|
// specified levels.
|
||||||
|
using codes_list_type = std::vector<unsigned char>;
|
||||||
|
std::pair<vertices_list_type, codes_list_type>
|
||||||
|
create_filled_contour(const double &lower_level,
|
||||||
|
const double &upper_level);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Typedef for following either a boundary of the domain or the
|
||||||
|
// interior; clearer than using a boolean.
|
||||||
|
enum class BoundaryOrInterior { Boundary, Interior };
|
||||||
|
|
||||||
|
// Typedef for direction of movement from one quad to the next.
|
||||||
|
enum class Dir { Dir_Right = -1, Dir_Straight = 0, Dir_Left = +1 };
|
||||||
|
|
||||||
|
// Typedef for a polygon being a hole or not; clearer than using a
|
||||||
|
// boolean.
|
||||||
|
enum class HoleOrNot { NotHole, Hole };
|
||||||
|
|
||||||
|
// Append a C++ ContourLine to the end of a python list. Used for line
|
||||||
|
// contours where each ContourLine is converted to a separate numpy
|
||||||
|
// array of (x,y) points. Clears the ContourLine too.
|
||||||
|
void append_contour_line_to_vertices(
|
||||||
|
ContourLine &contour_line, vertices_list_type &vertices_list) const;
|
||||||
|
|
||||||
|
// Append a C++ Contour to the end of two python lists. Used for filled
|
||||||
|
// contours where each non-hole ContourLine and its child holes are
|
||||||
|
// represented by a numpy array of (x,y) points and a second numpy array
|
||||||
|
// of 'kinds' or 'codes' that indicates where the points array is split
|
||||||
|
// into individual polygons. Clears the Contour too, freeing each
|
||||||
|
// ContourLine as soon as possible for minimum RAM usage.
|
||||||
|
void
|
||||||
|
append_contour_to_vertices_and_codes(Contour &contour,
|
||||||
|
vertices_list_type &vertices_list,
|
||||||
|
codes_list_type &codes_list) const;
|
||||||
|
|
||||||
|
// Return number of chunks that fit in the specified point_count.
|
||||||
|
long calc_chunk_count(long point_count) const;
|
||||||
|
|
||||||
|
// Return the point on the specified QuadEdge that intersects the
|
||||||
|
// specified level.
|
||||||
|
XY edge_interp(const QuadEdge &quad_edge, const double &level);
|
||||||
|
|
||||||
|
// Follow a contour along a boundary, appending points to the
|
||||||
|
// ContourLine as it progresses. Only called for filled contours. Stops
|
||||||
|
// when the contour leaves the boundary to move into the interior of the
|
||||||
|
// domain, or when the start_quad_edge is reached in which case the
|
||||||
|
// ContourLine is a completed closed loop. Always adds the end point of
|
||||||
|
// each boundary edge to the ContourLine, regardless of whether moving
|
||||||
|
// to another boundary edge or leaving the boundary into the interior.
|
||||||
|
// Never adds the start point of the first boundary edge to the
|
||||||
|
// ContourLine.
|
||||||
|
// contour_line: ContourLine to append points to.
|
||||||
|
// quad_edge: on entry the QuadEdge to start from, on exit the
|
||||||
|
// QuadEdge
|
||||||
|
// that is stopped on.
|
||||||
|
// lower_level: lower contour z-value.
|
||||||
|
// upper_level: upper contour z-value.
|
||||||
|
// level_index: level index started on (1 = lower, 2 = upper level).
|
||||||
|
// start_quad_edge: QuadEdge that the ContourLine started from, which
|
||||||
|
// is
|
||||||
|
// used to check if the ContourLine is finished.
|
||||||
|
// Returns the end level_index.
|
||||||
|
unsigned int follow_boundary(ContourLine &contour_line,
|
||||||
|
QuadEdge &quad_edge,
|
||||||
|
const double &lower_level,
|
||||||
|
const double &upper_level,
|
||||||
|
unsigned int level_index,
|
||||||
|
const QuadEdge &start_quad_edge);
|
||||||
|
|
||||||
|
// Follow a contour across the interior of the domain, appending points
|
||||||
|
// to the ContourLine as it progresses. Called for both line and filled
|
||||||
|
// contours. Stops when the contour reaches a boundary or, if the
|
||||||
|
// start_quad_edge is specified, when quad_edge == start_quad_edge and
|
||||||
|
// level_index == start_level_index. Always adds the end point of each
|
||||||
|
// quad traversed to the ContourLine; only adds the start point of the
|
||||||
|
// first quad if want_initial_point flag is true.
|
||||||
|
// contour_line: ContourLine to append points to.
|
||||||
|
// quad_edge: on entry the QuadEdge to start from, on exit the
|
||||||
|
// QuadEdge
|
||||||
|
// that is stopped on.
|
||||||
|
// level_index: level index started on (1 = lower, 2 = upper level).
|
||||||
|
// level: contour z-value.
|
||||||
|
// want_initial_point: whether want to append the initial point to the
|
||||||
|
// ContourLine or not.
|
||||||
|
// start_quad_edge: the QuadEdge that the ContourLine started from to
|
||||||
|
// check if the ContourLine is finished, or 0 if no check should
|
||||||
|
// occur.
|
||||||
|
// start_level_index: the level_index that the ContourLine started
|
||||||
|
// from. set_parents: whether should set ParentCache as it progresses
|
||||||
|
// or not.
|
||||||
|
// This is true for filled contours, false for line contours.
|
||||||
|
void follow_interior(ContourLine &contour_line, QuadEdge &quad_edge,
|
||||||
|
unsigned int level_index, const double &level,
|
||||||
|
bool want_initial_point,
|
||||||
|
const QuadEdge *start_quad_edge,
|
||||||
|
unsigned int start_level_index, bool set_parents);
|
||||||
|
|
||||||
|
// Return the index limits of a particular chunk.
|
||||||
|
void get_chunk_limits(long ijchunk, long &ichunk, long &jchunk,
|
||||||
|
long &istart, long &iend, long &jstart,
|
||||||
|
long &jend);
|
||||||
|
|
||||||
|
// Check if a contour starts within the specified corner quad on the
|
||||||
|
// specified level_index, and if so return the start edge. Otherwise
|
||||||
|
// return Edge_None.
|
||||||
|
Edge get_corner_start_edge(long quad, unsigned int level_index) const;
|
||||||
|
|
||||||
|
// Return index of point at start or end of specified QuadEdge, assuming
|
||||||
|
// anticlockwise ordering around non-masked quads.
|
||||||
|
long get_edge_point_index(const QuadEdge &quad_edge, bool start) const;
|
||||||
|
|
||||||
|
// Return the edge to exit a quad from, given the specified entry
|
||||||
|
// quad_edge and direction to move in.
|
||||||
|
Edge get_exit_edge(const QuadEdge &quad_edge, Dir dir) const;
|
||||||
|
|
||||||
|
// Return the (x,y) coordinates of the specified point index.
|
||||||
|
XY get_point_xy(long point) const;
|
||||||
|
|
||||||
|
// Return the z-value of the specified point index.
|
||||||
|
const double &get_point_z(long point) const;
|
||||||
|
|
||||||
|
// Check if a contour starts within the specified non-corner quad on the
|
||||||
|
// specified level_index, and if so return the start edge. Otherwise
|
||||||
|
// return Edge_None.
|
||||||
|
Edge get_quad_start_edge(long quad, unsigned int level_index) const;
|
||||||
|
|
||||||
|
// Check if a contour starts within the specified quad, whether it is a
|
||||||
|
// corner or a full quad, and if so return the start edge. Otherwise
|
||||||
|
// return Edge_None.
|
||||||
|
Edge get_start_edge(long quad, unsigned int level_index) const;
|
||||||
|
|
||||||
|
// Initialise the cache to contain grid information that is constant
|
||||||
|
// across the lifetime of this object, i.e. does not vary between calls
|
||||||
|
// to create_contour() and create_filled_contour().
|
||||||
|
void init_cache_grid();
|
||||||
|
|
||||||
|
// Initialise the cache with information that is specific to contouring
|
||||||
|
// the specified two levels. The levels are the same for contour lines,
|
||||||
|
// different for filled contours.
|
||||||
|
void init_cache_levels(const double &lower_level,
|
||||||
|
const double &upper_level);
|
||||||
|
|
||||||
|
// Return the (x,y) point at which the level intersects the line
|
||||||
|
// connecting the two specified point indices.
|
||||||
|
XY interp(long point1, long point2, const double &level) const;
|
||||||
|
|
||||||
|
// Return true if the specified QuadEdge is a boundary, i.e. is either
|
||||||
|
// an edge between a masked and non-masked quad/corner or is a chunk
|
||||||
|
// boundary.
|
||||||
|
bool is_edge_a_boundary(const QuadEdge &quad_edge) const;
|
||||||
|
|
||||||
|
// Follow a boundary from one QuadEdge to the next in an anticlockwise
|
||||||
|
// manner around the non-masked region.
|
||||||
|
void move_to_next_boundary_edge(QuadEdge &quad_edge) const;
|
||||||
|
|
||||||
|
// Move from the quad specified by quad_edge.quad to the neighbouring
|
||||||
|
// quad by crossing the edge specified by quad_edge.edge.
|
||||||
|
void move_to_next_quad(QuadEdge &quad_edge) const;
|
||||||
|
|
||||||
|
// Check for filled contours starting within the specified quad and
|
||||||
|
// complete any that are found, appending them to the specified Contour.
|
||||||
|
void single_quad_filled(Contour &contour, long quad,
|
||||||
|
const double &lower_level,
|
||||||
|
const double &upper_level);
|
||||||
|
|
||||||
|
// Start and complete a filled contour line.
|
||||||
|
// quad: index of quad to start ContourLine in.
|
||||||
|
// edge: edge of quad to start ContourLine from.
|
||||||
|
// start_level_index: the level_index that the ContourLine starts
|
||||||
|
// from. hole_or_not: whether the ContourLine is a hole or not.
|
||||||
|
// boundary_or_interior: whether the ContourLine starts on a boundary
|
||||||
|
// or
|
||||||
|
// the interior.
|
||||||
|
// lower_level: lower contour z-value.
|
||||||
|
// upper_level: upper contour z-value.
|
||||||
|
// Returns newly created ContourLine.
|
||||||
|
ContourLine *start_filled(long quad, Edge edge,
|
||||||
|
unsigned int start_level_index,
|
||||||
|
HoleOrNot hole_or_not,
|
||||||
|
BoundaryOrInterior boundary_or_interior,
|
||||||
|
const double &lower_level,
|
||||||
|
const double &upper_level);
|
||||||
|
|
||||||
|
// Start and complete a line contour that both starts and end on a
|
||||||
|
// boundary, traversing the interior of the domain.
|
||||||
|
// vertices_list: Python list that the ContourLine should be appended
|
||||||
|
// to. quad: index of quad to start ContourLine in. edge: boundary
|
||||||
|
// edge to start ContourLine from. level: contour z-value.
|
||||||
|
// Returns true if the start quad does not need to be visited again,
|
||||||
|
// i.e. VISITED(quad,1).
|
||||||
|
bool start_line(vertices_list_type &vertices_list, long quad, Edge edge,
|
||||||
|
const double &level);
|
||||||
|
|
||||||
|
// Debug function that writes the cache status to stdout.
|
||||||
|
void write_cache(bool grid_only = false) const;
|
||||||
|
|
||||||
|
// Debug function that writes that cache status for a single quad to
|
||||||
|
// stdout.
|
||||||
|
void write_cache_quad(long quad, bool grid_only) const;
|
||||||
|
|
||||||
|
// Note that mask is not stored as once it has been used to initialise
|
||||||
|
// the cache it is no longer needed.
|
||||||
|
CoordinateArray _x, _y, _z;
|
||||||
|
long _nx, _ny; // Number of points in each direction.
|
||||||
|
long _n; // Total number of points (and hence quads).
|
||||||
|
|
||||||
|
bool _corner_mask;
|
||||||
|
long _chunk_size; // Number of quads per chunk (not points).
|
||||||
|
// Always > 0, unlike python nchunk which is 0
|
||||||
|
// for no chunking.
|
||||||
|
|
||||||
|
long _nxchunk, _nychunk; // Number of chunks in each direction.
|
||||||
|
long _chunk_count; // Total number of chunks.
|
||||||
|
|
||||||
|
typedef uint32_t CacheItem;
|
||||||
|
std::vector<CacheItem> _cache;
|
||||||
|
|
||||||
|
ParentCache _parent_cache; // On W quad sides.
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Segments are considered as including their end-points; i.e if the
|
||||||
|
// closest point on the path is a node in *xys* with index *i*,
|
||||||
|
// this
|
||||||
|
// returns ``(i-1, i)``. For the special case where *xys* is a
|
||||||
|
// single
|
||||||
|
// point, this returns ``(0, 0)``.
|
||||||
|
/// \param xys Coordinates of vertices
|
||||||
|
/// \param p Coordinates of point
|
||||||
|
/// \return Minimum square distance of *p* to *xys*.
|
||||||
|
/// \return Projection of *p* onto *xys*.
|
||||||
|
/// \return Consecutive indices of vertices of segment in *xys* where
|
||||||
|
/// *proj* is.
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::tuple<double, std::pair<double, double>, std::pair<size_t, size_t>>
|
||||||
|
find_closest_point_on_path(const std::vector<double> &xs,
|
||||||
|
const std::vector<double> &ys, double px,
|
||||||
|
double py);
|
||||||
|
|
||||||
|
/// \brief Compute contour lines
|
||||||
|
///
|
||||||
|
/// This will use a square tracing algorithm to find the contour points
|
||||||
|
/// of a contour line. We look for level transitions on every
|
||||||
|
/// grid quadrant and determine the specific point with an interpolation
|
||||||
|
/// that considers how far the the points in the quadrant are for the
|
||||||
|
/// contour level.
|
||||||
|
///
|
||||||
|
/// We compute these lines outside gnuplot because creating contour lines
|
||||||
|
/// in 2d plots (with the "plot" command) in gnuplot involves so many
|
||||||
|
/// work-arounds that it is just not worth it.
|
||||||
|
///
|
||||||
|
/// \see
|
||||||
|
/// https://en.wikipedia.org/wiki/Boundary_tracing#Square_tracing_algorithm
|
||||||
|
/// \see
|
||||||
|
/// http://www.batesville.k12.in.us/physics/CalcNet/grapher/how_it_works.htm
|
||||||
|
/// \see http://dx.doi.org/10.1093/comjnl/33.5.402
|
||||||
|
/// \see http://dx.doi.org/10.1016/0097-8493%2891%2990002-Y
|
||||||
|
/// \see http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=576861
|
||||||
|
/// \see https://github.com/matplotlib/matplotlib/blob/master/src/_contour.h
|
||||||
|
using contour_line_type = std::pair<vector_1d, vector_1d>;
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
contour_line_type contour_line(const vector_2d &x, const vector_2d &y,
|
||||||
|
const vector_2d &z, double level);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<contour_line_type> contourc(const vector_2d &x,
|
||||||
|
const vector_2d &y,
|
||||||
|
const vector_2d &z,
|
||||||
|
const vector_1d &levels);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<contour_line_type> contourc(const vector_2d &x,
|
||||||
|
const vector_2d &y,
|
||||||
|
const vector_2d &z,
|
||||||
|
size_t n_levels = 7);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<contour_line_type> contourc(const vector_2d &z,
|
||||||
|
const vector_1d &levels);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::vector<contour_line_type> contourc(const vector_2d &z,
|
||||||
|
size_t n_levels = 7);
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_CONTOURC_H
|
||||||
51
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/util/geodata.h
vendored
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 20/07/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_GEODATA_H
|
||||||
|
#define MATPLOTPLUSPLUS_GEODATA_H
|
||||||
|
|
||||||
|
#include <matplot/detail/config.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<std::vector<double>, std::vector<double>> &world_map_10m();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<std::vector<double>, std::vector<double>> &world_map_50m();
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::pair<std::vector<double>, std::vector<double>> &world_map_110m();
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::tuple<std::vector<double>, std::vector<double>,
|
||||||
|
std::vector<std::string>> &
|
||||||
|
world_cities();
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::tuple<std::vector<double>, std::vector<double>,
|
||||||
|
std::vector<std::string>>
|
||||||
|
world_cities(double min_x_distance_per_char, double min_y_distance);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::tuple<std::vector<double>, std::vector<double>>
|
||||||
|
greedy_tsp(const std::vector<double> &x, const std::vector<double> &y,
|
||||||
|
size_t starting_city = 0);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::tuple<std::vector<double>, std::vector<double>, std::vector<size_t>>
|
||||||
|
greedy_tsp_with_idx(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y, size_t starting_city = 0);
|
||||||
|
|
||||||
|
MATPLOT_EXPORTS
|
||||||
|
std::tuple<std::vector<double>, std::vector<double>,
|
||||||
|
std::vector<std::string>>
|
||||||
|
clear_overlapping_labels(const std::vector<double> &x,
|
||||||
|
const std::vector<double> &y,
|
||||||
|
const std::vector<std::string> &names,
|
||||||
|
double min_x_distance_per_char,
|
||||||
|
double min_y_distance);
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_GEODATA_H
|
||||||
93
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/util/handle_types.h
vendored
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-06.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_HANDLE_TYPES_H
|
||||||
|
#define MATPLOTPLUSPLUS_HANDLE_TYPES_H
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
using color_array = std::array<float, 4>;
|
||||||
|
|
||||||
|
class figure_type;
|
||||||
|
using figure_handle = std::shared_ptr<class figure_type>;
|
||||||
|
|
||||||
|
class axes_type;
|
||||||
|
using axes_handle = std::shared_ptr<class axes_type>;
|
||||||
|
|
||||||
|
class axes_object;
|
||||||
|
using axes_object_handle = std::shared_ptr<class axes_object>;
|
||||||
|
|
||||||
|
class legend;
|
||||||
|
using legend_handle = std::shared_ptr<class legend>;
|
||||||
|
|
||||||
|
class string_function;
|
||||||
|
using string_function_handle = std::shared_ptr<class string_function>;
|
||||||
|
|
||||||
|
class line;
|
||||||
|
using line_handle = std::shared_ptr<class line>;
|
||||||
|
using scatter_handle = std::shared_ptr<class line>;
|
||||||
|
|
||||||
|
class stair;
|
||||||
|
using stair_handle = std::shared_ptr<class stair>;
|
||||||
|
|
||||||
|
class error_bar;
|
||||||
|
using error_bar_handle = std::shared_ptr<class error_bar>;
|
||||||
|
|
||||||
|
class filled_area;
|
||||||
|
using filled_area_handle = std::shared_ptr<class filled_area>;
|
||||||
|
|
||||||
|
class function_line;
|
||||||
|
using function_line_handle = std::shared_ptr<class function_line>;
|
||||||
|
|
||||||
|
class histogram;
|
||||||
|
using histogram_handle = std::shared_ptr<class histogram>;
|
||||||
|
|
||||||
|
class box_chart;
|
||||||
|
using box_chart_handle = std::shared_ptr<class box_chart>;
|
||||||
|
|
||||||
|
class parallel_lines;
|
||||||
|
using parallel_lines_handle = std::shared_ptr<class parallel_lines>;
|
||||||
|
|
||||||
|
class circles;
|
||||||
|
using circles_handle = std::shared_ptr<class circles>;
|
||||||
|
|
||||||
|
class labels;
|
||||||
|
using labels_handle = std::shared_ptr<class labels>;
|
||||||
|
|
||||||
|
class matrix;
|
||||||
|
using matrix_handle = std::shared_ptr<class matrix>;
|
||||||
|
|
||||||
|
class bars;
|
||||||
|
using bars_handle = std::shared_ptr<class bars>;
|
||||||
|
|
||||||
|
class vectors;
|
||||||
|
using vectors_handle = std::shared_ptr<class vectors>;
|
||||||
|
|
||||||
|
class contours;
|
||||||
|
using contours_handle = std::shared_ptr<class contours>;
|
||||||
|
|
||||||
|
class surface;
|
||||||
|
using surface_handle = std::shared_ptr<class surface>;
|
||||||
|
|
||||||
|
class network;
|
||||||
|
using network_handle = std::shared_ptr<class network>;
|
||||||
|
|
||||||
|
/// Bin scatter style
|
||||||
|
enum class bin_scatter_style {
|
||||||
|
automatic, // decide automatically depending on the data
|
||||||
|
point_size, // size proportional to values in the bin
|
||||||
|
point_alpha, // number of elements in bin represented by colormap where
|
||||||
|
// alpha varies with density
|
||||||
|
jitter, // create a number of points in the bin proportional to the bin
|
||||||
|
// value
|
||||||
|
point_colormap, // number of elements in bin represented by default
|
||||||
|
// colormap
|
||||||
|
heatmap // number of elements in each bin represented by a heatmap
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_HANDLE_TYPES_H
|
||||||
42
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/util/keywords.h
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-06.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_KEYWORDS_H
|
||||||
|
#define MATPLOTPLUSPLUS_KEYWORDS_H
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
class keyword_automatic_type {};
|
||||||
|
constexpr keyword_automatic_type automatic;
|
||||||
|
|
||||||
|
class keyword_manual_type {};
|
||||||
|
constexpr keyword_manual_type manual;
|
||||||
|
|
||||||
|
class keyword_equal_type {};
|
||||||
|
constexpr keyword_equal_type equal;
|
||||||
|
|
||||||
|
class keyword_square_type {};
|
||||||
|
constexpr keyword_square_type square;
|
||||||
|
|
||||||
|
class keyword_tight_type {};
|
||||||
|
constexpr keyword_tight_type tight;
|
||||||
|
|
||||||
|
class keyword_ij_type {};
|
||||||
|
constexpr keyword_ij_type ij;
|
||||||
|
|
||||||
|
class keyword_minor_type {};
|
||||||
|
constexpr keyword_minor_type minor;
|
||||||
|
|
||||||
|
constexpr bool on = true;
|
||||||
|
constexpr bool off = false;
|
||||||
|
|
||||||
|
constexpr bool left = false;
|
||||||
|
constexpr bool right = true;
|
||||||
|
|
||||||
|
constexpr double inf = std::numeric_limits<double>::infinity();
|
||||||
|
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_KEYWORDS_H
|
||||||
95
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/util/popen.h
vendored
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-06.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_POPEN_H
|
||||||
|
#define MATPLOTPLUSPLUS_POPEN_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <cstdio> // FILE
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
#include <windows.h> // HANDLE
|
||||||
|
|
||||||
|
/// State of a child process pipe
|
||||||
|
class proc_pipe
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
proc_pipe() = default;
|
||||||
|
HANDLE hProcess = 0; ///< WIN32 process handle
|
||||||
|
HANDLE hThread = 0; ///< WIN32 thread handle
|
||||||
|
FILE *file_ = nullptr; ///< C file handle for I/O (not both)
|
||||||
|
};
|
||||||
|
|
||||||
|
#elif defined(__linux) || defined(__APPLE__)
|
||||||
|
|
||||||
|
#include <unistd.h> // pid_t
|
||||||
|
|
||||||
|
/// State of a child process pipe
|
||||||
|
class proc_pipe
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
proc_pipe() = default;
|
||||||
|
pid_t pid = 0; ///< POSIX process identifier
|
||||||
|
FILE *file_ = nullptr; ///< C file handle for input or output (not both)
|
||||||
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error "proc_pipe is not implemented for this platform"
|
||||||
|
#endif // platform specific code
|
||||||
|
|
||||||
|
/// Common operations for a child process pipe
|
||||||
|
class common_pipe : public proc_pipe
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FILE *file() const { return file_; }
|
||||||
|
int close(int *exit_code = nullptr);
|
||||||
|
bool opened() const { return file_ != nullptr; }
|
||||||
|
const std::string& error() const { return error_; }
|
||||||
|
bool exceptions() const { return exceptions_; }
|
||||||
|
void exceptions(bool exc) { exceptions_ = exc; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
common_pipe() = default;
|
||||||
|
common_pipe(const common_pipe&) = delete;
|
||||||
|
common_pipe& operator=(const common_pipe&) = delete;
|
||||||
|
common_pipe(common_pipe&&) noexcept = default;
|
||||||
|
common_pipe& operator=(common_pipe&&) noexcept = default;
|
||||||
|
~common_pipe() noexcept {
|
||||||
|
if (opened())
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
bool exceptions_ = false;
|
||||||
|
std::string error_{};
|
||||||
|
int report(int err, const std::string& what);
|
||||||
|
int open(const std::string &command, char mode);
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Pipe to read from process output
|
||||||
|
class ipipe : public common_pipe
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ipipe();
|
||||||
|
int open(const std::string &cmd) { return common_pipe::open(cmd, 'r'); }
|
||||||
|
int read(std::string &data);
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Pipe to write into process input
|
||||||
|
class opipe : public common_pipe
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
opipe();
|
||||||
|
int open(const std::string &cmd) { return common_pipe::open(cmd, 'w'); }
|
||||||
|
int write(std::string_view data);
|
||||||
|
int flush(std::string_view data = {});
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Runs the shell command, writes data to its input and waits for completion, returns errno if failed
|
||||||
|
int shell_write(const std::string &command, std::string_view data = {});
|
||||||
|
|
||||||
|
/// Runs the shell command, reads data from its output and waits for completion, returns errno if failed
|
||||||
|
int shell_read(const std::string &command, std::string& data);
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_POPEN_H
|
||||||
150
dependency/x86/third_party/matplotplusplus/1.2.0/include/matplot/util/type_traits.h
vendored
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
//
|
||||||
|
// Created by Alan Freitas on 2020-07-05.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MATPLOTPLUSPLUS_TYPE_TRAITS_H
|
||||||
|
#define MATPLOTPLUSPLUS_TYPE_TRAITS_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace matplot {
|
||||||
|
template <typename C> struct is_iterable {
|
||||||
|
typedef long false_type;
|
||||||
|
typedef char true_type;
|
||||||
|
|
||||||
|
template <class T> static false_type check(...);
|
||||||
|
template <class T>
|
||||||
|
static true_type check(int, typename T::const_iterator = C().end());
|
||||||
|
|
||||||
|
enum { value = sizeof(check<C>(0)) == sizeof(true_type) };
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename C> constexpr bool is_iterable_v = is_iterable<C>::value;
|
||||||
|
|
||||||
|
template <typename C> struct has_value_type {
|
||||||
|
typedef long false_type;
|
||||||
|
typedef char true_type;
|
||||||
|
|
||||||
|
template <class T> static false_type check(...);
|
||||||
|
template <class T>
|
||||||
|
static true_type check(int, typename T::value_type = *C().begin());
|
||||||
|
|
||||||
|
enum { value = sizeof(check<C>(0)) == sizeof(true_type) };
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename C>
|
||||||
|
constexpr bool has_value_type_v = has_value_type<C>::value;
|
||||||
|
|
||||||
|
template <typename C> struct has_iterable_value_type {
|
||||||
|
typedef long false_type;
|
||||||
|
typedef char true_type;
|
||||||
|
|
||||||
|
template <class T> static false_type check(...);
|
||||||
|
template <class T>
|
||||||
|
static true_type
|
||||||
|
check(int,
|
||||||
|
typename T::value_type::value_type = *(C().begin()->begin()));
|
||||||
|
|
||||||
|
enum { value = sizeof(check<C>(0)) == sizeof(true_type) };
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename C>
|
||||||
|
constexpr bool has_iterable_value_type_v =
|
||||||
|
has_iterable_value_type<C>::value;
|
||||||
|
|
||||||
|
// Something like std::vector<double>
|
||||||
|
template <class C>
|
||||||
|
struct is_iterable_value
|
||||||
|
: public std::integral_constant<
|
||||||
|
bool, is_iterable_v<C> && !has_iterable_value_type_v<C>> {};
|
||||||
|
|
||||||
|
template <typename C>
|
||||||
|
constexpr bool is_iterable_value_v = is_iterable_value<C>::value;
|
||||||
|
|
||||||
|
// Something like std::vector<std::vector<double>>
|
||||||
|
template <class C>
|
||||||
|
struct is_iterable_iterable
|
||||||
|
: public std::integral_constant<
|
||||||
|
bool, is_iterable_v<C> && has_iterable_value_type_v<C>> {};
|
||||||
|
|
||||||
|
template <typename C>
|
||||||
|
constexpr bool is_iterable_iterable_v = is_iterable_iterable<C>::value;
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
using is_string =
|
||||||
|
std::integral_constant<bool,
|
||||||
|
std::is_same_v<std::decay_t<T>, std::string> &&
|
||||||
|
std::is_convertible_v<T, std::string>>;
|
||||||
|
|
||||||
|
template <typename C> constexpr bool is_string_v = is_string<C>::value;
|
||||||
|
|
||||||
|
template <typename> struct is_pair : std::false_type {};
|
||||||
|
|
||||||
|
template <typename T, typename U>
|
||||||
|
struct is_pair<std::pair<T, U>> : std::true_type {};
|
||||||
|
|
||||||
|
template <typename T> constexpr bool is_pair_v = is_pair<T>::value;
|
||||||
|
|
||||||
|
template <class C>
|
||||||
|
struct is_iterable_pair
|
||||||
|
: public std::integral_constant<
|
||||||
|
bool, is_iterable_v<C> && !has_iterable_value_type_v<C> &&
|
||||||
|
is_pair_v<typename C::value_type>> {};
|
||||||
|
|
||||||
|
template <typename C>
|
||||||
|
constexpr bool is_iterable_pair_v = is_iterable_pair<C>::value;
|
||||||
|
|
||||||
|
template <typename> struct is_vector : std::false_type {};
|
||||||
|
|
||||||
|
template <typename T, typename U>
|
||||||
|
struct is_vector<std::vector<T, U>> : std::true_type {};
|
||||||
|
|
||||||
|
template <typename> struct is_initializer_list : std::false_type {};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct is_initializer_list<std::initializer_list<T>> : std::true_type {};
|
||||||
|
|
||||||
|
template <typename T> struct first_type_if_pair { using type = T; };
|
||||||
|
|
||||||
|
template <typename T, typename U>
|
||||||
|
struct first_type_if_pair<std::pair<T, U>> {
|
||||||
|
using type = T;
|
||||||
|
};
|
||||||
|
|
||||||
|
// also tried this, but it didn't help
|
||||||
|
template <typename T, typename U>
|
||||||
|
struct first_type_if_pair<std::pair<const T, U>> {
|
||||||
|
using type = T;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T> struct second_type_if_pair { using type = T; };
|
||||||
|
|
||||||
|
template <typename T, typename U>
|
||||||
|
struct second_type_if_pair<std::pair<T, U>> {
|
||||||
|
using type = U;
|
||||||
|
};
|
||||||
|
|
||||||
|
// also tried this, but it didn't help
|
||||||
|
template <typename T, typename U>
|
||||||
|
struct second_type_if_pair<std::pair<const T, U>> {
|
||||||
|
using type = U;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename ITERABLE> struct iterable_traits {
|
||||||
|
using container_type = ITERABLE;
|
||||||
|
using iterator_type = decltype(std::declval<container_type>().begin());
|
||||||
|
using value_type = typename std::remove_reference<decltype(
|
||||||
|
std::declval<iterator_type>().operator*())>::type;
|
||||||
|
static constexpr bool is_map = is_pair<value_type>::value;
|
||||||
|
using key_type =
|
||||||
|
std::conditional_t<is_map, typename value_type::first_type,
|
||||||
|
value_type>;
|
||||||
|
using mapped_type =
|
||||||
|
std::conditional_t<is_map, typename value_type::second_type,
|
||||||
|
value_type>;
|
||||||
|
};
|
||||||
|
} // namespace matplot
|
||||||
|
|
||||||
|
#endif // MATPLOTPLUSPLUS_TYPE_TRAITS_H
|
||||||
52
dependency/x86/third_party/matplotplusplus/1.2.0/lib/cmake/Matplot++/Matplot++Config.cmake
vendored
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() #######
|
||||||
|
####### Any changes to this file will be overwritten by the next CMake run ####
|
||||||
|
####### The input file was Matplot++Config.cmake.in ########
|
||||||
|
|
||||||
|
get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)
|
||||||
|
|
||||||
|
macro(set_and_check _var _file)
|
||||||
|
set(${_var} "${_file}")
|
||||||
|
if(NOT EXISTS "${_file}")
|
||||||
|
message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
macro(check_required_components _NAME)
|
||||||
|
foreach(comp ${${_NAME}_FIND_COMPONENTS})
|
||||||
|
if(NOT ${_NAME}_${comp}_FOUND)
|
||||||
|
if(${_NAME}_FIND_REQUIRED_${comp})
|
||||||
|
set(${_NAME}_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
####################################################################################
|
||||||
|
|
||||||
|
# How this Matplot++ installation was built
|
||||||
|
set(MATPLOT_BUILT_SHARED "ON")
|
||||||
|
set(MATPLOT_BUILT_CXX_COMPILER_ID "GNU")
|
||||||
|
set(MATPLOT_BUILT_CXX_COMPILER_VERSION "11.4.0")
|
||||||
|
|
||||||
|
# Check if it matches the current toolchain
|
||||||
|
if (NOT CMAKE_CXX_COMPILER_ID STREQUAL MATPLOT_BUILT_CXX_COMPILER_ID)
|
||||||
|
message(WARNING "This installation of Matplot++ was built with ${MATPLOT_BUILT_CXX_COMPILER_ID}.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Find dependencies
|
||||||
|
if(NOT ${MATPLOT_BUILT_SHARED})
|
||||||
|
include(CMakeFindDependencyMacro)
|
||||||
|
list(APPEND CMAKE_MODULE_PATH ${MATPLOT_CONFIG_INSTALL_DIR})
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
|
||||||
|
# OpenGL backend
|
||||||
|
if (OFF)
|
||||||
|
find_dependency(glad)
|
||||||
|
find_dependency(glfw3)
|
||||||
|
endif()
|
||||||
|
list(POP_BACK CMAKE_MODULE_PATH)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Create imported targets
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/Matplot++Targets.cmake")
|
||||||
|
check_required_components(Matplot++)
|
||||||
@ -0,0 +1,70 @@
|
|||||||
|
# This is a basic version file for the Config-mode of find_package().
|
||||||
|
# It is used by write_basic_package_version_file() as input file for configure_file()
|
||||||
|
# to create a version-file which can be installed along a config.cmake file.
|
||||||
|
#
|
||||||
|
# The created file sets PACKAGE_VERSION_EXACT if the current version string and
|
||||||
|
# the requested version string are exactly the same and it sets
|
||||||
|
# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version,
|
||||||
|
# but only if the requested major version is the same as the current one.
|
||||||
|
# The variable CVF_VERSION must be set before calling configure_file().
|
||||||
|
|
||||||
|
|
||||||
|
set(PACKAGE_VERSION "1.2.0")
|
||||||
|
|
||||||
|
if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
|
||||||
|
set(PACKAGE_VERSION_COMPATIBLE FALSE)
|
||||||
|
else()
|
||||||
|
|
||||||
|
if("1.2.0" MATCHES "^([0-9]+)\\.")
|
||||||
|
set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}")
|
||||||
|
if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0)
|
||||||
|
string(REGEX REPLACE "^0+" "" CVF_VERSION_MAJOR "${CVF_VERSION_MAJOR}")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(CVF_VERSION_MAJOR "1.2.0")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(PACKAGE_FIND_VERSION_RANGE)
|
||||||
|
# both endpoints of the range must have the expected major version
|
||||||
|
math (EXPR CVF_VERSION_MAJOR_NEXT "${CVF_VERSION_MAJOR} + 1")
|
||||||
|
if (NOT PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
|
||||||
|
OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX_MAJOR STREQUAL CVF_VERSION_MAJOR)
|
||||||
|
OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX VERSION_LESS_EQUAL CVF_VERSION_MAJOR_NEXT)))
|
||||||
|
set(PACKAGE_VERSION_COMPATIBLE FALSE)
|
||||||
|
elseif(PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
|
||||||
|
AND ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS_EQUAL PACKAGE_FIND_VERSION_MAX)
|
||||||
|
OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MAX)))
|
||||||
|
set(PACKAGE_VERSION_COMPATIBLE TRUE)
|
||||||
|
else()
|
||||||
|
set(PACKAGE_VERSION_COMPATIBLE FALSE)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR)
|
||||||
|
set(PACKAGE_VERSION_COMPATIBLE TRUE)
|
||||||
|
else()
|
||||||
|
set(PACKAGE_VERSION_COMPATIBLE FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
|
||||||
|
set(PACKAGE_VERSION_EXACT TRUE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# if the installed project requested no architecture check, don't perform the check
|
||||||
|
if("FALSE")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it:
|
||||||
|
if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# check that the installed version has the same 32/64bit-ness as the one which is currently searching:
|
||||||
|
if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8")
|
||||||
|
math(EXPR installedBits "8 * 8")
|
||||||
|
set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)")
|
||||||
|
set(PACKAGE_VERSION_UNSUITABLE TRUE)
|
||||||
|
endif()
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
#----------------------------------------------------------------
|
||||||
|
# Generated CMake target import file for configuration "Release".
|
||||||
|
#----------------------------------------------------------------
|
||||||
|
|
||||||
|
# Commands may need to know the format version.
|
||||||
|
set(CMAKE_IMPORT_FILE_VERSION 1)
|
||||||
|
|
||||||
|
# Import target "Matplot++::matplot" for configuration "Release"
|
||||||
|
set_property(TARGET Matplot++::matplot APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||||
|
set_target_properties(Matplot++::matplot PROPERTIES
|
||||||
|
IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libmatplot.so.1.2.0"
|
||||||
|
IMPORTED_SONAME_RELEASE "libmatplot.so.1"
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND _IMPORT_CHECK_TARGETS Matplot++::matplot )
|
||||||
|
list(APPEND _IMPORT_CHECK_FILES_FOR_Matplot++::matplot "${_IMPORT_PREFIX}/lib/libmatplot.so.1.2.0" )
|
||||||
|
|
||||||
|
# Commands beyond this point should not need to know the version.
|
||||||
|
set(CMAKE_IMPORT_FILE_VERSION)
|
||||||
96
dependency/x86/third_party/matplotplusplus/1.2.0/lib/cmake/Matplot++/Matplot++Targets.cmake
vendored
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
# Generated by CMake
|
||||||
|
|
||||||
|
if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.6)
|
||||||
|
message(FATAL_ERROR "CMake >= 2.6.0 required")
|
||||||
|
endif()
|
||||||
|
cmake_policy(PUSH)
|
||||||
|
cmake_policy(VERSION 2.6...3.20)
|
||||||
|
#----------------------------------------------------------------
|
||||||
|
# Generated CMake target import file.
|
||||||
|
#----------------------------------------------------------------
|
||||||
|
|
||||||
|
# Commands may need to know the format version.
|
||||||
|
set(CMAKE_IMPORT_FILE_VERSION 1)
|
||||||
|
|
||||||
|
# Protect against multiple inclusion, which would fail when already imported targets are added once more.
|
||||||
|
set(_targetsDefined)
|
||||||
|
set(_targetsNotDefined)
|
||||||
|
set(_expectedTargets)
|
||||||
|
foreach(_expectedTarget Matplot++::matplot)
|
||||||
|
list(APPEND _expectedTargets ${_expectedTarget})
|
||||||
|
if(NOT TARGET ${_expectedTarget})
|
||||||
|
list(APPEND _targetsNotDefined ${_expectedTarget})
|
||||||
|
endif()
|
||||||
|
if(TARGET ${_expectedTarget})
|
||||||
|
list(APPEND _targetsDefined ${_expectedTarget})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
if("${_targetsDefined}" STREQUAL "${_expectedTargets}")
|
||||||
|
unset(_targetsDefined)
|
||||||
|
unset(_targetsNotDefined)
|
||||||
|
unset(_expectedTargets)
|
||||||
|
set(CMAKE_IMPORT_FILE_VERSION)
|
||||||
|
cmake_policy(POP)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
if(NOT "${_targetsDefined}" STREQUAL "")
|
||||||
|
message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n")
|
||||||
|
endif()
|
||||||
|
unset(_targetsDefined)
|
||||||
|
unset(_targetsNotDefined)
|
||||||
|
unset(_expectedTargets)
|
||||||
|
|
||||||
|
|
||||||
|
# Compute the installation prefix relative to this file.
|
||||||
|
get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
||||||
|
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
|
||||||
|
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
|
||||||
|
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
|
||||||
|
if(_IMPORT_PREFIX STREQUAL "/")
|
||||||
|
set(_IMPORT_PREFIX "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Create imported target Matplot++::matplot
|
||||||
|
add_library(Matplot++::matplot SHARED IMPORTED)
|
||||||
|
|
||||||
|
set_target_properties(Matplot++::matplot PROPERTIES
|
||||||
|
INTERFACE_COMPILE_DEFINITIONS "NOMINMAX;MATPLOT_BUILD_HIGH_RESOLUTION_WORLD_MAP"
|
||||||
|
INTERFACE_COMPILE_FEATURES "cxx_std_17"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Load information for each installed configuration.
|
||||||
|
get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
||||||
|
file(GLOB CONFIG_FILES "${_DIR}/Matplot++Targets-*.cmake")
|
||||||
|
foreach(f ${CONFIG_FILES})
|
||||||
|
include(${f})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Cleanup temporary variables.
|
||||||
|
set(_IMPORT_PREFIX)
|
||||||
|
|
||||||
|
# Loop over all imported files and verify that they actually exist
|
||||||
|
foreach(target ${_IMPORT_CHECK_TARGETS} )
|
||||||
|
foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} )
|
||||||
|
if(NOT EXISTS "${file}" )
|
||||||
|
message(FATAL_ERROR "The imported target \"${target}\" references the file
|
||||||
|
\"${file}\"
|
||||||
|
but this file does not exist. Possible reasons include:
|
||||||
|
* The file was deleted, renamed, or moved to another location.
|
||||||
|
* An install or uninstall procedure did not complete successfully.
|
||||||
|
* The installation package was faulty and contained
|
||||||
|
\"${CMAKE_CURRENT_LIST_FILE}\"
|
||||||
|
but not all the files it references.
|
||||||
|
")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
unset(_IMPORT_CHECK_FILES_FOR_${target})
|
||||||
|
endforeach()
|
||||||
|
unset(_IMPORT_CHECK_TARGETS)
|
||||||
|
|
||||||
|
# This file does not depend on other imported targets which have
|
||||||
|
# been exported from the same project but in a separate export set.
|
||||||
|
|
||||||
|
# Commands beyond this point should not need to know the version.
|
||||||
|
set(CMAKE_IMPORT_FILE_VERSION)
|
||||||
|
cmake_policy(POP)
|
||||||
1
dependency/x86/third_party/matplotplusplus/1.2.0/lib/libmatplot.so
vendored
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
libmatplot.so.1
|
||||||
1
dependency/x86/third_party/matplotplusplus/1.2.0/lib/libmatplot.so.1
vendored
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
libmatplot.so.1.2.0
|
||||||
BIN
dependency/x86/third_party/matplotplusplus/1.2.0/lib/libmatplot.so.1.2.0
vendored
Normal file
@ -229,7 +229,6 @@
|
|||||||
</worldbody>
|
</worldbody>
|
||||||
|
|
||||||
|
|
||||||
<!-- 关节空间 PD 位置控制:ctrl = 目标关节角度 (rad) -->
|
|
||||||
<actuator>
|
<actuator>
|
||||||
<!-- 左臂:位置控制 -->
|
<!-- 左臂:位置控制 -->
|
||||||
<position name="L_SHOULDER_P_pos" joint="L_SHOULDER_P"
|
<position name="L_SHOULDER_P_pos" joint="L_SHOULDER_P"
|
||||||
|
|||||||
@ -32,5 +32,6 @@ third_party/opencv/4.13.0
|
|||||||
third_party/modbus/3.1.11
|
third_party/modbus/3.1.11
|
||||||
third_party/visp/3.7.0
|
third_party/visp/3.7.0
|
||||||
third_party/mainif/0.0.5
|
third_party/mainif/0.0.5
|
||||||
|
third_party/matplotplusplus/1.2.0
|
||||||
|
|
||||||
|
|
||||||
|
|||||||