修复上下拖动时的绘制异常/抽搐(纵向预渲染补齐)+「弱峰增强」升级为「弱峰调整」(-200%–+200%)
一、纵向绘制异常/抽搐的根因 上一轮给图层加了「上下各半个网格高」的纵向预渲染余量,但"偏移超出余量"时仍走**排队整块重画** (一帧只补一个网格):重画生效前 BlitWideBuffer 只能贴出有像素的那一部分,其余行留在底色上 = 网格内出现空白条带("绘制错误");且重画后的锚点与"贴图偏移"不同源 = 波形"没按预期移动"。 鼠标按在最上方网格一路拖到窗口最下方(离开网格很远)时,每帧的幅值位移都远超余量 → 每帧触发整块 重画 = 抽搐;左右拖动时若鼠标同时有纵向位移,同样触发。 二、修法:与横向完全同构的纵向滚动 - RenderLaneLayerRegion 增加 stripY/stripH(纵向条带),可只补画"新暴露的一整条"。 - RollWideBuffer 新增纵向滚动:BitBlt 整块上/下移 roll 行 → 补画暴露的那一条 → layer.anchorYMax -= roll / pxPerValue(与横向 wideMin 同一套记账)。 必须在横向补条之前(横向补条会用当前 yMax 重置图层锚点,顺序反了细条会带上错的纵向偏移)。 - 滚动量量化(kLayerRollQuantum = 16 像素):不足量子的偏移不滚,交给贴图的 srcY 偏移处理, 使画布映射在拖动中保持稳定、折线缓存(键含幅值映射)得以命中。 未量化时"每帧滚 1~30 行"会让折线每帧重算(实测滚动 3~4ms + 整帧 10~14ms)。 三、「弱峰调整」(原「弱峰增强」) - 术语统一:ComputeWeakPeakAdjust、WeakPeakItem.amountPercent(-200–200,默认 150)、面板标题 「弱峰调整」、标签「调整幅度 %」、光标胶囊尾缀、构建信号名「<原信号> (弱峰调整 X% M次迭代)」。 - 滑块量程 -200% – +200%,0 在正中间(ratio = (amount/200 + 1) / 2);数值列加宽以容纳 "-200%"。 - 目标值(识别规则与旧实现完全相同;amount = 幅度/100): * 0 ≤ a ≤ 1:当前值 → 同类极值中较温和的一侧; * 1 < a ≤ 2:该侧 → 另一侧(与旧实现逐位一致); * -1 ≤ a < 0:当前值 → 相邻异类极值中较近的一个(波峰看较高的波谷、波谷看较低的波峰); * -2 ≤ a < -1:较近的异类极值 → 较远的那个(弱峰被压平甚至抹除,左右平滑过渡)。 - 负幅度不得反向增强:目标夹在"不越过当前值"的一侧。平滑偏移的逐点过渡逻辑未改动。 四、验证(全部离屏,不占用鼠标/键盘/屏幕) - uitest 443/443:[X] 正幅度 0/50/100/150/200% → 峰 550/555/560/580/600(旧值逐位保持)、 谷 450/445/440/420/400;新增负幅度 -50/-100/-200% → 峰 500/450/400、谷 500/550/560; 超范围夹取、"未反向增强"(极值点)、健康峰不动;滑块中间 = 0%、拖出两端 = ±200%; 构建信号名含「弱峰调整」;[AH] 纯竖直拖拽 16 帧仅 2 次图层重画。 - panperf:拖出网格 900px + 对角平移 31 帧,被拖网格的空白行数与整幅重绘逐帧一致(64 vs 64 → 无空白条带),帧时 10~13ms,末帧差异与水平基线同量级(已知的 ≤0.5px 整数像素残差)。 - layercheck:clobbers=0/24、pan frames wrong=0/4、居中图层 vs 整幅重绘逐像素 0 差异; cursorcheck 30/30;make clean && make all 零警告。
This commit is contained in:
1 parent
cb030573fa
commit
ff3319b842
7 files changed
+380
-224
No files matched your search
+33
-26
@@ -374,7 +374,7 @@ namespace jdi
|
||||
using EdgeCenterItem = MeanFilterItem;
|
||||
|
||||
/**
|
||||
* @brief 「弱峰增强」中某个信号自己的参数条目。
|
||||
* @brief 「弱峰调整」中某个信号自己的参数条目。
|
||||
*
|
||||
* 与「均值滤波」完全一致:**每个被勾选的信号各自持有参数**
|
||||
*(增强等级 0–200% + 迭代次数 N),因此同一网格内不同信号可以使用不同强度。
|
||||
@@ -385,7 +385,7 @@ namespace jdi
|
||||
struct WeakPeakItem
|
||||
{
|
||||
SignalRef ref; /**< 目标信号。 */
|
||||
int levelPercent = 150; /**< 增强等级(0–200;100% = 到达较温和的一侧,200% = 完全拉平)。 */
|
||||
int amountPercent = 150; /**< 调整幅度(-200–200;0 = 不动,100% = 到达较温和一侧,200% = 完全拉平;负值为削弱)。 */
|
||||
int iterations = 1; /**< 迭代次数 N(1 … `maxIterations`)。 */
|
||||
int maxIterations = 10; /**< 「迭代次数 N」滑块的上限(用户可在面板上修改,恒 ≥ 1)。 */
|
||||
};
|
||||
@@ -509,9 +509,9 @@ namespace jdi
|
||||
double meanFilterPanelY = -1.0;
|
||||
|
||||
/**
|
||||
* @brief 「实验性功能 → 弱峰增强」开关。
|
||||
* @brief 「实验性功能 → 弱峰调整」开关。
|
||||
*
|
||||
* 开启后为本网格内**被勾选**的信号额外绘制一条「弱峰增强」曲线:
|
||||
* 开启后为本网格内**被勾选**的信号额外绘制一条「弱峰调整」曲线:
|
||||
* 识别纹波的波峰/波谷,把“比左右同类极值更弱”的波峰上拉、波谷下拉,
|
||||
* 并按各信号自己的「增强等级」在左右两个同类极值之间取目标值,使其恢复与周边振幅。
|
||||
* 这条曲线只是叠加显示,不会作为信号加入左侧列表。
|
||||
@@ -519,35 +519,35 @@ namespace jdi
|
||||
bool weakPeak = false;
|
||||
|
||||
/**
|
||||
* @brief 参与弱峰增强预览的信号及其**各自的参数**(只包含被勾选的信号)。
|
||||
* @brief 参与弱峰调整预览的信号及其**各自的参数**(只包含被勾选的信号)。
|
||||
*
|
||||
* 参数(等级 0–200% + 迭代次数 N)按信号保存,与「均值滤波」的实现方式一致:
|
||||
* 同一网格内不同信号可以使用不同的增强强度,也可以分别「构建为新信号」。
|
||||
*/
|
||||
std::vector<WeakPeakItem> weakPeakItems;
|
||||
|
||||
/** 取某个信号的弱峰增强参数(未勾选时返回空指针)。 */
|
||||
/** 取某个信号的弱峰调整参数(未勾选时返回空指针)。 */
|
||||
const WeakPeakItem* FindWeakPeakItem(const SignalRef& ref) const;
|
||||
|
||||
/** 取得或创建某信号的弱峰增强参数(用于勾选)。 */
|
||||
/** 取得或创建某信号的弱峰调整参数(用于勾选)。 */
|
||||
WeakPeakItem& EnsureWeakPeakItem(const SignalRef& ref);
|
||||
|
||||
/** 取消某信号的弱峰增强勾选。 */
|
||||
/** 取消某信号的弱峰调整勾选。 */
|
||||
void RemoveWeakPeakItem(const SignalRef& ref);
|
||||
|
||||
/** 取某信号的弱峰增强勾选状态。 */
|
||||
/** 取某信号的弱峰调整勾选状态。 */
|
||||
bool WeakPeakEnabled(const SignalRef& ref) const
|
||||
{
|
||||
return FindWeakPeakItem(ref) != nullptr;
|
||||
}
|
||||
|
||||
/** 弱峰增强浮动面板是否展开。 */
|
||||
/** 弱峰调整浮动面板是否展开。 */
|
||||
bool weakPeakPanelOpen = true;
|
||||
|
||||
/** 弱峰增强面板左上角位置(客户区像素;<0 表示自动定位)。 */
|
||||
/** 弱峰调整面板左上角位置(客户区像素;<0 表示自动定位)。 */
|
||||
double weakPeakPanelX = -1.0;
|
||||
|
||||
/** 弱峰增强面板左上角纵坐标(<0 表示自动定位)。 */
|
||||
/** 弱峰调整面板左上角纵坐标(<0 表示自动定位)。 */
|
||||
double weakPeakPanelY = -1.0;
|
||||
};
|
||||
|
||||
@@ -593,37 +593,44 @@ namespace jdi
|
||||
std::vector<float>& out);
|
||||
|
||||
/**
|
||||
* @brief 「弱峰增强」:把比周边更弱的纹波波峰/波谷恢复(自适应弱峰增强)。
|
||||
* @brief 「弱峰调整」:把比周边更弱的纹波波峰/波谷恢复,或(负幅度时)把弱峰削弱。
|
||||
*
|
||||
* 本算法**不做任何前置滤波**:需要平滑时用户可以先用「均值滤波」构建一条
|
||||
* 滤波后的信号,再对它做弱峰增强。极值点直接在输入采样上识别。
|
||||
* 滤波后的信号,再对它做弱峰调整。极值点直接在输入采样上识别。
|
||||
*
|
||||
* 单阶处理(全 O(n)):
|
||||
* 1. **识别趋势与极值**:扫描单调段,方向发生翻转处的上一个采样点即为
|
||||
* 波峰(先升后降)或波谷(先降后升);波峰与波谷交替出现。
|
||||
* 2. **判定“弱”**:对第 k 个波峰,取同类的左右相邻波峰(k−2、k+2)。
|
||||
* 若本波峰低于两者的均值,说明它是被削弱的那个;波谷反之(高于两者均值)。
|
||||
* 3. **目标值**(`level` = 弱峰增强等级,0–2,对应面板上的 0%–200%):
|
||||
* * 波峰:左右两个波峰中较小者记为 `lower`、较大者记为 `upper`;
|
||||
* 0 ≤ level ≤ 1 → 目标 = 当前值 + level × (`lower` − 当前值);
|
||||
* 1 < level ≤ 2 → 目标 = `lower` + (level − 1) × (`upper` − `lower`)。
|
||||
* * 波谷:左右两个波谷中较大者记为 `upper`、较小者记为 `lower`;
|
||||
* 0 ≤ level ≤ 1 → 目标 = 当前值 + level × (`upper` − 当前值);
|
||||
* 1 < level ≤ 2 → 目标 = `upper` − (level − 1) × (`upper` − `lower`)。
|
||||
* 即 **0% 完全不动**(可做极小幅度调整)、**100% 拉到较温和的一侧**、
|
||||
* **200% 完全拉平**;两段在 100% 处连续。
|
||||
* 这一步在正、负幅度下**完全一致**(用户要求「弱峰的识别定义与之前相同」)。
|
||||
* 3. **目标值**(`amount` = 调整幅度,-2 – +2,对应面板上的 -200% – +200%):
|
||||
* * **正幅度(增强,与原实现逐位一致)**:以**同类**极值为参照。
|
||||
* 波峰:较小者记为 `lower`、较大者记为 `upper`;
|
||||
* 0 ≤ a ≤ 1 → 目标 = 当前值 + a × (`lower` − 当前值);
|
||||
* 1 < a ≤ 2 → 目标 = `lower` + (a − 1) × (`upper` − `lower`)。
|
||||
* 波谷:较大者记为 `upper`、较小者记为 `lower`;
|
||||
* 0 ≤ a ≤ 1 → 目标 = 当前值 + a × (`upper` − 当前值);
|
||||
* 1 < a ≤ 2 → 目标 = `upper` − (a − 1) × (`upper` − `lower`)。
|
||||
* * **负幅度(削弱)**:以相邻的**异类**极值(波峰的相邻波谷 / 波谷的相邻波峰)为参照。
|
||||
* 令 `near` = 较靠近当前值的那个(波峰 → 较高的波谷;波谷 → 较低的波峰)、
|
||||
* `far` = 另一个:
|
||||
* -1 ≤ a < 0 → 目标 = 当前值 + |a| × (`near` − 当前值);
|
||||
* -2 ≤ a < -1 → 目标 = `near` + (|a| − 1) × (`far` − `near`)。
|
||||
* 即 **-100% 把弱峰拉到相邻异类极值中较近的那个**、**-200% 拉到较远的那个**
|
||||
* (波形被压平甚至抹除)。削弱**不会反向增强**(目标被夹在"不越过当前值"的一侧)。
|
||||
* 4. **平滑偏移**:极值点本身取其目标值,两侧的数据点按相邻两个极值点的偏移量
|
||||
* 平滑过渡(平滑步进,两端导数为 0),使波形整体趋势不变、只在弱峰附近被推回。
|
||||
*
|
||||
* 正常周期的极值不满足条件、偏移量恒为 0,因此输出与输入逐位相同。
|
||||
*
|
||||
* @param [IN] values 原始采样值。
|
||||
* @param [IN] level 弱峰增强等级(0–2,对应 0%–200%,超出范围会被夹取)。
|
||||
* @param [IN] amount 调整幅度(-2 – +2,对应 -200% – +200%,超出范围会被夹取)。
|
||||
* @param [IN] iterations 迭代次数 N(重复应用次数,至少为 1)。
|
||||
* @param [OUT] out 输出数组(长度与 values 相同;原值为 NaN 处保持 NaN)。
|
||||
*/
|
||||
void ComputeWeakPeakBoost(const std::vector<double>& values, double level, int iterations,
|
||||
std::vector<float>& out);
|
||||
void ComputeWeakPeakAdjust(const std::vector<double>& values, double amount, int iterations,
|
||||
std::vector<float>& out);
|
||||
|
||||
/**
|
||||
* @brief 在指定文件的时间轴上查找与给定时刻最接近的采样点。
|
||||
|
||||
+70
-32
@@ -1046,7 +1046,7 @@ namespace jdi
|
||||
namespace
|
||||
{
|
||||
/**
|
||||
* @brief 「弱峰增强」内部使用的极值点(波峰 / 波谷)。
|
||||
* @brief 「弱峰调整」内部使用的极值点(波峰 / 波谷)。
|
||||
*/
|
||||
struct PeakExtremum
|
||||
{
|
||||
@@ -1056,17 +1056,18 @@ namespace jdi
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 「弱峰增强」的单阶处理:把偏弱的波峰上拉、偏弱的波谷下拉。
|
||||
* @brief 「弱峰调整」的单阶处理:把偏弱的波峰上拉 / 偏弱的波谷下拉,
|
||||
* 或(负幅度)把弱峰本身削弱、压平。
|
||||
*
|
||||
* **不做任何前置滤波**(需要平滑时用户可以先用「均值滤波」构建一条滤波后的信号):
|
||||
* 极值点直接在输入采样上通过单调段的方向翻转识别。
|
||||
*
|
||||
* @param [IN] input 本阶的输入采样值。
|
||||
* @param [IN] strength 弱峰增强等级(0–1,已夹取)。
|
||||
* @param [IN] amount 调整幅度(-2 – +2,已夹取;0 = 完全不动)。
|
||||
* @param [OUT] output 本阶的输出(长度与 input 相同;原值为 NaN 处保持 NaN)。
|
||||
* @return 确实有采样点被改动返回 true;完全无弱峰时返回 false。
|
||||
*/
|
||||
bool ApplyWeakPeakStage(const std::vector<float>& input, double strength,
|
||||
bool ApplyWeakPeakStage(const std::vector<float>& input, double amount,
|
||||
std::vector<float>& output, std::vector<PeakExtremum>& extremes)
|
||||
{
|
||||
const std::size_t count = input.size();
|
||||
@@ -1162,32 +1163,67 @@ namespace jdi
|
||||
const double mean = (left.value + right.value) * 0.5;
|
||||
const double lower = std::min(left.value, right.value);
|
||||
const double upper = std::max(left.value, right.value);
|
||||
// 目标值分段插值(`strength` = 等级 0–2):
|
||||
// 0 ≤ s ≤ 1:当前值 ↔ 较温和的一侧(波峰取较低的波峰 lower、波谷取较高的波谷 upper);
|
||||
// 1 < s ≤ 2:该侧 ↔ 另一侧(与原先 0–100% 的语义一致)。
|
||||
// 两段在 s = 1 处连续,因此 s = 0 完全不动、s = 2 完全拉平。
|
||||
double destination = 0.0;
|
||||
if (current.type > 0)
|
||||
if (!(current.type > 0 ? (current.value < mean) : (current.value > mean)))
|
||||
{
|
||||
// 波峰:低于左右两个波峰的均值 → 判定为弱峰,上拉到等级对应的目标值。
|
||||
if (!(current.value < mean))
|
||||
// 不是弱峰:本极值点不动。
|
||||
continue;
|
||||
}
|
||||
double destination = current.value;
|
||||
if (amount >= 0.0)
|
||||
{
|
||||
// ---- 正幅度(增强,与旧实现逐位一致)----
|
||||
// 目标值分段插值(`amount` = 幅度 0–2):
|
||||
// 0 ≤ a ≤ 1:当前值 ↔ 较温和的一侧(波峰取较低的波峰 lower、波谷取较高的波谷 upper);
|
||||
// 1 < a ≤ 2:该侧 ↔ 另一侧(与原先 0–100% 的语义一致)。
|
||||
// 两段在 a = 1 处连续,因此 a = 0 完全不动、a = 2 完全拉平。
|
||||
// ⚠️ 波峰从 `lower` **向上**走到 `upper`、波谷从 `upper` **向下**走到 `lower`,
|
||||
// 两者方向相反(符号不能写成一样)。
|
||||
if (current.type > 0)
|
||||
{
|
||||
continue;
|
||||
destination = (amount <= 1.0)
|
||||
? (current.value + amount * (lower - current.value))
|
||||
: (lower + (amount - 1.0) * (upper - lower));
|
||||
}
|
||||
else
|
||||
{
|
||||
destination = (amount <= 1.0)
|
||||
? (current.value + amount * (upper - current.value))
|
||||
: (upper - (amount - 1.0) * (upper - lower));
|
||||
}
|
||||
destination = (strength <= 1.0)
|
||||
? (current.value + strength * (lower - current.value))
|
||||
: (lower + (strength - 1.0) * (upper - lower));
|
||||
}
|
||||
else
|
||||
{
|
||||
// 波谷:高于左右两个波谷的均值 → 判定为弱峰,下拉到等级对应的目标值。
|
||||
if (!(current.value > mean))
|
||||
// ---- 负幅度(削弱)----
|
||||
// 参照物改为相邻的**异类**极值(波峰看相邻波谷、波谷看相邻波峰),
|
||||
// 并且"较近的那个"对波峰是较高的波谷、对波谷是较低的波峰。
|
||||
const PeakExtremum& nearLeft = extremes[k - 1];
|
||||
const PeakExtremum& nearRight = extremes[k + 1];
|
||||
if (nearLeft.type == current.type || nearRight.type == current.type)
|
||||
{
|
||||
continue; // 极值序列本应交替;异常时不动这一点
|
||||
}
|
||||
if (!std::isfinite(nearLeft.value) || !std::isfinite(nearRight.value))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
destination = (strength <= 1.0)
|
||||
? (current.value + strength * (upper - current.value))
|
||||
: (upper - (strength - 1.0) * (upper - lower));
|
||||
const double nearValue = (current.type > 0) ? std::max(nearLeft.value, nearRight.value)
|
||||
: std::min(nearLeft.value, nearRight.value);
|
||||
const double farValue = (current.type > 0) ? std::min(nearLeft.value, nearRight.value)
|
||||
: std::max(nearLeft.value, nearRight.value);
|
||||
const double magnitude = std::min(2.0, -amount);
|
||||
destination = (magnitude <= 1.0)
|
||||
? (current.value + magnitude * (nearValue - current.value))
|
||||
: (nearValue + (magnitude - 1.0) * (farValue - nearValue));
|
||||
// ⚠️ 削弱**不得反向增强**:相邻异类极值落在"错误的一侧"时(例如噪声导致的
|
||||
// 波峰反而低于相邻波谷),把目标夹回当前值所在的一侧。
|
||||
if (current.type > 0)
|
||||
{
|
||||
destination = std::min(destination, current.value);
|
||||
}
|
||||
else
|
||||
{
|
||||
destination = std::max(destination, current.value);
|
||||
}
|
||||
}
|
||||
shift[k] = destination - current.value;
|
||||
}
|
||||
@@ -1237,8 +1273,8 @@ namespace jdi
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void ComputeWeakPeakBoost(const std::vector<double>& values, double level, int iterations,
|
||||
std::vector<float>& out)
|
||||
void ComputeWeakPeakAdjust(const std::vector<double>& values, double amount, int iterations,
|
||||
std::vector<float>& out)
|
||||
{
|
||||
const std::size_t count = values.size();
|
||||
out.assign(count, std::numeric_limits<float>::quiet_NaN());
|
||||
@@ -1249,7 +1285,7 @@ namespace jdi
|
||||
|
||||
// 第 1 阶:从原始采样值出发(非有限值保持 NaN)。
|
||||
// 工作缓冲用线程本地变量复用容量:单条曲线动辄上千万采样,若每次调用都重新分配
|
||||
// 并零初始化,单条「弱峰增强」的耗时会被明显放大(内存分配 + page fault)。
|
||||
// 并零初始化,单条「弱峰调整」的耗时会被明显放大(内存分配 + page fault)。
|
||||
thread_local std::vector<float> currentBuffer;
|
||||
thread_local std::vector<float> nextBuffer;
|
||||
thread_local std::vector<PeakExtremum> extremesBuffer;
|
||||
@@ -1265,15 +1301,17 @@ namespace jdi
|
||||
}
|
||||
|
||||
// 「迭代次数 N」与「均值滤波」的迭代次数语义一致:把同一处理**重复应用 N 次**,
|
||||
// 每一阶以上一阶的结果为输入。一阶时改定量已严格等于「等级」对应的目标值;
|
||||
// 多次迭代时相邻的弱峰会互相抬高彼此的基准,从而把较宽的弱峰区逐步恢复。
|
||||
// 每一阶以上一阶的结果为输入。一阶时改定量已严格等于「幅度」对应的目标值;
|
||||
// 多次迭代时相邻的弱峰会互相抬高彼此的基准,从而把较宽的弱峰区逐步恢复(或削弱)。
|
||||
const int stages = std::max(1, std::min(iterations, 1000));
|
||||
// 增强等级 0–2(对应面板上的 0%–200%):0 完全不动,1 拉到较温和的一侧,2 完全拉平。
|
||||
const double strength = std::max(0.0, std::min(2.0, level));
|
||||
// 调整幅度 -2 – +2(对应面板上的 -200% – +200%):
|
||||
// > 0 增强(0 = 不动,1 = 拉到较温和的一侧,2 = 完全拉平);
|
||||
// < 0 削弱(-1 = 拉到相邻异类极值中较近的一个,-2 = 拉到较远的那个)。
|
||||
const double clamped = std::max(-2.0, std::min(2.0, amount));
|
||||
std::vector<float>& next = nextBuffer;
|
||||
for (int stage = 0; stage < stages; ++stage)
|
||||
{
|
||||
if (!ApplyWeakPeakStage(current, strength, next, extremesBuffer))
|
||||
if (!ApplyWeakPeakStage(current, clamped, next, extremesBuffer))
|
||||
{
|
||||
// 这一阶没有任何采样点需要调整:后续迭代次数也不会再有变化,提前结束。
|
||||
break;
|
||||
@@ -1612,9 +1650,9 @@ namespace jdi
|
||||
}
|
||||
}
|
||||
|
||||
// 均值滤波 / 中心轴边沿计数 / 弱峰增强的条目同样持有信号引用,必须一起删除/前移。
|
||||
// 均值滤波 / 中心轴边沿计数 / 弱峰调整的条目同样持有信号引用,必须一起删除/前移。
|
||||
// 三类条目都是「带 `ref` 的结构体」,因此用泛型 lambda 统一处理
|
||||
//(弱峰增强的参数与均值滤波不同,不能再共用同一个具体类型)。
|
||||
//(弱峰调整的参数与均值滤波不同,不能再共用同一个具体类型)。
|
||||
const auto purgeRefs = [fileIndex, signalIndex](auto& items)
|
||||
{
|
||||
using ItemType = typename std::decay_t<decltype(items)>::value_type;
|
||||
@@ -1935,7 +1973,7 @@ namespace jdi
|
||||
lane.meanFilterPanelOpen = source.meanFilterPanelOpen;
|
||||
lane.meanFilterPanelX = source.meanFilterPanelX;
|
||||
lane.meanFilterPanelY = source.meanFilterPanelY;
|
||||
// 拆分后每个子网格只保留自己那个信号的均值滤波 / 中心轴 / 弱峰增强条目。
|
||||
// 拆分后每个子网格只保留自己那个信号的均值滤波 / 中心轴 / 弱峰调整条目。
|
||||
lane.meanFilterItems.clear();
|
||||
lane.edgeCenterItems.clear();
|
||||
lane.weakPeakItems.clear();
|
||||
|
||||
Reference in new issue
Block a user