Merge branch 'master' of https://github.com/WXRIW/Ink-Canvas into feat/TimeMachine
# Conflicts: # Ink Canvas/MainWindow.xaml.cs
This commit is contained in:
commit
99fd5497f6
26
.github/workflows/main.yml
vendored
26
.github/workflows/main.yml
vendored
@ -44,6 +44,20 @@ jobs:
|
|||||||
msbuild /p:Configuration=Release /p:Platform="Any CPU" /p:GitFlow="Github Action"
|
msbuild /p:Configuration=Release /p:Platform="Any CPU" /p:GitFlow="Github Action"
|
||||||
env:
|
env:
|
||||||
Configuration: ${{ matrix.configuration }}
|
Configuration: ${{ matrix.configuration }}
|
||||||
|
|
||||||
|
- name: Build the solution (x64)
|
||||||
|
run: |
|
||||||
|
msbuild -t:restore /p:GitFlow="Github Action"
|
||||||
|
msbuild /p:Configuration=Release /p:Platform="x64" /p:GitFlow="Github Action"
|
||||||
|
env:
|
||||||
|
Configuration: ${{ matrix.configuration }}
|
||||||
|
|
||||||
|
- name: Build the solution (ARM64)
|
||||||
|
run: |
|
||||||
|
msbuild -t:restore /p:GitFlow="Github Action"
|
||||||
|
msbuild /p:Configuration=Release /p:Platform="ARM64" /p:GitFlow="Github Action"
|
||||||
|
env:
|
||||||
|
Configuration: ${{ matrix.configuration }}
|
||||||
|
|
||||||
# 上传编译成品
|
# 上传编译成品
|
||||||
- name: Upload to artifact
|
- name: Upload to artifact
|
||||||
@ -51,3 +65,15 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: Ink-Canvas
|
name: Ink-Canvas
|
||||||
path: Ink Canvas/bin/Release
|
path: Ink Canvas/bin/Release
|
||||||
|
|
||||||
|
- name: Upload to artifact (x64)
|
||||||
|
uses: actions/upload-artifact@main
|
||||||
|
with:
|
||||||
|
name: Ink-Canvas-x64
|
||||||
|
path: Ink Canvas/bin/x64/Release
|
||||||
|
|
||||||
|
- name: Upload to artifact (ARM64)
|
||||||
|
uses: actions/upload-artifact@main
|
||||||
|
with:
|
||||||
|
name: Ink-Canvas-ARM64
|
||||||
|
path: Ink Canvas/bin/ARM64/Release
|
||||||
|
@ -1,20 +1,32 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 16
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 16.0.29806.167
|
VisualStudioVersion = 17.5.33530.505
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ink Canvas", "Ink Canvas\Ink Canvas.csproj", "{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ink Canvas", "Ink Canvas\Ink Canvas.csproj", "{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Debug|ARM64 = Debug|ARM64
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
Release|Any CPU = Release|Any CPU
|
Release|Any CPU = Release|Any CPU
|
||||||
|
Release|ARM64 = Release|ARM64
|
||||||
|
Release|x64 = Release|x64
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Debug|x64.Build.0 = Debug|x64
|
||||||
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Release|Any CPU.Build.0 = Release|Any CPU
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{8D0EDFC7-F974-4571-BC49-6F3A6653FE81}.Release|x64.Build.0 = Release|x64
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
@ -79,6 +79,46 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ApplicationManifest>app.manifest</ApplicationManifest>
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM64'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\ARM64\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>ARM64</PlatformTarget>
|
||||||
|
<LangVersion>7.3</LangVersion>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM64'">
|
||||||
|
<OutputPath>bin\ARM64\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>ARM64</PlatformTarget>
|
||||||
|
<LangVersion>7.3</LangVersion>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<LangVersion>7.3</LangVersion>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||||
|
<OutputPath>bin\x64\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<LangVersion>7.3</LangVersion>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="IACore">
|
<Reference Include="IACore">
|
||||||
<HintPath>.\IACore.dll</HintPath>
|
<HintPath>.\IACore.dll</HintPath>
|
||||||
@ -91,10 +131,6 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.VisualBasic" />
|
<Reference Include="Microsoft.VisualBasic" />
|
||||||
<Reference Include="netstandard" />
|
<Reference Include="netstandard" />
|
||||||
<Reference Include="OAUS.Core, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
|
||||||
<SpecificVersion>False</SpecificVersion>
|
|
||||||
<HintPath>AutoUpdater\OAUS.Core.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
<Reference Include="System.Drawing" />
|
<Reference Include="System.Drawing" />
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
Closing="Window_Closing"
|
Closing="Window_Closing"
|
||||||
Closed="Window_Closed"
|
Closed="Window_Closed"
|
||||||
PreviewKeyDown="Main_Grid_PreviewKeyDown"
|
PreviewKeyDown="Main_Grid_PreviewKeyDown"
|
||||||
Height="1000" Width="1000"
|
Height="10000" Width="1000"
|
||||||
FontFamily="Microsoft YaHei UI"
|
FontFamily="Microsoft YaHei UI"
|
||||||
MouseWheel="Window_MouseWheel"
|
MouseWheel="Window_MouseWheel"
|
||||||
Foreground="Black"
|
Foreground="Black"
|
||||||
@ -433,7 +433,7 @@
|
|||||||
<ui:ToggleSwitch Name="ToggleSwitchEnableTwoFingerRotationOnSelection" Header="允许双指旋转选中的墨迹" FontFamily="Microsoft YaHei UI" OnContent="开" OffContent="关" Toggled="ToggleSwitchEnableTwoFingerRotation_Toggled"/>
|
<ui:ToggleSwitch Name="ToggleSwitchEnableTwoFingerRotationOnSelection" Header="允许双指旋转选中的墨迹" FontFamily="Microsoft YaHei UI" OnContent="开" OffContent="关" Toggled="ToggleSwitchEnableTwoFingerRotation_Toggled"/>
|
||||||
</ui:SimpleStackPanel>
|
</ui:SimpleStackPanel>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
<GroupBox Header="墨迹识别 (Beta)">
|
<GroupBox Name="GroupBoxInkRecognition" Header="墨迹识别 (Beta)">
|
||||||
<ui:SimpleStackPanel Spacing="12">
|
<ui:SimpleStackPanel Spacing="12">
|
||||||
<TextBlock Text="墨迹识别功能目前处于开发阶段,目前可实现智能识别圆、三角形、
矩形,并自动转换为规范图形。" Foreground="#666666"/>
|
<TextBlock Text="墨迹识别功能目前处于开发阶段,目前可实现智能识别圆、三角形、
矩形,并自动转换为规范图形。" Foreground="#666666"/>
|
||||||
<ui:ToggleSwitch Name="ToggleSwitchEnableInkToShape" Header="启用墨迹识别" FontFamily="Microsoft YaHei UI" OnContent="开" OffContent="关" Toggled="ToggleSwitchEnableInkToShape_Toggled" IsOn="True"/>
|
<ui:ToggleSwitch Name="ToggleSwitchEnableInkToShape" Header="启用墨迹识别" FontFamily="Microsoft YaHei UI" OnContent="开" OffContent="关" Toggled="ToggleSwitchEnableInkToShape_Toggled" IsOn="True"/>
|
||||||
|
@ -530,6 +530,10 @@ namespace Ink_Canvas
|
|||||||
|
|
||||||
//加载设置
|
//加载设置
|
||||||
LoadSettings();
|
LoadSettings();
|
||||||
|
if (Environment.Is64BitProcess)
|
||||||
|
{
|
||||||
|
GroupBoxInkRecognition.Visibility = Visibility.Collapsed;
|
||||||
|
}
|
||||||
|
|
||||||
ThemeManager.Current.ApplicationTheme = ApplicationTheme.Light;
|
ThemeManager.Current.ApplicationTheme = ApplicationTheme.Light;
|
||||||
|
|
||||||
@ -5606,75 +5610,34 @@ namespace Ink_Canvas
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
inkCanvas.Opacity = 1;
|
inkCanvas.Opacity = 1;
|
||||||
if (Settings.InkToShape.IsInkToShapeEnabled)
|
if (Settings.InkToShape.IsInkToShapeEnabled && !Environment.Is64BitProcess)
|
||||||
{
|
{
|
||||||
try
|
void InkToShapeProcess()
|
||||||
{
|
{
|
||||||
newStrokes.Add(e.Stroke);
|
try
|
||||||
if (newStrokes.Count > 4) newStrokes.RemoveAt(0);
|
|
||||||
for (int i = 0; i < newStrokes.Count; i++)
|
|
||||||
{
|
{
|
||||||
if (!inkCanvas.Strokes.Contains(newStrokes[i])) newStrokes.RemoveAt(i--);
|
newStrokes.Add(e.Stroke);
|
||||||
}
|
if (newStrokes.Count > 4) newStrokes.RemoveAt(0);
|
||||||
for (int i = 0; i < circles.Count; i++)
|
for (int i = 0; i < newStrokes.Count; i++)
|
||||||
{
|
|
||||||
if (!inkCanvas.Strokes.Contains(circles[i].Stroke)) circles.RemoveAt(i);
|
|
||||||
}
|
|
||||||
var strokeReco = new StrokeCollection();
|
|
||||||
var result = InkRecognizeHelper.RecognizeShape(newStrokes);
|
|
||||||
for (int i = newStrokes.Count - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
strokeReco.Add(newStrokes[i]);
|
|
||||||
var newResult = InkRecognizeHelper.RecognizeShape(strokeReco);
|
|
||||||
if (newResult.InkDrawingNode.GetShapeName() == "Circle" || newResult.InkDrawingNode.GetShapeName() == "Ellipse")
|
|
||||||
{
|
{
|
||||||
result = newResult;
|
if (!inkCanvas.Strokes.Contains(newStrokes[i])) newStrokes.RemoveAt(i--);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
//Label.Visibility = Visibility.Visible;
|
for (int i = 0; i < circles.Count; i++)
|
||||||
Label.Content = circles.Count.ToString() + "\n" + newResult.InkDrawingNode.GetShapeName();
|
|
||||||
}
|
|
||||||
if (result.InkDrawingNode.GetShapeName() == "Circle")
|
|
||||||
{
|
|
||||||
var shape = result.InkDrawingNode.GetShape();
|
|
||||||
if (shape.Width > 75)
|
|
||||||
{
|
{
|
||||||
foreach (Circle circle in circles)
|
if (!inkCanvas.Strokes.Contains(circles[i].Stroke)) circles.RemoveAt(i);
|
||||||
|
}
|
||||||
|
var strokeReco = new StrokeCollection();
|
||||||
|
var result = InkRecognizeHelper.RecognizeShape(newStrokes);
|
||||||
|
for (int i = newStrokes.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
strokeReco.Add(newStrokes[i]);
|
||||||
|
var newResult = InkRecognizeHelper.RecognizeShape(strokeReco);
|
||||||
|
if (newResult.InkDrawingNode.GetShapeName() == "Circle" || newResult.InkDrawingNode.GetShapeName() == "Ellipse")
|
||||||
{
|
{
|
||||||
//判断是否画同心圆
|
result = newResult;
|
||||||
if (Math.Abs(result.Centroid.X - circle.Centroid.X) / shape.Width < 0.12 &&
|
break;
|
||||||
Math.Abs(result.Centroid.Y - circle.Centroid.Y) / shape.Width < 0.12)
|
|
||||||
{
|
|
||||||
result.Centroid = circle.Centroid;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
double d = (result.Centroid.X - circle.Centroid.X) * (result.Centroid.X - circle.Centroid.X) +
|
|
||||||
(result.Centroid.Y - circle.Centroid.Y) * (result.Centroid.Y - circle.Centroid.Y);
|
|
||||||
d = Math.Sqrt(d);
|
|
||||||
//判断是否画外切圆
|
|
||||||
double x = shape.Width / 2.0 + circle.R - d;
|
|
||||||
if (Math.Abs(x) / shape.Width < 0.1)
|
|
||||||
{
|
|
||||||
double sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d;
|
|
||||||
double cosTheta = (result.Centroid.X - circle.Centroid.X) / d;
|
|
||||||
double newX = result.Centroid.X + x * cosTheta;
|
|
||||||
double newY = result.Centroid.Y + x * sinTheta;
|
|
||||||
result.Centroid = new Point(newX, newY);
|
|
||||||
}
|
|
||||||
//判断是否画外切圆
|
|
||||||
x = Math.Abs(circle.R - shape.Width / 2.0) - d;
|
|
||||||
if (Math.Abs(x) / shape.Width < 0.1)
|
|
||||||
{
|
|
||||||
double sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d;
|
|
||||||
double cosTheta = (result.Centroid.X - circle.Centroid.X) / d;
|
|
||||||
double newX = result.Centroid.X + x * cosTheta;
|
|
||||||
double newY = result.Centroid.Y + x * sinTheta;
|
|
||||||
result.Centroid = new Point(newX, newY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
<<<<<<< HEAD
|
||||||
|
|
||||||
Point iniP = new Point(result.Centroid.X - shape.Width / 2, result.Centroid.Y - shape.Height / 2);
|
Point iniP = new Point(result.Centroid.X - shape.Width / 2, result.Centroid.Y - shape.Height / 2);
|
||||||
Point endP = new Point(result.Centroid.X + shape.Width / 2, result.Centroid.Y + shape.Height / 2);
|
Point endP = new Point(result.Centroid.X + shape.Width / 2, result.Centroid.Y + shape.Height / 2);
|
||||||
@ -5690,74 +5653,103 @@ namespace Ink_Canvas
|
|||||||
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
|
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
|
||||||
inkCanvas.Strokes.Add(stroke);
|
inkCanvas.Strokes.Add(stroke);
|
||||||
newStrokes = new StrokeCollection();
|
newStrokes = new StrokeCollection();
|
||||||
|
=======
|
||||||
|
//Label.Visibility = Visibility.Visible;
|
||||||
|
Label.Content = circles.Count.ToString() + "\n" + newResult.InkDrawingNode.GetShapeName();
|
||||||
|
>>>>>>> ab83992ef82c63ba7a9d4ef428f11edc45718bb3
|
||||||
}
|
}
|
||||||
}
|
if (result.InkDrawingNode.GetShapeName() == "Circle")
|
||||||
else if (result.InkDrawingNode.GetShapeName().Contains("Ellipse"))
|
|
||||||
{
|
|
||||||
var shape = result.InkDrawingNode.GetShape();
|
|
||||||
//var shape1 = result.InkDrawingNode.GetShape();
|
|
||||||
//shape1.Fill = Brushes.Gray;
|
|
||||||
//Canvas.Children.Add(shape1);
|
|
||||||
var p = result.InkDrawingNode.HotPoints;
|
|
||||||
double a = GetDistance(p[0], p[2]) / 2; //长半轴
|
|
||||||
double b = GetDistance(p[1], p[3]) / 2; //短半轴
|
|
||||||
if (a < b)
|
|
||||||
{
|
{
|
||||||
double t = a;
|
var shape = result.InkDrawingNode.GetShape();
|
||||||
a = b;
|
if (shape.Width > 75)
|
||||||
b = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
result.Centroid = new Point((p[0].X + p[2].X) / 2, (p[0].Y + p[2].Y) / 2);
|
|
||||||
bool needRotation = true;
|
|
||||||
|
|
||||||
if (shape.Width > 75 || shape.Height > 75 && p.Count == 4)
|
|
||||||
{
|
|
||||||
Point iniP = new Point(result.Centroid.X - shape.Width / 2, result.Centroid.Y - shape.Height / 2);
|
|
||||||
Point endP = new Point(result.Centroid.X + shape.Width / 2, result.Centroid.Y + shape.Height / 2);
|
|
||||||
|
|
||||||
foreach (Circle circle in circles)
|
|
||||||
{
|
{
|
||||||
//判断是否画同心椭圆
|
foreach (Circle circle in circles)
|
||||||
if (Math.Abs(result.Centroid.X - circle.Centroid.X) / a < 0.2 &&
|
|
||||||
Math.Abs(result.Centroid.Y - circle.Centroid.Y) / a < 0.2)
|
|
||||||
{
|
{
|
||||||
result.Centroid = circle.Centroid;
|
//判断是否画同心圆
|
||||||
iniP = new Point(result.Centroid.X - shape.Width / 2, result.Centroid.Y - shape.Height / 2);
|
if (Math.Abs(result.Centroid.X - circle.Centroid.X) / shape.Width < 0.12 &&
|
||||||
endP = new Point(result.Centroid.X + shape.Width / 2, result.Centroid.Y + shape.Height / 2);
|
Math.Abs(result.Centroid.Y - circle.Centroid.Y) / shape.Width < 0.12)
|
||||||
|
|
||||||
//再判断是否与圆相切
|
|
||||||
if (Math.Abs(a - circle.R) / a < 0.2)
|
|
||||||
{
|
{
|
||||||
if (shape.Width >= shape.Height)
|
result.Centroid = circle.Centroid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double d = (result.Centroid.X - circle.Centroid.X) * (result.Centroid.X - circle.Centroid.X) +
|
||||||
|
(result.Centroid.Y - circle.Centroid.Y) * (result.Centroid.Y - circle.Centroid.Y);
|
||||||
|
d = Math.Sqrt(d);
|
||||||
|
//判断是否画外切圆
|
||||||
|
double x = shape.Width / 2.0 + circle.R - d;
|
||||||
|
if (Math.Abs(x) / shape.Width < 0.1)
|
||||||
{
|
{
|
||||||
iniP.X = result.Centroid.X - circle.R;
|
double sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d;
|
||||||
endP.X = result.Centroid.X + circle.R;
|
double cosTheta = (result.Centroid.X - circle.Centroid.X) / d;
|
||||||
iniP.Y = result.Centroid.Y - b;
|
double newX = result.Centroid.X + x * cosTheta;
|
||||||
endP.Y = result.Centroid.Y + b;
|
double newY = result.Centroid.Y + x * sinTheta;
|
||||||
|
result.Centroid = new Point(newX, newY);
|
||||||
}
|
}
|
||||||
else
|
//判断是否画外切圆
|
||||||
|
x = Math.Abs(circle.R - shape.Width / 2.0) - d;
|
||||||
|
if (Math.Abs(x) / shape.Width < 0.1)
|
||||||
{
|
{
|
||||||
iniP.Y = result.Centroid.Y - circle.R;
|
double sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d;
|
||||||
endP.Y = result.Centroid.Y + circle.R;
|
double cosTheta = (result.Centroid.X - circle.Centroid.X) / d;
|
||||||
iniP.X = result.Centroid.X - a;
|
double newX = result.Centroid.X + x * cosTheta;
|
||||||
endP.X = result.Centroid.X + a;
|
double newY = result.Centroid.Y + x * sinTheta;
|
||||||
|
result.Centroid = new Point(newX, newY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
else if (Math.Abs(result.Centroid.X - circle.Centroid.X) / a < 0.2)
|
|
||||||
{
|
|
||||||
double sinTheta = Math.Abs(circle.Centroid.Y - result.Centroid.Y) / circle.R;
|
|
||||||
double cosTheta = Math.Sqrt(1 - sinTheta * sinTheta);
|
|
||||||
double newA = circle.R * cosTheta;
|
|
||||||
if (circle.R * sinTheta / circle.R < 0.9 && a / b > 2 && Math.Abs(newA - a) / newA < 0.3)
|
|
||||||
{
|
|
||||||
iniP.X = circle.Centroid.X - newA;
|
|
||||||
endP.X = circle.Centroid.X + newA;
|
|
||||||
iniP.Y = result.Centroid.Y - newA / 5;
|
|
||||||
endP.Y = result.Centroid.Y + newA / 5;
|
|
||||||
|
|
||||||
|
Point iniP = new Point(result.Centroid.X - shape.Width / 2, result.Centroid.Y - shape.Height / 2);
|
||||||
|
Point endP = new Point(result.Centroid.X + shape.Width / 2, result.Centroid.Y + shape.Height / 2);
|
||||||
|
var pointList = GenerateEllipseGeometry(iniP, endP);
|
||||||
|
var point = new StylusPointCollection(pointList);
|
||||||
|
var stroke = new Stroke(point)
|
||||||
|
{
|
||||||
|
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
|
||||||
|
};
|
||||||
|
circles.Add(new Circle(result.Centroid, shape.Width / 2.0, stroke));
|
||||||
|
SetNewBackupOfStroke();
|
||||||
|
inkCanvas.Strokes.Add(stroke);
|
||||||
|
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
|
||||||
|
newStrokes = new StrokeCollection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (result.InkDrawingNode.GetShapeName().Contains("Ellipse"))
|
||||||
|
{
|
||||||
|
var shape = result.InkDrawingNode.GetShape();
|
||||||
|
//var shape1 = result.InkDrawingNode.GetShape();
|
||||||
|
//shape1.Fill = Brushes.Gray;
|
||||||
|
//Canvas.Children.Add(shape1);
|
||||||
|
var p = result.InkDrawingNode.HotPoints;
|
||||||
|
double a = GetDistance(p[0], p[2]) / 2; //长半轴
|
||||||
|
double b = GetDistance(p[1], p[3]) / 2; //短半轴
|
||||||
|
if (a < b)
|
||||||
|
{
|
||||||
|
double t = a;
|
||||||
|
a = b;
|
||||||
|
b = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
result.Centroid = new Point((p[0].X + p[2].X) / 2, (p[0].Y + p[2].Y) / 2);
|
||||||
|
bool needRotation = true;
|
||||||
|
|
||||||
|
if (shape.Width > 75 || shape.Height > 75 && p.Count == 4)
|
||||||
|
{
|
||||||
|
Point iniP = new Point(result.Centroid.X - shape.Width / 2, result.Centroid.Y - shape.Height / 2);
|
||||||
|
Point endP = new Point(result.Centroid.X + shape.Width / 2, result.Centroid.Y + shape.Height / 2);
|
||||||
|
|
||||||
|
foreach (Circle circle in circles)
|
||||||
|
{
|
||||||
|
//判断是否画同心椭圆
|
||||||
|
if (Math.Abs(result.Centroid.X - circle.Centroid.X) / a < 0.2 &&
|
||||||
|
Math.Abs(result.Centroid.Y - circle.Centroid.Y) / a < 0.2)
|
||||||
|
{
|
||||||
|
result.Centroid = circle.Centroid;
|
||||||
|
iniP = new Point(result.Centroid.X - shape.Width / 2, result.Centroid.Y - shape.Height / 2);
|
||||||
|
endP = new Point(result.Centroid.X + shape.Width / 2, result.Centroid.Y + shape.Height / 2);
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
double topB = endP.Y - iniP.Y;
|
double topB = endP.Y - iniP.Y;
|
||||||
|
|
||||||
SetNewBackupOfStroke();
|
SetNewBackupOfStroke();
|
||||||
@ -5782,79 +5774,155 @@ namespace Ink_Canvas
|
|||||||
inkCanvas.Strokes.Add(_stroke.Clone());
|
inkCanvas.Strokes.Add(_stroke.Clone());
|
||||||
inkCanvas.Strokes.Add(_generateDashedLineEllipseStrokeCollection);
|
inkCanvas.Strokes.Add(_generateDashedLineEllipseStrokeCollection);
|
||||||
return;
|
return;
|
||||||
|
=======
|
||||||
|
//再判断是否与圆相切
|
||||||
|
if (Math.Abs(a - circle.R) / a < 0.2)
|
||||||
|
{
|
||||||
|
if (shape.Width >= shape.Height)
|
||||||
|
{
|
||||||
|
iniP.X = result.Centroid.X - circle.R;
|
||||||
|
endP.X = result.Centroid.X + circle.R;
|
||||||
|
iniP.Y = result.Centroid.Y - b;
|
||||||
|
endP.Y = result.Centroid.Y + b;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
iniP.Y = result.Centroid.Y - circle.R;
|
||||||
|
endP.Y = result.Centroid.Y + circle.R;
|
||||||
|
iniP.X = result.Centroid.X - a;
|
||||||
|
endP.X = result.Centroid.X + a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
>>>>>>> ab83992ef82c63ba7a9d4ef428f11edc45718bb3
|
||||||
}
|
}
|
||||||
}
|
else if (Math.Abs(result.Centroid.X - circle.Centroid.X) / a < 0.2)
|
||||||
else if (Math.Abs(result.Centroid.Y - circle.Centroid.Y) / a < 0.2)
|
|
||||||
{
|
|
||||||
double cosTheta = Math.Abs(circle.Centroid.X - result.Centroid.X) / circle.R;
|
|
||||||
double sinTheta = Math.Sqrt(1 - cosTheta * cosTheta);
|
|
||||||
double newA = circle.R * sinTheta;
|
|
||||||
if (circle.R * sinTheta / circle.R < 0.9 && a / b > 2 && Math.Abs(newA - a) / newA < 0.3)
|
|
||||||
{
|
{
|
||||||
iniP.X = result.Centroid.X - newA / 5;
|
double sinTheta = Math.Abs(circle.Centroid.Y - result.Centroid.Y) / circle.R;
|
||||||
endP.X = result.Centroid.X + newA / 5;
|
double cosTheta = Math.Sqrt(1 - sinTheta * sinTheta);
|
||||||
iniP.Y = circle.Centroid.Y - newA;
|
double newA = circle.R * cosTheta;
|
||||||
endP.Y = circle.Centroid.Y + newA;
|
if (circle.R * sinTheta / circle.R < 0.9 && a / b > 2 && Math.Abs(newA - a) / newA < 0.3)
|
||||||
needRotation = false;
|
{
|
||||||
|
iniP.X = circle.Centroid.X - newA;
|
||||||
|
endP.X = circle.Centroid.X + newA;
|
||||||
|
iniP.Y = result.Centroid.Y - newA / 5;
|
||||||
|
endP.Y = result.Centroid.Y + newA / 5;
|
||||||
|
|
||||||
|
double topB = endP.Y - iniP.Y;
|
||||||
|
|
||||||
|
SetNewBackupOfStroke();
|
||||||
|
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
|
||||||
|
newStrokes = new StrokeCollection();
|
||||||
|
|
||||||
|
var _pointList = GenerateEllipseGeometry(iniP, endP, false, true);
|
||||||
|
var _point = new StylusPointCollection(_pointList);
|
||||||
|
var _stroke = new Stroke(_point)
|
||||||
|
{
|
||||||
|
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
|
||||||
|
};
|
||||||
|
inkCanvas.Strokes.Add(_stroke.Clone());
|
||||||
|
inkCanvas.Strokes.Add(GenerateDashedLineEllipseStrokeCollection(iniP, endP, true, false));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Math.Abs(result.Centroid.Y - circle.Centroid.Y) / a < 0.2)
|
||||||
|
{
|
||||||
|
double cosTheta = Math.Abs(circle.Centroid.X - result.Centroid.X) / circle.R;
|
||||||
|
double sinTheta = Math.Sqrt(1 - cosTheta * cosTheta);
|
||||||
|
double newA = circle.R * sinTheta;
|
||||||
|
if (circle.R * sinTheta / circle.R < 0.9 && a / b > 2 && Math.Abs(newA - a) / newA < 0.3)
|
||||||
|
{
|
||||||
|
iniP.X = result.Centroid.X - newA / 5;
|
||||||
|
endP.X = result.Centroid.X + newA / 5;
|
||||||
|
iniP.Y = circle.Centroid.Y - newA;
|
||||||
|
endP.Y = circle.Centroid.Y + newA;
|
||||||
|
needRotation = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//纠正垂直与水平关系
|
||||||
|
var newPoints = FixPointsDirection(p[0], p[2]);
|
||||||
|
p[0] = newPoints[0];
|
||||||
|
p[2] = newPoints[1];
|
||||||
|
newPoints = FixPointsDirection(p[1], p[3]);
|
||||||
|
p[1] = newPoints[0];
|
||||||
|
p[3] = newPoints[1];
|
||||||
|
|
||||||
|
var pointList = GenerateEllipseGeometry(iniP, endP);
|
||||||
|
var point = new StylusPointCollection(pointList);
|
||||||
|
var stroke = new Stroke(point)
|
||||||
|
{
|
||||||
|
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
|
||||||
|
};
|
||||||
|
|
||||||
|
if (needRotation)
|
||||||
|
{
|
||||||
|
Matrix m = new Matrix();
|
||||||
|
FrameworkElement fe = e.Source as FrameworkElement;
|
||||||
|
double tanTheta = (p[2].Y - p[0].Y) / (p[2].X - p[0].X);
|
||||||
|
double theta = Math.Atan(tanTheta);
|
||||||
|
m.RotateAt(theta * 180.0 / Math.PI, result.Centroid.X, result.Centroid.Y);
|
||||||
|
stroke.Transform(m, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetNewBackupOfStroke();
|
||||||
|
inkCanvas.Strokes.Add(stroke);
|
||||||
|
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
|
||||||
|
newStrokes = new StrokeCollection();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//纠正垂直与水平关系
|
else if (result.InkDrawingNode.GetShapeName().Contains("Triangle"))
|
||||||
var newPoints = FixPointsDirection(p[0], p[2]);
|
{
|
||||||
p[0] = newPoints[0];
|
var shape = result.InkDrawingNode.GetShape();
|
||||||
p[2] = newPoints[1];
|
var p = result.InkDrawingNode.HotPoints;
|
||||||
newPoints = FixPointsDirection(p[1], p[3]);
|
if ((Math.Max(Math.Max(p[0].X, p[1].X), p[2].X) - Math.Min(Math.Min(p[0].X, p[1].X), p[2].X) >= 100 ||
|
||||||
p[1] = newPoints[0];
|
Math.Max(Math.Max(p[0].Y, p[1].Y), p[2].Y) - Math.Min(Math.Min(p[0].Y, p[1].Y), p[2].Y) >= 100) && result.InkDrawingNode.HotPoints.Count == 3)
|
||||||
p[3] = newPoints[1];
|
|
||||||
|
|
||||||
var pointList = GenerateEllipseGeometry(iniP, endP);
|
|
||||||
var point = new StylusPointCollection(pointList);
|
|
||||||
var stroke = new Stroke(point)
|
|
||||||
{
|
{
|
||||||
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
|
//纠正垂直与水平关系
|
||||||
};
|
var newPoints = FixPointsDirection(p[0], p[1]);
|
||||||
|
p[0] = newPoints[0];
|
||||||
|
p[1] = newPoints[1];
|
||||||
|
newPoints = FixPointsDirection(p[0], p[2]);
|
||||||
|
p[0] = newPoints[0];
|
||||||
|
p[2] = newPoints[1];
|
||||||
|
newPoints = FixPointsDirection(p[1], p[2]);
|
||||||
|
p[1] = newPoints[0];
|
||||||
|
p[2] = newPoints[1];
|
||||||
|
|
||||||
if (needRotation)
|
var pointList = p.ToList();
|
||||||
{
|
//pointList.Add(p[0]);
|
||||||
Matrix m = new Matrix();
|
var point = new StylusPointCollection(pointList);
|
||||||
FrameworkElement fe = e.Source as FrameworkElement;
|
var stroke = new Stroke(GenerateFakePressureTriangle(point))
|
||||||
double tanTheta = (p[2].Y - p[0].Y) / (p[2].X - p[0].X);
|
{
|
||||||
double theta = Math.Atan(tanTheta);
|
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
|
||||||
m.RotateAt(theta * 180.0 / Math.PI, result.Centroid.X, result.Centroid.Y);
|
};
|
||||||
stroke.Transform(m, false);
|
SetNewBackupOfStroke();
|
||||||
|
inkCanvas.Strokes.Add(stroke);
|
||||||
|
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
|
||||||
|
newStrokes = new StrokeCollection();
|
||||||
}
|
}
|
||||||
|
<<<<<<< HEAD
|
||||||
|
|
||||||
SetNewBackupOfStroke();
|
SetNewBackupOfStroke();
|
||||||
IsEraseByShapeRecognition = true;
|
IsEraseByShapeRecognition = true;
|
||||||
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
|
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
|
||||||
inkCanvas.Strokes.Add(stroke);
|
inkCanvas.Strokes.Add(stroke);
|
||||||
newStrokes = new StrokeCollection();
|
newStrokes = new StrokeCollection();
|
||||||
|
=======
|
||||||
|
>>>>>>> ab83992ef82c63ba7a9d4ef428f11edc45718bb3
|
||||||
}
|
}
|
||||||
}
|
else if (result.InkDrawingNode.GetShapeName().Contains("Rectangle") ||
|
||||||
else if (result.InkDrawingNode.GetShapeName().Contains("Triangle"))
|
result.InkDrawingNode.GetShapeName().Contains("Diamond") ||
|
||||||
{
|
result.InkDrawingNode.GetShapeName().Contains("Parallelogram") ||
|
||||||
var shape = result.InkDrawingNode.GetShape();
|
result.InkDrawingNode.GetShapeName().Contains("Square"))
|
||||||
var p = result.InkDrawingNode.HotPoints;
|
|
||||||
if ((Math.Max(Math.Max(p[0].X, p[1].X), p[2].X) - Math.Min(Math.Min(p[0].X, p[1].X), p[2].X) >= 100 ||
|
|
||||||
Math.Max(Math.Max(p[0].Y, p[1].Y), p[2].Y) - Math.Min(Math.Min(p[0].Y, p[1].Y), p[2].Y) >= 100) && result.InkDrawingNode.HotPoints.Count == 3)
|
|
||||||
{
|
{
|
||||||
//纠正垂直与水平关系
|
var shape = result.InkDrawingNode.GetShape();
|
||||||
var newPoints = FixPointsDirection(p[0], p[1]);
|
var p = result.InkDrawingNode.HotPoints;
|
||||||
p[0] = newPoints[0];
|
if ((Math.Max(Math.Max(Math.Max(p[0].X, p[1].X), p[2].X), p[3].X) - Math.Min(Math.Min(Math.Min(p[0].X, p[1].X), p[2].X), p[3].X) >= 100 ||
|
||||||
p[1] = newPoints[1];
|
Math.Max(Math.Max(Math.Max(p[0].Y, p[1].Y), p[2].Y), p[3].Y) - Math.Min(Math.Min(Math.Min(p[0].Y, p[1].Y), p[2].Y), p[3].Y) >= 100) && result.InkDrawingNode.HotPoints.Count == 4)
|
||||||
newPoints = FixPointsDirection(p[0], p[2]);
|
|
||||||
p[0] = newPoints[0];
|
|
||||||
p[2] = newPoints[1];
|
|
||||||
newPoints = FixPointsDirection(p[1], p[2]);
|
|
||||||
p[1] = newPoints[0];
|
|
||||||
p[2] = newPoints[1];
|
|
||||||
|
|
||||||
var pointList = p.ToList();
|
|
||||||
//pointList.Add(p[0]);
|
|
||||||
var point = new StylusPointCollection(pointList);
|
|
||||||
var stroke = new Stroke(GenerateFakePressureTriangle(point))
|
|
||||||
{
|
{
|
||||||
|
<<<<<<< HEAD
|
||||||
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
|
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
|
||||||
};
|
};
|
||||||
SetNewBackupOfStroke();
|
SetNewBackupOfStroke();
|
||||||
@ -5900,14 +5968,47 @@ namespace Ink_Canvas
|
|||||||
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
|
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
|
||||||
inkCanvas.Strokes.Add(stroke);
|
inkCanvas.Strokes.Add(stroke);
|
||||||
newStrokes = new StrokeCollection();
|
newStrokes = new StrokeCollection();
|
||||||
|
=======
|
||||||
|
//纠正垂直与水平关系
|
||||||
|
var newPoints = FixPointsDirection(p[0], p[1]);
|
||||||
|
p[0] = newPoints[0];
|
||||||
|
p[1] = newPoints[1];
|
||||||
|
newPoints = FixPointsDirection(p[1], p[2]);
|
||||||
|
p[1] = newPoints[0];
|
||||||
|
p[2] = newPoints[1];
|
||||||
|
newPoints = FixPointsDirection(p[2], p[3]);
|
||||||
|
p[2] = newPoints[0];
|
||||||
|
p[3] = newPoints[1];
|
||||||
|
newPoints = FixPointsDirection(p[3], p[0]);
|
||||||
|
p[3] = newPoints[0];
|
||||||
|
p[0] = newPoints[1];
|
||||||
|
|
||||||
|
var pointList = p.ToList();
|
||||||
|
pointList.Add(p[0]);
|
||||||
|
var point = new StylusPointCollection(pointList);
|
||||||
|
var stroke = new Stroke(GenerateFakePressureRectangle(point))
|
||||||
|
{
|
||||||
|
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
|
||||||
|
};
|
||||||
|
SetNewBackupOfStroke();
|
||||||
|
inkCanvas.Strokes.Add(stroke);
|
||||||
|
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
|
||||||
|
newStrokes = new StrokeCollection();
|
||||||
|
}
|
||||||
|
>>>>>>> ab83992ef82c63ba7a9d4ef428f11edc45718bb3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch { }
|
||||||
}
|
}
|
||||||
|
<<<<<<< HEAD
|
||||||
catch { }
|
catch { }
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
IsEraseByShapeRecognition = false;
|
IsEraseByShapeRecognition = false;
|
||||||
}
|
}
|
||||||
|
=======
|
||||||
|
InkToShapeProcess();
|
||||||
|
>>>>>>> ab83992ef82c63ba7a9d4ef428f11edc45718bb3
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否是压感笔书写
|
// 检查是否是压感笔书写
|
||||||
|
Loading…
Reference in New Issue
Block a user