improve:墨迹平滑方案

This commit is contained in:
2025-07-20 15:21:59 +08:00
parent 428b278c78
commit d5142ad82c
8 changed files with 479 additions and 12 deletions
+46 -1
View File
@@ -1285,6 +1285,47 @@ namespace Ink_Canvas {
if (!isLoaded) return;
drawingAttributes.FitToCurve = ToggleSwitchFitToCurve.IsOn;
Settings.Canvas.FitToCurve = ToggleSwitchFitToCurve.IsOn;
// 启用原来的FitToCurve时自动禁用高级贝塞尔平滑
if (ToggleSwitchFitToCurve.IsOn)
{
ToggleSwitchAdvancedBezierSmoothing.IsOn = false;
Settings.Canvas.UseAdvancedBezierSmoothing = false;
}
SaveSettingsToFile();
}
private void ToggleSwitchAdvancedBezierSmoothing_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Canvas.UseAdvancedBezierSmoothing = ToggleSwitchAdvancedBezierSmoothing.IsOn;
// 启用高级贝塞尔平滑时自动禁用原来的FitToCurve
if (ToggleSwitchAdvancedBezierSmoothing.IsOn)
{
ToggleSwitchFitToCurve.IsOn = false;
Settings.Canvas.FitToCurve = false;
drawingAttributes.FitToCurve = false;
}
SaveSettingsToFile();
}
private void AdvancedSmoothingStrengthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {
if (!isLoaded) return;
Settings.Canvas.AdvancedSmoothingStrength = AdvancedSmoothingStrengthSlider.Value;
SaveSettingsToFile();
}
private void AdvancedSmoothingTensionSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {
if (!isLoaded) return;
Settings.Canvas.AdvancedSmoothingTension = AdvancedSmoothingTensionSlider.Value;
SaveSettingsToFile();
}
private void ToggleSwitchEnableAdaptiveSmoothing_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Canvas.EnableAdaptiveSmoothing = ToggleSwitchEnableAdaptiveSmoothing.IsOn;
SaveSettingsToFile();
}
@@ -1588,7 +1629,11 @@ namespace Ink_Canvas {
Settings.Canvas.EraserShapeType = 1;
Settings.Canvas.HideStrokeWhenSelecting = false;
Settings.Canvas.ClearCanvasAndClearTimeMachine = false;
Settings.Canvas.FitToCurve = true;
Settings.Canvas.FitToCurve = false;
Settings.Canvas.UseAdvancedBezierSmoothing = true;
Settings.Canvas.AdvancedSmoothingStrength = 0.6;
Settings.Canvas.AdvancedSmoothingTension = 0.5;
Settings.Canvas.EnableAdaptiveSmoothing = true;
Settings.Canvas.EnablePressureTouchMode = false;
Settings.Canvas.DisablePressure = false;
Settings.Canvas.AutoStraightenLine = true;
+22 -4
View File
@@ -515,13 +515,31 @@ namespace Ink_Canvas {
ToggleSwitchHideStrokeWhenSelecting.IsOn = Settings.Canvas.HideStrokeWhenSelecting;
if (Settings.Canvas.FitToCurve) {
ToggleSwitchFitToCurve.IsOn = true;
drawingAttributes.FitToCurve = true;
} else {
// 初始化贝塞尔曲线平滑设置
if (Settings.Canvas.UseAdvancedBezierSmoothing)
{
// 如果启用高级贝塞尔平滑,则禁用原来的FitToCurve
ToggleSwitchAdvancedBezierSmoothing.IsOn = true;
ToggleSwitchFitToCurve.IsOn = false;
drawingAttributes.FitToCurve = false;
}
else if (Settings.Canvas.FitToCurve)
{
// 如果启用原来的FitToCurve,则禁用高级贝塞尔平滑
ToggleSwitchFitToCurve.IsOn = true;
ToggleSwitchAdvancedBezierSmoothing.IsOn = false;
drawingAttributes.FitToCurve = true;
}
else
{
// 两者都禁用
ToggleSwitchFitToCurve.IsOn = false;
ToggleSwitchAdvancedBezierSmoothing.IsOn = false;
drawingAttributes.FitToCurve = false;
}
AdvancedSmoothingStrengthSlider.Value = Settings.Canvas.AdvancedSmoothingStrength;
AdvancedSmoothingTensionSlider.Value = Settings.Canvas.AdvancedSmoothingTension;
ToggleSwitchEnableAdaptiveSmoothing.IsOn = Settings.Canvas.EnableAdaptiveSmoothing;
// 初始化直线自动拉直相关设置
ToggleSwitchAutoStraightenLine.IsOn = Settings.Canvas.AutoStraightenLine;
+31 -1
View File
@@ -433,6 +433,7 @@ namespace Ink_Canvas {
#region
private void MouseTouchMove(Point endP) {
// 禁用原有的FitToCurve,使用新的高级贝塞尔曲线平滑
if (Settings.Canvas.FitToCurve == true) drawingAttributes.FitToCurve = false;
ViewboxFloatingBar.IsHitTestVisible = false;
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
@@ -1589,7 +1590,36 @@ namespace Ink_Canvas {
}
}
if (Settings.Canvas.FitToCurve == true) drawingAttributes.FitToCurve = true;
// 应用高级贝塞尔曲线平滑
if (Settings.Canvas.UseAdvancedBezierSmoothing)
{
try
{
var advancedSmoothing = new Helpers.AdvancedBezierSmoothing
{
SmoothingStrength = Settings.Canvas.AdvancedSmoothingStrength,
Tension = Settings.Canvas.AdvancedSmoothingTension,
EnableAdaptiveSmoothing = Settings.Canvas.EnableAdaptiveSmoothing
};
// 对临时笔画应用平滑
if (lastTempStroke != null)
{
var smoothedStroke = advancedSmoothing.SmoothStroke(lastTempStroke);
inkCanvas.Strokes.Remove(lastTempStroke);
lastTempStroke = smoothedStroke;
inkCanvas.Strokes.Add(smoothedStroke);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"形状绘制高级贝塞尔曲线平滑失败: {ex.Message}");
}
}
else if (Settings.Canvas.FitToCurve == true)
{
drawingAttributes.FitToCurve = true;
}
}
private bool NeedUpdateIniP() {
@@ -16,6 +16,7 @@ namespace Ink_Canvas {
private const double LINE_STRAIGHTEN_THRESHOLD = 0.20; // 默认灵敏度阈值,与UI默认值对应
private void inkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) {
// 禁用原有的FitToCurve,使用新的高级贝塞尔曲线平滑
if (Settings.Canvas.FitToCurve == true) drawingAttributes.FitToCurve = false;
try {
@@ -572,7 +573,37 @@ namespace Ink_Canvas {
}
catch { }
if (Settings.Canvas.FitToCurve == true) drawingAttributes.FitToCurve = true;
// 应用高级贝塞尔曲线平滑
if (Settings.Canvas.UseAdvancedBezierSmoothing)
{
try
{
var advancedSmoothing = new Helpers.AdvancedBezierSmoothing
{
SmoothingStrength = Settings.Canvas.AdvancedSmoothingStrength,
Tension = Settings.Canvas.AdvancedSmoothingTension,
EnableAdaptiveSmoothing = Settings.Canvas.EnableAdaptiveSmoothing
};
var smoothedStroke = advancedSmoothing.SmoothStroke(e.Stroke);
// 替换原始笔画
SetNewBackupOfStroke();
_currentCommitType = CommitReason.ShapeRecognition;
inkCanvas.Strokes.Remove(e.Stroke);
inkCanvas.Strokes.Add(smoothedStroke);
_currentCommitType = CommitReason.UserInput;
}
catch (Exception ex)
{
// 如果高级平滑失败,回退到原始笔画
System.Diagnostics.Debug.WriteLine($"高级贝塞尔曲线平滑失败: {ex.Message}");
}
}
else if (Settings.Canvas.FitToCurve == true)
{
drawingAttributes.FitToCurve = true;
}
}
// New method: Checks if a stroke is potentially a straight line