修复色域拖拽回弹、网格 GX 拖拽重排、均值滤波多阶与逐信号条目
1. 自定义颜色面板:拖动时鼠标移出控件不再"弹回去"
- 根因是选点位置每帧都从 RGB 反推:色相 1 与 0 是同一个颜色(红),拖到色相条底部
下一帧反推回 0,指示条弹到顶部;拖到色域方块右下角之外时明度为 0(黑色),
黑色的饱和度无定义,反推得 0,选点弹到最左边。
- 现在把"选点位置(饱和度/明度)与色相"作为独立状态保存,只由对应控件与外部改色维护;
越界一律夹取到最近边界,因此鼠标离开控件后选点停在边界上。
- 统一色域方块、色相条、预览色块与色号框的圆角;RGB 滑块适当加粗;
色域选点去掉外圈深色描边(只保留白色描边),色相指示器改为白色描边的圆角长方条、
底色取该位置的颜色;色相条改用分段线性渐变绘制。
2. 网格 GX 编号支持拖拽重排
- 按住网格图例左侧的 GX 徽标即可上下拖动,整块网格(连同波形与标尺)跟随鼠标移动;
途经的网格保持自身大小、整体让出一格,目标槽位有吸附高亮提示。
- 松开后真正重排并从下到上/从上到下重新编号,信号列表徽标、图例徽标、菜单与浮动面板
中所有 GX 编号同步更新;手动排布后切换为自定义划分,后续重建网格不会打乱次序。
- 拖动期间复用静态场景缓存,按网格条带平移贴图,因此大文件下依然流畅。
3. 均值滤波升级为"均值点数 X + 阶数 N"
- 原"均值点数 N"更名"均值点数 X",新增"阶数 N":预览曲线以 X 点均值滤波的结果为蓝本,
再重复同样的滤波共 N 阶(1 阶即与原来的单次滤波逐位一致)。
- 浮动面板改为逐信号条目:第一排是信号名与复选框,第二排是均值点数与阶数输入;
只有勾选的信号才绘制预览曲线,未勾选时不显示第二排;启用功能时默认只勾选第一个信号。
- 参数按信号保存(同一网格内不同信号可用不同参数),「构建为新信号」按各自参数构建。
This commit is contained in:
1 parent
2d029fb09b
commit
bc8db72f18
8 files changed
+1138
-181
No files matched your search
@@ -355,6 +355,19 @@ namespace jdi
|
||||
*/
|
||||
struct Lane
|
||||
{
|
||||
/**
|
||||
* @brief 「均值滤波」中某个信号自己的参数。
|
||||
*
|
||||
* 仅参与列表中的信号才会被勾选预览;参数按信号保存,
|
||||
* 因此同一条网格内不同信号可以使用不同的均值点数与阶数。
|
||||
*/
|
||||
struct MeanFilterItem
|
||||
{
|
||||
SignalRef ref; /**< 目标信号。 */
|
||||
int points = 5; /**< 均值点数 X(滑平半径,窗口 = 2X+1)。 */
|
||||
int order = 1; /**< 阶数 N(重复滤波次数,至少 1)。 */
|
||||
};
|
||||
|
||||
std::wstring name; /**< 网格名称。 */
|
||||
std::vector<SignalRef> signals; /**< 该网格包含的信号(按加入顺序)。 */
|
||||
bool autoRange = true; /**< 是否依据信号取值范围自动计算 Y 轴。 */
|
||||
@@ -416,14 +429,33 @@ namespace jdi
|
||||
/**
|
||||
* @brief 「实验性功能 → 均值滤波」开关。
|
||||
*
|
||||
* 开启后为本网格内每条信号额外绘制一条 N 点滑动平均曲线(算法与「边沿计数(中心轴)」
|
||||
* 的中心平均值曲线完全一致),并在浮动面板中提供参数 N 与「构建为新信号」按钮。
|
||||
* 开启后为本网格内**被勾选**的信号额外绘制一条多阶滑动平均曲线(按各自的均值点数 X
|
||||
* 重复 N 阶),并在浮动面板中提供每个信号自己的参数与「构建为新信号」按钮。
|
||||
* 与其它实验性功能一样属于网格自身状态,重建网格时按信号继承。
|
||||
*/
|
||||
bool meanFilter = false;
|
||||
|
||||
/** 均值滤波半径 N(左右各取 N 个数据点,窗口大小 2N+1)。 */
|
||||
int meanFilterRadius = 5;
|
||||
/**
|
||||
* @brief 参与均值滤波预览的信号及其参数(只包含被勾选的信号)。
|
||||
*
|
||||
* 顺序与信号在网格内的顺序不一定一致,绘制时按网格内信号顺序派发。
|
||||
*/
|
||||
std::vector<MeanFilterItem> meanFilterItems;
|
||||
|
||||
/** 取某个信号的均值滤波参数(未勾选时返回空指针)。 */
|
||||
const MeanFilterItem* FindMeanFilterItem(const SignalRef& ref) const;
|
||||
|
||||
/** 取得或创建某信号的均值滤波参数(用于勾选)。 */
|
||||
MeanFilterItem& EnsureMeanFilterItem(const SignalRef& ref);
|
||||
|
||||
/** 取消某信号的均值滤波勾选。 */
|
||||
void RemoveMeanFilterItem(const SignalRef& ref);
|
||||
|
||||
/** 取某信号的均值滤波勾选状态。 */
|
||||
bool MeanFilterEnabled(const SignalRef& ref) const
|
||||
{
|
||||
return FindMeanFilterItem(ref) != nullptr;
|
||||
}
|
||||
|
||||
/** 均值滤波浮动面板是否展开。 */
|
||||
bool meanFilterPanelOpen = true;
|
||||
@@ -462,6 +494,20 @@ namespace jdi
|
||||
*/
|
||||
void ComputeMovingAverage(const std::vector<double>& values, int radius, std::vector<float>& out);
|
||||
|
||||
/**
|
||||
* @brief 计算多阶(迭代)滑动平均:把 N 点滑动平均重复应用 `order` 次。
|
||||
*
|
||||
* 每次迭代以上一次的结果为输入(NaN 不参与平均),因此阶数越高曲线越平滑。
|
||||
* `order <= 1` 时与 `ComputeMovingAverage` 完全一致。
|
||||
*
|
||||
* @param [IN] values 原始采样值。
|
||||
* @param [IN] radius 滑平半径 N(0 表示原样返回)。
|
||||
* @param [IN] order 阶数(迭代次数,至少为 1)。
|
||||
* @param [OUT] out 输出数组(长度与 values 相同)。
|
||||
*/
|
||||
void ComputeMovingAverageIterated(const std::vector<double>& values, int radius, int order,
|
||||
std::vector<float>& out);
|
||||
|
||||
/**
|
||||
* @brief 在指定文件的时间轴上查找与给定时刻最接近的采样点。
|
||||
* @param [IN] file 目标文件。
|
||||
@@ -663,6 +709,19 @@ namespace jdi
|
||||
*/
|
||||
bool MoveLaneOfSignalBelow(const SignalRef& moved, const SignalRef& anchor);
|
||||
|
||||
/**
|
||||
* @brief 把某个网格整体移动到新的位置(用于拖拽 GX 编号调整网格次序)。
|
||||
*
|
||||
* `target` 是**插入位置**(0..laneCount):0 表示移到最上方,laneCount 表示移到最下方。
|
||||
* 移动后会切换到自定义划分策略并按新位置重新编号全部网格,
|
||||
* 因此所有以 GX 编号关联的界面(信号列表徽标、图例徽标、菜单、浮动面板)自动同步。
|
||||
*
|
||||
* @param [IN] from 被移动的网格下标。
|
||||
* @param [IN] target 插入位置(0..网格数)。
|
||||
* @return 实际发生了移动返回 true。
|
||||
*/
|
||||
bool MoveLane(int from, int target);
|
||||
|
||||
/**
|
||||
* @brief 按当前位置统一重命名全部网格(GX 编号由位置推导,须保持一致)。
|
||||
*/
|
||||
|
||||
Reference in new issue
Block a user