Bladeren bron

增加圆和球的距离计算公式

懒得勤快 4 jaren geleden
bovenliggende
commit
d1e297ad92

+ 68 - 0
Masuit.Tools.Abstractions/Models/Circle.cs

@@ -0,0 +1,68 @@
+using System;
+using Masuit.Tools.Maths;
+
+namespace Masuit.Tools.Models
+{
+    /// <summary>
+    /// 圆形
+    /// </summary>
+    public class Circle
+    {
+        /// <summary>
+        /// 圆形
+        /// </summary>
+        /// <param name="center">圆心坐标</param>
+        /// <param name="radius">半径</param>
+        public Circle(Point2D center, double radius)
+        {
+            Center = center;
+            Radius = radius;
+            if (radius < 0)
+            {
+                throw new ArgumentException("半径不能为负数", nameof(radius));
+            }
+        }
+
+        /// <summary>
+        /// 圆心坐标
+        /// </summary>
+        public Point2D Center { get; }
+
+        /// <summary>
+        /// 半径
+        /// </summary>
+        public double Radius { get; }
+
+        /// <summary>
+        /// 是否相交
+        /// </summary>
+        /// <param name="that"></param>
+        /// <returns></returns>
+        public bool IsCrossWith(Circle that)
+        {
+            var dis = Math.Sqrt(Math.Pow(that.Center.X - Center.X, 2) + Math.Pow(that.Center.Y - Center.Y, 2));
+            return that.Radius - Radius < dis && dis < that.Radius + Radius;
+        }
+
+        /// <summary>
+        /// 是否相切
+        /// </summary>
+        /// <param name="that"></param>
+        /// <returns></returns>
+        public bool IsIntersectWith(Circle that)
+        {
+            var dis = Math.Sqrt(Math.Pow(that.Center.X - Center.X, 2) + Math.Pow(that.Center.Y - Center.Y, 2));
+            return Math.Abs(that.Radius - Radius - dis) < 1e-7 || Math.Abs(dis - (that.Radius + Radius)) < 1e-7;
+        }
+
+        /// <summary>
+        /// 是否相离
+        /// </summary>
+        /// <param name="that"></param>
+        /// <returns></returns>
+        public bool IsSeparateWith(Circle that)
+        {
+            return !IsCrossWith(that) && !IsIntersectWith(that);
+        }
+    }
+}

+ 85 - 0
Masuit.Tools.Abstractions/Models/Sphere.cs

@@ -0,0 +1,85 @@
+using System;
+
+namespace Masuit.Tools.Models
+{
+    /// <summary>
+    /// 球体
+    /// </summary>
+    public class Sphere
+    {
+        /// <summary>
+        /// 地球
+        /// </summary>
+        public static Sphere Earth => new(6371.393);
+
+        public Sphere(double radius)
+        {
+            Radius = radius;
+        }
+
+        /// <summary>
+        /// 半径
+        /// </summary>
+        public double Radius { get; }
+
+        /// <summary>
+        /// 角度转弧度
+        /// </summary>
+        /// <param name="d">角度</param>
+        /// <returns></returns>
+        private static double Angle2Radian(double d)
+        {
+            return d / 180.0 * Math.PI;
+        }
+
+        /// <summary>
+        /// 计算球体上两点的弧长
+        /// </summary>
+        /// <param name="lat1"></param>
+        /// <param name="lng1"></param>
+        /// <param name="lat2"></param>
+        /// <param name="lng2"></param>
+        /// <returns></returns>
+        public double GetDistance(double lat1, double lng1, double lat2, double lng2)
+        {
+            var rad1 = Angle2Radian(lat1);
+            var rad2 = Angle2Radian(lat2);
+            return 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin((rad1 - rad2) / 2), 2) + Math.Cos(rad1) * Math.Cos(rad2) * Math.Pow(Math.Sin((Angle2Radian(lng1) - Angle2Radian(lng2)) / 2), 2))) * Radius;
+        }
+
+        /// <summary>
+        /// 是否相交
+        /// </summary>
+        /// <param name="circle1"></param>
+        /// <param name="circle2"></param>
+        /// <returns></returns>
+        public bool IsCrossWith(Circle circle1, Circle circle2)
+        {
+            var dis = GetDistance(circle1.Center.X, circle1.Center.Y, circle2.Center.X, circle2.Center.Y);
+            return circle1.Radius - circle2.Radius < dis && dis < circle1.Radius + circle2.Radius;
+        }
+
+        /// <summary>
+        /// 是否相切
+        /// </summary>
+        /// <param name="circle1"></param>
+        /// <param name="circle2"></param>
+        /// <returns></returns>
+        public bool IsIntersectWith(Circle circle1, Circle circle2)
+        {
+            var dis = GetDistance(circle1.Center.X, circle1.Center.Y, circle2.Center.X, circle2.Center.Y);
+            return Math.Abs(circle1.Radius - circle2.Radius - dis) < 1e-7 || Math.Abs(dis - (circle1.Radius + circle2.Radius)) < 1e-7;
+        }
+
+        /// <summary>
+        /// 是否相离
+        /// </summary>
+        /// <param name="circle1"></param>
+        /// <param name="circle2"></param>
+        /// <returns></returns>
+        public bool IsSeparateWith(Circle circle1, Circle circle2)
+        {
+            return !IsCrossWith(circle1, circle2) && !IsIntersectWith(circle1, circle2);
+        }
+    }
+}

+ 2 - 2
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -40,7 +40,7 @@ github:https://github.com/ldqk/Masuit.Tools
         <PackageReference Include="System.Management" Version="4.7.0" />
         <PackageReference Include="System.Management" Version="5.0" />
         <PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.7.0" />
-        <PackageReference Include="SharpCompress" Version="0.29.0" />
+        <PackageReference Include="SharpCompress" Version="0.30.0" />
     </ItemGroup>
 
     <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0'">
@@ -54,7 +54,7 @@ github:https://github.com/ldqk/Masuit.Tools
         <PackageReference Include="System.Drawing.Common" Version="5.0.0" />
     </ItemGroup>
     <ItemGroup Condition=" '$(TargetFramework)' == 'net5'">
-        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.10" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.11" />
         <PackageReference Include="System.Diagnostics.PerformanceCounter" Version="5.0.1" />
         <PackageReference Include="System.Drawing.Common" Version="5.0.2" />
     </ItemGroup>

+ 6 - 0
Masuit.Tools.Net45/Masuit.Tools.Net45.csproj

@@ -166,6 +166,9 @@
     <Compile Include="..\Masuit.Tools.Abstractions\Mime\MimeMappingItem.cs">
       <Link>Mime\MimeMappingItem.cs</Link>
     </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Models\Circle.cs">
+      <Link>Models\Circle.cs</Link>
+    </Compile>
     <Compile Include="..\Masuit.Tools.Abstractions\Models\DateTimeRange.cs">
       <Link>Models\DateTimeRange.cs</Link>
     </Compile>
@@ -181,6 +184,9 @@
     <Compile Include="..\Masuit.Tools.Abstractions\Models\PagedList.cs">
       <Link>Models\PagedList.cs</Link>
     </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Models\Sphere.cs">
+      <Link>Models\Sphere.cs</Link>
+    </Compile>
     <Compile Include="..\Masuit.Tools.Abstractions\Models\Tree.cs">
       <Link>Models\Tree.cs</Link>
     </Compile>

+ 2 - 0
Masuit.Tools.Net45/Masuit.Tools.Net45.csproj.DotSettings

@@ -0,0 +1,2 @@
+<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:String x:Key="/Default/CodeInspection/CSharpLanguageProject/LanguageLevel/@EntryValue">Latest</s:String></wpf:ResourceDictionary>

+ 1 - 1
Masuit.Tools.NoSQL.MongoDBClient/Masuit.Tools.NoSQL.MongoDBClient.csproj

@@ -38,7 +38,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="MongoDB.Driver" Version="2.13.1" />
+    <PackageReference Include="MongoDB.Driver" Version="2.13.2" />
   </ItemGroup>
 
 </Project>

+ 7 - 1
Masuit.Tools/Masuit.Tools.csproj

@@ -85,6 +85,12 @@
     <Compile Include="..\Masuit.Tools.Abstractions\Linq\LinqExtension.cs">
       <Link>Linq\LinqExtension.cs</Link>
     </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Models\Circle.cs">
+      <Link>Models\Circle.cs</Link>
+    </Compile>
+    <Compile Include="..\Masuit.Tools.Abstractions\Models\Sphere.cs">
+      <Link>Models\Sphere.cs</Link>
+    </Compile>
     <Compile Include="..\Masuit.Tools.Abstractions\Net\*.*">
       <Link>Net\%(RecursiveDir)%(FileName)%(Extension)</Link>
     </Compile>
@@ -172,7 +178,7 @@
       <Version>0.29.0</Version>
     </PackageReference>
     <PackageReference Include="StackExchange.Redis">
-      <Version>2.2.62</Version>
+      <Version>2.2.79</Version>
     </PackageReference>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

+ 2 - 0
Masuit.Tools/Masuit.Tools.csproj.DotSettings

@@ -0,0 +1,2 @@
+<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:String x:Key="/Default/CodeInspection/CSharpLanguageProject/LanguageLevel/@EntryValue">Latest</s:String></wpf:ResourceDictionary>

+ 1 - 1
Test/Masuit.Tools.Core.Test/Masuit.Tools.Core.Test.csproj

@@ -9,7 +9,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="5.0.10" />
+    <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="5.0.11" />
     <PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
     <PackageReference Include="xunit" Version="2.4.1" />