diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml
index a4ffea28..1a4e1a2f 100644
--- a/Ink Canvas/MainWindow.xaml
+++ b/Ink Canvas/MainWindow.xaml
@@ -944,13 +944,13 @@
Visibility="{Binding ElementName=ToggleSwitchAutoStraightenLine, Path=IsOn, Converter={StaticResource BooleanToVisibilityConverter}}">
-
-
+
diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs
index 9e5f0e9d..4d031d54 100644
--- a/Ink Canvas/MainWindow_cs/MW_Settings.cs
+++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs
@@ -753,7 +753,16 @@ namespace Ink_Canvas {
private void LineStraightenSensitivitySlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) {
if (!isLoaded) return;
+ // 记录旧值用于调试
+ double oldValue = Settings.InkToShape.LineStraightenSensitivity;
+
+ // 确保灵敏度值被正确保存到设置中
Settings.InkToShape.LineStraightenSensitivity = e.NewValue;
+
+ // 输出调试信息,观察值变化
+ System.Diagnostics.Debug.WriteLine($"LineStraightenSensitivity changed: {oldValue} -> {e.NewValue}");
+
+ // 立即保存设置到文件,确保设置不会丢失
SaveSettingsToFile();
}
diff --git a/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs b/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs
index 5116a1d3..e1a386ca 100644
--- a/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs
+++ b/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs
@@ -13,7 +13,7 @@ namespace Ink_Canvas {
public partial class MainWindow : Window {
private StrokeCollection newStrokes = new StrokeCollection();
private List circles = new List();
- private const double LINE_STRAIGHTEN_THRESHOLD = 0.10; // 降低阈值,让直线检测更严格
+ private const double LINE_STRAIGHTEN_THRESHOLD = 0.20; // 默认灵敏度阈值,与UI默认值对应
private void inkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) {
if (Settings.Canvas.FitToCurve == true) drawingAttributes.FitToCurve = false;
@@ -125,10 +125,22 @@ namespace Ink_Canvas {
Point startPoint = e.Stroke.StylusPoints[0].ToPoint();
Point endPoint = e.Stroke.StylusPoints[e.Stroke.StylusPoints.Count - 1].ToPoint();
- // 端点吸附和直线拉直完全分离处理
+ // 记录是否需要拉直线条,默认不拉直
+ bool shouldStraighten = false;
bool snapped = false;
- // 只有在启用端点吸附时才尝试吸附
+ // 首先检查是否应该拉直线条(使用灵敏度设置),这是主要判断条件
+ // 读取实际的灵敏度设置值
+ double sensitivity = Settings.InkToShape.LineStraightenSensitivity;
+ System.Diagnostics.Debug.WriteLine($"当前灵敏度值: {sensitivity}");
+
+ // 将灵敏度值传递给判断函数
+ shouldStraighten = ShouldStraightenLine(e.Stroke);
+
+ // 输出一些调试信息,帮助理解灵敏度设置的效果
+ System.Diagnostics.Debug.WriteLine($"LineStraightenSensitivity: {Settings.InkToShape.LineStraightenSensitivity}, ShouldStraighten: {shouldStraighten}");
+
+ // 再检查端点吸附功能,这是独立的可选功能
if (Settings.Canvas.LineEndpointSnapping) {
// 只有在启用了形状识别(矩形或三角形)时才执行端点吸附
if (Settings.InkToShape.IsInkToShapeRectangle || Settings.InkToShape.IsInkToShapeTriangle) {
@@ -141,12 +153,9 @@ namespace Ink_Canvas {
}
}
- // 独立检查是否应该拉直线条,无论端点吸附是否启用或成功
- bool shouldStraighten = ShouldStraightenLine(e.Stroke);
-
- // 如果满足任一条件(吸附成功或应该拉直),则创建直线
- // 这里的条件是"或"关系,只要有一个条件满足就会创建直线
- if (snapped || shouldStraighten) {
+ // 如果满足任一条件(需要拉直或成功吸附),则创建直线
+ // 这确保灵敏度设置独立于端点吸附功能发挥作用
+ if (shouldStraighten || snapped) {
StylusPointCollection straightLinePoints = CreateStraightLine(startPoint, endPoint);
Stroke straightStroke = new Stroke(straightLinePoints) {
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
@@ -586,10 +595,25 @@ namespace Ink_Canvas {
if (lineLength < Settings.Canvas.AutoStraightenLineThreshold)
return false;
- // 获取用户设置的灵敏度值
+ // 获取用户设置的灵敏度值,确保使用正确的设置
double sensitivity = Settings.InkToShape.LineStraightenSensitivity;
- // 快速检查使用略宽松的阈值
- double quickThreshold = Math.Min(sensitivity * 1.5, 0.20);
+
+ // 输出当前灵敏度值(调试用)
+ System.Diagnostics.Debug.WriteLine($"IsPotentialStraightLine - sensitivity: {sensitivity}, length: {lineLength}");
+
+ // 根据灵敏度调整快速检查阈值
+ double quickThreshold;
+
+ // 如果灵敏度超过1.0,使用更宽松的快速检查标准
+ if (sensitivity > 1.0) {
+ // 高灵敏度模式 - 使用更宽松的阈值
+ quickThreshold = Math.Min(0.2 + (sensitivity - 1.0) * 0.3, 0.5); // 映射到0.2-0.5范围
+ } else {
+ // 常规灵敏度模式
+ quickThreshold = Math.Min(sensitivity * 1.5, 0.20);
+ }
+
+ System.Diagnostics.Debug.WriteLine($"使用快速检查阈值: {quickThreshold}");
// 快速检查:计算几个关键点与直线的距离
if (stroke.StylusPoints.Count >= 10) {
@@ -606,12 +630,27 @@ namespace Ink_Canvas {
double midDeviation = DistanceFromLineToPoint(start, end, midPoint);
double threeQuarterDeviation = DistanceFromLineToPoint(start, end, threeQuarterPoint);
- // 如果任一点偏离太大,直接排除
+ // 使用相对偏差:偏差与线长的比例,并使用灵敏度进行调整
double quickRelativeThreshold = lineLength * quickThreshold;
- if (quarterDeviation > quickRelativeThreshold ||
- midDeviation > quickRelativeThreshold ||
- threeQuarterDeviation > quickRelativeThreshold) {
- return false;
+
+ // 记录检测到的偏差(调试用)
+ System.Diagnostics.Debug.WriteLine($"Deviations: q={quarterDeviation}, m={midDeviation}, tq={threeQuarterDeviation}, threshold={quickRelativeThreshold}");
+
+ // 如果灵敏度超过1.5,则即使有一个点满足条件也认为可能是直线
+ if (sensitivity > 1.5) {
+ // 超高灵敏度模式:只要有一个关键点偏差小,就认为可能是直线
+ if (quarterDeviation <= quickRelativeThreshold ||
+ midDeviation <= quickRelativeThreshold ||
+ threeQuarterDeviation <= quickRelativeThreshold) {
+ return true;
+ }
+ } else {
+ // 常规判断:如果任一点偏离太大,直接排除
+ if (quarterDeviation > quickRelativeThreshold ||
+ midDeviation > quickRelativeThreshold ||
+ threeQuarterDeviation > quickRelativeThreshold) {
+ return false;
+ }
}
}
@@ -630,12 +669,20 @@ namespace Ink_Canvas {
// 如果线条太短,不进行拉直处理,使用设置中的阈值
if (lineLength < Settings.Canvas.AutoStraightenLineThreshold) {
+ // 显示调试信息 - 线条长度不足
+ // MessageBox.Show($"线条太短: {lineLength} < {Settings.Canvas.AutoStraightenLineThreshold}", "调试信息");
return false;
}
- // 获取用户设置的灵敏度值
+ // 获取用户设置的灵敏度值,确保使用正确的值进行后续判断
double sensitivity = Settings.InkToShape.LineStraightenSensitivity;
+ // 输出详细的调试信息
+ System.Diagnostics.Debug.WriteLine($"ShouldStraightenLine - sensitivity: {sensitivity}, length: {lineLength}");
+
+ // 临时:显示调试消息框
+ // MessageBox.Show($"灵敏度值: {sensitivity}", "调试信息");
+
// 计算点与直线的偏差
double totalDeviation = 0;
int pointCount = 0;
@@ -652,38 +699,73 @@ namespace Ink_Canvas {
// 计算平均偏差
double avgDeviation = totalDeviation / pointCount;
- // 检查点分布的一致性 - 如果有些点偏离很大而其他点很接近直线,表明线条有明显弯曲
- double deviationVariance = 0;
- foreach (StylusPoint sp in stroke.StylusPoints) {
- Point p = sp.ToPoint();
- double deviation = DistanceFromLineToPoint(start, end, p);
- deviationVariance += Math.Pow(deviation - avgDeviation, 2);
- }
- deviationVariance /= pointCount;
+ // 更详细的调试信息
+ System.Diagnostics.Debug.WriteLine($"Max deviation: {maxDeviation}, Avg: {avgDeviation}, Threshold: {sensitivity * lineLength}");
- // 如果最大偏差超过线长的阈值比例,或者偏差方差较大(表示不均匀弯曲),则不拉直
- if ((maxDeviation / lineLength) > sensitivity) {
- return false;
- }
+ // 支持更广泛的灵敏度范围 (0.05-2.0)
- // 如果偏差方差大,说明线条弯曲不均匀
- if (deviationVariance > (sensitivity * lineLength * 0.05)) {
- return false;
- }
-
- // 检查中点偏离情况 - 针对弧形线条特别有效
- if (stroke.StylusPoints.Count > 10) {
- int midIndex = stroke.StylusPoints.Count / 2;
- Point midPoint = stroke.StylusPoints[midIndex].ToPoint();
- double midDeviation = DistanceFromLineToPoint(start, end, midPoint);
+ // 如果灵敏度高于1.0,使用更宽松的判断标准
+ if (sensitivity > 1.0) {
+ // 高灵敏度模式 - 允许更大的偏差
+ double adjustedSensitivity = 0.5 + (sensitivity - 1.0) * 1.5; // 映射到0.5-2.0范围
- // 如果中点偏离过大,不拉直
- if (midDeviation > (lineLength * sensitivity * 0.8)) {
+ // 只判断平均偏差和相对偏差
+ if (maxDeviation / lineLength < adjustedSensitivity && avgDeviation < lineLength * 0.1 * adjustedSensitivity) {
+ System.Diagnostics.Debug.WriteLine("接受拉直 (高灵敏度模式)");
+ return true;
+ }
+
+ System.Diagnostics.Debug.WriteLine("拒绝拉直 (高灵敏度模式)");
+ return false;
+ }
+ // 否则使用常规判断标准
+ else {
+ // 检查点分布的一致性 - 如果有些点偏离很大而其他点很接近直线,表明线条有明显弯曲
+ double deviationVariance = 0;
+ foreach (StylusPoint sp in stroke.StylusPoints) {
+ Point p = sp.ToPoint();
+ double deviation = DistanceFromLineToPoint(start, end, p);
+ deviationVariance += Math.Pow(deviation - avgDeviation, 2);
+ }
+ deviationVariance /= pointCount;
+
+ // 输出更多调试信息
+ System.Diagnostics.Debug.WriteLine($"Deviation variance: {deviationVariance}, Threshold: {sensitivity * lineLength * 0.05}");
+
+ // 如果最大偏差超过线长的阈值比例,或者偏差方差较大(表示不均匀弯曲),则不拉直
+ // 灵敏度越大,容许的偏差越大,更容易将线条识别为直线
+ if ((maxDeviation / lineLength) > sensitivity) {
+ System.Diagnostics.Debug.WriteLine("拒绝拉直:最大偏差过大");
return false;
}
+
+ // 如果偏差方差大,说明线条弯曲不均匀
+ // 灵敏度越大,容许的偏差方差越大
+ if (deviationVariance > (sensitivity * lineLength * 0.05)) {
+ System.Diagnostics.Debug.WriteLine("拒绝拉直:偏差方差过大");
+ return false;
+ }
+
+ // 检查中点偏离情况 - 针对弧形线条特别有效
+ if (stroke.StylusPoints.Count > 10) {
+ int midIndex = stroke.StylusPoints.Count / 2;
+ Point midPoint = stroke.StylusPoints[midIndex].ToPoint();
+ double midDeviation = DistanceFromLineToPoint(start, end, midPoint);
+
+ // 输出中点偏差信息
+ System.Diagnostics.Debug.WriteLine($"Mid deviation: {midDeviation}, Threshold: {lineLength * sensitivity * 0.8}");
+
+ // 如果中点偏离过大,不拉直
+ // 使用灵敏度作为判断基准,灵敏度越大,容许的中点偏离越大
+ if (midDeviation > (lineLength * sensitivity * 0.8)) {
+ System.Diagnostics.Debug.WriteLine("拒绝拉直:中点偏差过大");
+ return false;
+ }
+ }
+
+ System.Diagnostics.Debug.WriteLine("接受拉直");
+ return true;
}
-
- return true;
}
// New method: Creates a straight line stroke between two points
diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs
index ea8b4c73..a6bb0a79 100644
--- a/Ink Canvas/Resources/Settings.cs
+++ b/Ink Canvas/Resources/Settings.cs
@@ -410,7 +410,7 @@ namespace Ink_Canvas
[JsonProperty("isInkToShapeRounded")]
public bool IsInkToShapeRounded { get; set; } = true;
[JsonProperty("lineStraightenSensitivity")]
- public double LineStraightenSensitivity { get; set; } = 0.10; // 直线检测灵敏度,值越小越严格(0.05-0.75)
+ public double LineStraightenSensitivity { get; set; } = 0.20; // 直线检测灵敏度,值越小越严格(0.05-2.0)
}
public class RandSettings {
diff --git a/Ink Canvas/obj/Debug/net472/InkCanvasForClass.g.resources b/Ink Canvas/obj/Debug/net472/InkCanvasForClass.g.resources
index 53276884..51b12520 100644
Binary files a/Ink Canvas/obj/Debug/net472/InkCanvasForClass.g.resources and b/Ink Canvas/obj/Debug/net472/InkCanvasForClass.g.resources differ
diff --git a/Ink Canvas/obj/Debug/net472/MainWindow.g.cs b/Ink Canvas/obj/Debug/net472/MainWindow.g.cs
index 3208f30f..aa9d4307 100644
--- a/Ink Canvas/obj/Debug/net472/MainWindow.g.cs
+++ b/Ink Canvas/obj/Debug/net472/MainWindow.g.cs
@@ -1,4 +1,4 @@
-#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "C618DEE2BF2FDFC3FC9E2911171FB8CC42684DCF"
+#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "6FAFC4740CB9AF5163B29698B35D6A5538C791B5"
//------------------------------------------------------------------------------
//
// 此代码由工具生成。
diff --git a/Ink Canvas/obj/Debug/net472/MainWindow.g.i.cs b/Ink Canvas/obj/Debug/net472/MainWindow.g.i.cs
index 3208f30f..aa9d4307 100644
--- a/Ink Canvas/obj/Debug/net472/MainWindow.g.i.cs
+++ b/Ink Canvas/obj/Debug/net472/MainWindow.g.i.cs
@@ -1,4 +1,4 @@
-#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "C618DEE2BF2FDFC3FC9E2911171FB8CC42684DCF"
+#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "6FAFC4740CB9AF5163B29698B35D6A5538C791B5"
//------------------------------------------------------------------------------
//
// 此代码由工具生成。