- Lane::ResampleItem + resample/resampleItems/resamplePanel/resampleScroll, 并在 LaneCarry / SplitLane / PruneLaneSignalItems / RemapAfterSignalInsert|Removal 同步 - 面板:可滚动分组列表(信号色条目栏 + 复选框 + 展开三角),展开后 4 行: 最大/最小数据间隔(只读,勾选时一次性缓存,绘制不扫描采样)+ 重采样间隔/频率(输入) - 输入框联动:改间隔同步频率,改频率同步间隔(输入单位分别为秒 / Hz) - 「构建为新信号」:DataSet::AppendGroupAxis 追加新时间轴 + InsertDerivedSignal, 采样值先按公式/系数/绝对值/镜像/Y偏移变换再等间隔线性插值,时间轴偏移不烘值 - 新信号名 <原信号> (重采样 <自适应单位频率>);Utf8Util::FormatFrequency 为唯一实现 - 非单调轴 / 点太少 / 间隔过大 / 点数超 2000 万 ⇒ 拒绝构建并给出自绘提示 - 顺带加入 FormulaEval(公式编译/求值,供 ApplyDrawTransform 与后续 UI 使用)
59 lines
2.2 KiB
C++
59 lines
2.2 KiB
C++
#ifndef __FORMULA_EVAL_HPP__
|
||
#define __FORMULA_EVAL_HPP__
|
||
|
||
// 「公式映射」的表达式编译与求值(信号样式区的 `Y = …` 输入框)。
|
||
//
|
||
// 语法(刻意保持极小,避免引入脚本引擎与额外的体积):
|
||
// expr := term (('+' | '-') term)*
|
||
// term := unary (('*' | '/') unary)*
|
||
// unary := ('+' | '-') unary | primary
|
||
// primary := number | '(' expr ')' | variable
|
||
// number := 十进制小数(支持 e/E 指数)
|
||
// variable:= `X` / `x` / `f` / `f(t)` —— 都表示"当前采样点的值"
|
||
// 另外支持常量 `pi`。
|
||
//
|
||
// ⚠️ 求值走 `thread_local` 的单条缓存(按 `std::wstring` 的 data 指针 + 内容判定):
|
||
// 绘制循环里同一条信号的样式对象是稳定的,因此每个信号只需编译一次;
|
||
// **绝不能**每个采样点都重新解析(千万级采样会慢到不可用)。
|
||
|
||
#include <string>
|
||
|
||
namespace jdi
|
||
{
|
||
/**
|
||
* @brief 校验公式文本是否可以解析。
|
||
*
|
||
* 空文本是合法输入(表示"不做映射")。
|
||
*
|
||
* @param [IN] text 公式文本(不含 `Y =` 前缀)。
|
||
* @param [OUT] error 解析失败时的原因(成功时清空),允许为空。
|
||
* @return 语法合法返回 true。
|
||
*/
|
||
bool ValidateFormula(const std::wstring& text, std::wstring* error);
|
||
|
||
/**
|
||
* @brief 计算公式在给定采样值处的取值。
|
||
*
|
||
* 文本为空或无法解析时**原样返回** `x`(保证绘制不会因为非法公式而消失)。
|
||
* 计算结果非有限(如 1/0)时返回 NaN(保持断线语义)。
|
||
*
|
||
* @param [IN] text 公式文本。
|
||
* @param [IN] x 采样值(公式中的 `f(t)` / `X`)。
|
||
* @return 映射后的值。
|
||
*/
|
||
double EvaluateFormula(const std::wstring& text, double x);
|
||
|
||
/**
|
||
* @brief 把用户输入里的自变量写法统一成 `f(t)`(保存前调用)。
|
||
*
|
||
* 规则:把独立的 `X` / `x` / `f` 记号改写为 `f(t)`;`f(t)` 原样保留。
|
||
* 只做记号级替换(不会动标识符中间或数字里的字符)。
|
||
*
|
||
* @param [IN] text 用户输入的公式。
|
||
* @return 归一化后的文本。
|
||
*/
|
||
std::wstring NormalizeFormulaText(const std::wstring& text);
|
||
} // namespace jdi
|
||
|
||
#endif // __FORMULA_EVAL_HPP__
|