From c5355d74976a743850de1d12ad350b7699bd5d1e Mon Sep 17 00:00:00 2001
From: unknown <2564608840@qq.com>
Date: Sun, 20 Jul 2025 15:27:02 +0800
Subject: [PATCH] =?UTF-8?q?improve:=E5=A2=A8=E8=BF=B9=E5=B9=B3=E6=BB=91?=
=?UTF-8?q?=E6=96=B9=E6=A1=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Ink Canvas/Helpers/AdvancedBezierSmoothing.cs | 87 +++++++++++++++----
Ink Canvas/MainWindow.xaml | 6 +-
Ink Canvas/MainWindow_cs/MW_Settings.cs | 4 +-
Ink Canvas/Resources/Settings.cs | 4 +-
.../InkCanvasForClass_MarkupCompile.cache | 2 +-
5 files changed, 78 insertions(+), 25 deletions(-)
diff --git a/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs b/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs
index c495af4d..f05135dc 100644
--- a/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs
+++ b/Ink Canvas/Helpers/AdvancedBezierSmoothing.cs
@@ -33,12 +33,12 @@ namespace Ink_Canvas.Helpers
///
/// 最小点间距阈值
///
- public double MinPointDistance { get; set; } = 2.0;
+ public double MinPointDistance { get; set; } = 3.0; // 增加最小间距,减少毛刺
///
/// 最大点间距阈值
///
- public double MaxPointDistance { get; set; } = 50.0;
+ public double MaxPointDistance { get; set; } = 30.0; // 减少最大间距,提高平滑度
///
/// 对笔画进行高级贝塞尔曲线平滑处理
@@ -84,7 +84,11 @@ namespace Ink_Canvas.Helpers
// 添加第一个点
filteredPoints.Add(points[0]);
- for (int i = 1; i < points.Count; i++)
+ // 使用移动平均来减少毛刺
+ var smoothedPoints = new List();
+ int windowSize = 3; // 移动平均窗口大小
+
+ for (int i = 0; i < points.Count; i++)
{
var currentPoint = points[i];
var lastPoint = filteredPoints[filteredPoints.Count - 1];
@@ -95,6 +99,25 @@ namespace Ink_Canvas.Helpers
if (distance < MinPointDistance)
continue;
+ // 应用移动平均平滑
+ if (i >= windowSize - 1)
+ {
+ double avgX = 0, avgY = 0, avgPressure = 0;
+ for (int j = 0; j < windowSize; j++)
+ {
+ var point = points[i - j];
+ avgX += point.X;
+ avgY += point.Y;
+ avgPressure += point.PressureFactor;
+ }
+ avgX /= windowSize;
+ avgY /= windowSize;
+ avgPressure /= windowSize;
+
+ var smoothedPoint = new StylusPoint(avgX, avgY, (float)avgPressure);
+ currentPoint = smoothedPoint;
+ }
+
// 如果距离太远,插入中间点
if (distance > MaxPointDistance)
{
@@ -132,8 +155,8 @@ namespace Ink_Canvas.Helpers
// 第一个点的控制点
Point nextPoint = points[i + 1].ToPoint();
controlPoint = new Point(
- currentPoint.X + (nextPoint.X - currentPoint.X) * Tension * 0.5,
- currentPoint.Y + (nextPoint.Y - currentPoint.Y) * Tension * 0.5
+ currentPoint.X + (nextPoint.X - currentPoint.X) * Tension * 0.3, // 减少张力,减少毛刺
+ currentPoint.Y + (nextPoint.Y - currentPoint.Y) * Tension * 0.3
);
}
else if (i == points.Count - 1)
@@ -141,8 +164,8 @@ namespace Ink_Canvas.Helpers
// 最后一个点的控制点
Point prevPoint = points[i - 1].ToPoint();
controlPoint = new Point(
- currentPoint.X + (currentPoint.X - prevPoint.X) * Tension * 0.5,
- currentPoint.Y + (currentPoint.Y - prevPoint.Y) * Tension * 0.5
+ currentPoint.X + (currentPoint.X - prevPoint.X) * Tension * 0.3,
+ currentPoint.Y + (currentPoint.Y - prevPoint.Y) * Tension * 0.3
);
}
else
@@ -151,14 +174,26 @@ namespace Ink_Canvas.Helpers
Point prevPoint = points[i - 1].ToPoint();
Point nextPoint = points[i + 1].ToPoint();
- // 计算切线方向
- double tangentX = (nextPoint.X - prevPoint.X) * 0.5;
- double tangentY = (nextPoint.Y - prevPoint.Y) * 0.5;
+ // 计算切线方向,使用更保守的方法
+ double tangentX = (nextPoint.X - prevPoint.X) * 0.3; // 减少切线强度
+ double tangentY = (nextPoint.Y - prevPoint.Y) * 0.3;
+
+ // 应用张力参数,但限制最大偏移
+ double maxOffset = 10.0; // 限制控制点最大偏移距离
+ double offsetX = tangentX * Tension;
+ double offsetY = tangentY * Tension;
+
+ // 限制偏移距离
+ double offsetDistance = Math.Sqrt(offsetX * offsetX + offsetY * offsetY);
+ if (offsetDistance > maxOffset)
+ {
+ offsetX = offsetX * maxOffset / offsetDistance;
+ offsetY = offsetY * maxOffset / offsetDistance;
+ }
- // 应用张力参数
controlPoint = new Point(
- currentPoint.X + tangentX * Tension,
- currentPoint.Y + tangentY * Tension
+ currentPoint.X + offsetX,
+ currentPoint.Y + offsetY
);
}
@@ -185,9 +220,9 @@ namespace Ink_Canvas.Helpers
var startControl = controlPoints[i];
var endControl = controlPoints[i + 1];
- // 计算自适应步长
+ // 计算自适应步长,减少步数以避免毛刺
double distance = GetDistance(startPoint.ToPoint(), endPoint.ToPoint());
- int steps = Math.Max(3, Math.Min(20, (int)(distance / 5.0)));
+ int steps = Math.Max(2, Math.Min(15, (int)(distance / 8.0))); // 减少步数,增加步长
// 生成贝塞尔曲线点
for (int j = 0; j <= steps; j++)
@@ -195,9 +230,16 @@ namespace Ink_Canvas.Helpers
double t = (double)j / steps;
var curvePoint = CalculateBezierPoint(startPoint.ToPoint(), startControl, endControl, endPoint.ToPoint(), t);
- // 插值压感值
+ // 插值压感值,使用更平滑的插值
float pressure = InterpolatePressure(startPoint.PressureFactor, endPoint.PressureFactor, t);
+ // 对压感值进行额外的平滑处理
+ if (j > 0 && j < steps)
+ {
+ float prevPressure = curvePoints[curvePoints.Count - 1].PressureFactor;
+ pressure = (prevPressure + pressure) * 0.5f; // 简单的移动平均
+ }
+
var stylusPoint = new StylusPoint(curvePoint.X, curvePoint.Y, pressure);
curvePoints.Add(stylusPoint);
}
@@ -249,7 +291,18 @@ namespace Ink_Canvas.Helpers
///
private float InterpolatePressure(float p1, float p2, double ratio)
{
- return (float)(p1 + (p2 - p1) * ratio);
+ // 使用平滑的插值函数来减少毛刺
+ double smoothRatio = SmoothStep(ratio);
+ return (float)(p1 + (p2 - p1) * smoothRatio);
+ }
+
+ ///
+ /// 平滑步进函数,用于减少插值时的毛刺
+ ///
+ private double SmoothStep(double t)
+ {
+ // 使用三次平滑函数
+ return t * t * (3.0 - 2.0 * t);
}
///
diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml
index 6a165a37..5916c263 100644
--- a/Ink Canvas/MainWindow.xaml
+++ b/Ink Canvas/MainWindow.xaml
@@ -799,7 +799,7 @@
@@ -809,7 +809,7 @@
@@ -822,7 +822,7 @@
IsOn="True" FontFamily="Microsoft YaHei UI" FontWeight="Bold"
Toggled="ToggleSwitchEnableAdaptiveSmoothing_Toggled" />
-
+
diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs
index c330aff4..d93965a6 100644
--- a/Ink Canvas/MainWindow_cs/MW_Settings.cs
+++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs
@@ -1631,8 +1631,8 @@ namespace Ink_Canvas {
Settings.Canvas.ClearCanvasAndClearTimeMachine = false;
Settings.Canvas.FitToCurve = false;
Settings.Canvas.UseAdvancedBezierSmoothing = true;
- Settings.Canvas.AdvancedSmoothingStrength = 0.6;
- Settings.Canvas.AdvancedSmoothingTension = 0.5;
+ Settings.Canvas.AdvancedSmoothingStrength = 0.4;
+ Settings.Canvas.AdvancedSmoothingTension = 0.3;
Settings.Canvas.EnableAdaptiveSmoothing = true;
Settings.Canvas.EnablePressureTouchMode = false;
Settings.Canvas.DisablePressure = false;
diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs
index 01d44acb..04bf5e92 100644
--- a/Ink Canvas/Resources/Settings.cs
+++ b/Ink Canvas/Resources/Settings.cs
@@ -51,9 +51,9 @@ namespace Ink_Canvas
[JsonProperty("useAdvancedBezierSmoothing")]
public bool UseAdvancedBezierSmoothing { get; set; } = true; // 默认启用高级贝塞尔曲线平滑
[JsonProperty("advancedSmoothingStrength")]
- public double AdvancedSmoothingStrength { get; set; } = 0.6; // 高级平滑强度 (0.0 - 1.0)
+ public double AdvancedSmoothingStrength { get; set; } = 0.4; // 高级平滑强度 (0.0 - 1.0),降低以减少毛刺
[JsonProperty("advancedSmoothingTension")]
- public double AdvancedSmoothingTension { get; set; } = 0.5; // 高级平滑张力 (0.0 - 1.0)
+ public double AdvancedSmoothingTension { get; set; } = 0.3; // 高级平滑张力 (0.0 - 1.0),降低以减少毛刺
[JsonProperty("enableAdaptiveSmoothing")]
public bool EnableAdaptiveSmoothing { get; set; } = true; // 是否启用自适应平滑
[JsonProperty("clearCanvasAndClearTimeMachine")]
diff --git a/Ink Canvas/obj/Debug/net472/InkCanvasForClass_MarkupCompile.cache b/Ink Canvas/obj/Debug/net472/InkCanvasForClass_MarkupCompile.cache
index 9b3fbcb7..b463b3ac 100644
--- a/Ink Canvas/obj/Debug/net472/InkCanvasForClass_MarkupCompile.cache
+++ b/Ink Canvas/obj/Debug/net472/InkCanvasForClass_MarkupCompile.cache
@@ -12,7 +12,7 @@ TRACE;DEBUG;NETFRAMEWORK;NET472;;NET30_OR_GREATER;NET35_OR_GREATER;NET40_OR_GREA
E:\ICC CE\ICC CE main\community\Ink Canvas\App.xaml
21348134359
-731095817143
+74373288771
471037513499
Helpers\Plugins\BuiltIn\SuperLauncher\LauncherSettingsControl.xaml;Helpers\Plugins\BuiltIn\SuperLauncher\LauncherWindow.xaml;MainWindow.xaml;MainWindow_cs\MW_Eraser.xaml;Resources\DrawShapeImageDictionary.xaml;Resources\IconImageDictionary.xaml;Resources\SeewoImageDictionary.xaml;Resources\Styles\Dark.xaml;Resources\Styles\Light.xaml;Windows\AddCustomIconWindow.xaml;Windows\AddPickNameBackgroundWindow.xaml;Windows\CountdownTimerWindow.xaml;Windows\CustomIconWindow.xaml;Windows\CycleProcessBar.xaml;Windows\HasNewUpdateWindow.xaml;Windows\ManagePickNameBackgroundsWindow.xaml;Windows\NamesInputWindow.xaml;Windows\OperatingGuideWindow.xaml;Windows\PluginSettingsWindow.xaml;Windows\RandWindow.xaml;Windows\YesOrNoNotificationWindow.xaml;