c#实现的一些几何算法(二)

续一

//关于线的一些算法

 

   public class GeometricClass

    {

        /* 判断点与线段的关系,用途很广泛 

         本函数是根据下面的公式写的,P是点C到线段AB所在直线的垂足 

 

                 AC dot AB 

         r =     --------- 

                  ||AB||^2 

              (Cx-Ax)(Bx-Ax) + (Cy-Ay)(By-Ay) 

           = ------------------------------- 

                           L^2 

 

         r has the following meaning: 

 

         r=0      P = A 

         r=1      P = B 

         r<0 P is on the backward extension of AB 

         r>1      P is on the forward extension of AB 

         0<r<1 P is interior to AB 

        */

        public static double RelationOfPointAndLine(SpatialPoint p, SpatialLine l)

        {

            SpatialLine tl = new SpatialLine();

            tl.startPoint = l.startPoint;

            tl.endPoint = p;

            return dotmultiply(tl.endPoint, l.endPoint, l.startPoint) / (CalculateFlatDistance(l.startPoint, l.endPoint) * CalculateFlatDistance(l.startPoint, l.endPoint));

        }

 

        // 根据已知两点坐标,求过这两点的直线解析方程: a*x+b*y+c = 0  (a >= 0)  

        public static SpatialLine Makeline(SpatialPoint p1, SpatialPoint p2)

        {

            SpatialLine tl = new SpatialLine();

            int sign = 1;

            tl.a =

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
泰森多边形算法(Delaunay Triangulation)是一种用于计算点集的三角剖分的算法,可以将点集分割成不规则的三角形网格。在C#中,可以使用现有的第三方实现泰森多边形算法,比如Triangle.NET和Clipper等。 Triangle.NET是一个开源的.NET,提供了三角剖分的实现,同时支持约束边和区域限制等高级功能。以下是基于Triangle.NET的示例代码: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using TriangleNet.Geometry; using TriangleNet.Meshing; namespace DelaunayTriangulation { class Program { static void Main(string[] args) { // 定义点集 List<Vertex> vertices = new List<Vertex>(); vertices.Add(new Vertex(0, 0)); vertices.Add(new Vertex(1, 0)); vertices.Add(new Vertex(1, 1)); vertices.Add(new Vertex(0, 1)); // 构建输入几何体 InputGeometry input = new InputGeometry(vertices.Count); for (int i = 0; i < vertices.Count; i++) { input.AddPoint(vertices[i]); } // 进行三角剖分 ConstraintOptions options = new ConstraintOptions(); options.ConformingDelaunay = true; options.SegmentSplitting = 0; options.InsertSteinerPoints = true; options.SteinerPoints = 0; options.UseRegions = false; options.ConformingDelaunay = true; options.ConformingDelaunay = true; options.ConformingDelaunay = true; var mesh = (TriangleNet.Mesh)input.Triangulate(options); // 输出三角剖分结果 Console.WriteLine("顶点数:" + mesh.Vertices.Count); Console.WriteLine("三角形数:" + mesh.Triangles.Count); foreach (var triangle in mesh.Triangles) { Console.WriteLine("Triangle: {0}, {1}, {2}", triangle.P0, triangle.P1, triangle.P2); } Console.ReadLine(); } } } ``` 在上面的代码中,我们首先定义了一个点集,然后使用Triangle.NET中的InputGeometry对象将其转换为输入几何体。接着,我们使用ConstraintOptions对象设置三角剖分的参数,如是否使用约束边和是否进行Steiner点插入等。最后,使用InputGeometry对象的Triangulate方法进行三角剖分,得到三角网格。可以通过遍历Triangle集合来输出每个三角形的顶点信息。 除了Triangle.NET,还可以使用Clipper实现泰森多边形算法。Clipper是一个用于多边形剪切和偏移的开源,支持多边形操作的基本和高级功能。以下是基于Clipper的示例代码: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ClipperLib; namespace DelaunayTriangulation { class Program { static void Main(string[] args) { // 定义点集 List<IntPoint> points = new List<IntPoint>(); points.Add(new IntPoint(0, 0)); points.Add(new IntPoint(100, 0)); points.Add(new IntPoint(50, 100)); // 进行三角剖分 List<List<IntPoint>> triangles = new List<List<IntPoint>>(); ClipperLib.Clipper.Triangulate(points, triangles); // 输出三角剖分结果 Console.WriteLine("三角形数:" + triangles.Count); foreach (var triangle in triangles) { Console.WriteLine("Triangle: {0}, {1}, {2}", triangle[0], triangle[1], triangle[2]); } Console.ReadLine(); } } } ``` 在上面的代码中,我们首先定义了一个点集,然后使用Clipper中的Clipper.Triangulate方法进行三角剖分,得到三角形的顶点坐标。可以通过遍历triangles集合来输出每个三角形的顶点信息。需要注意的是,Clipper中的三角剖分算法可能会产生不规则的三角形,需要根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值