improve:墨迹平滑方案
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user