当前位置: 首页 > news >正文

Blockview

#region polyline围合区域转solid集合

 

      /// <summary>

    /// 使用内存 Solid 模拟多边形灰色填充

    /// </summary>

    /// <param name="poly">闭合多边形 Polyline(直边,bulge = 0)</param>

    /// <returns>List&lt;Solid&gt; 临时实体集合</returns>

    public static List<Solid> Fill(Polyline poly)

    {

        if (poly == null) throw new ArgumentNullException(nameof(poly));

        if (!poly.Closed) throw new ArgumentException("Polyline 必须闭合");

 

        var verts = new List<Point2d>();

        for (int i = 0; i < poly.NumberOfVertices; i++)

            verts.Add(poly.GetPoint2dAt(i));

 

        // 三角剖分

        var triangles = Triangulate(verts);

 

        // 生成 Solid

        var solids = new List<Solid>();

        foreach (var tri in triangles)

        {

            var p0 = new Point3d(tri[0].X, tri[0].Y, 0);

            var p1 = new Point3d(tri[1].X, tri[1].Y, 0);

            var p2 = new Point3d(tri[2].X, tri[2].Y, 0);

            solids.Add(new Solid(p0, p1, p2));

        }

 

        return solids;

    }

 

    /// <summary>

    /// 简单耳切法三角剖分

    /// </summary>

    private static List<Point2d[]> Triangulate(List<Point2d> polyVerts)

    {

        var triangles = new List<Point2d[]>();

        var verts = new List<Point2d>(polyVerts);

 

        while (verts.Count > 3)

        {

            bool earFound = false;

            for (int i = 0; i < verts.Count; i++)

            {

                var prev = verts[(i - 1 + verts.Count) % verts.Count];

                var curr = verts[i];

                var next = verts[(i + 1) % verts.Count];

 

                if (IsConvex(prev, curr, next))

                {

                    // 检查三角形内有没有其他点

                    bool hasPointInside = false;

                    for (int j = 0; j < verts.Count; j++)

                    {

                        if (j == (i - 1 + verts.Count) % verts.Count || j == i || j == (i + 1) % verts.Count) 

                            continue;

 

                        if (PointInTriangle(verts[j], prev, curr, next))

                        {

                            hasPointInside = true;

                            break;

                        }

                    }

 

                    if (!hasPointInside)

                    {

                        // 找到一个耳朵

                        triangles.Add(new Point2d[] { prev, curr, next });

                        verts.RemoveAt(i);

                        earFound = true;

                        break;

                    }

                }

            }

 

            if (!earFound)

                throw new Exception("三角剖分失败,可能多边形顶点顺序不对");

        }

 

        // 剩下最后一个三角形

        triangles.Add(new Point2d[] { verts[0], verts[1], verts[2] });

        return triangles;

    }

 

    private static bool IsConvex(Point2d a, Point2d b, Point2d c)

    {

        return (b.X - a.X) * (c.Y - a.Y) - (b.Y - a.Y) * (c.X - a.X) > 0;

    }

 

    private static bool PointInTriangle(Point2d p, Point2d a, Point2d b, Point2d c)

    {

        double dX = p.X - c.X;

        double dY = p.Y - c.Y;

        double dX21 = c.X - b.X;

        double dY12 = b.Y - c.Y;

        double D = dY12 * (a.X - c.X) + dX21 * (a.Y - c.Y);

        double s = dY12 * dX + dX21 * dY;

        double t = (c.Y - a.Y) * dX + (a.X - c.X) * dY;

        if (D < 0) return s <= 0 && t <= 0 && s + t >= D;

        return s >= 0 && t >= 0 && s + t <= D;

    }

 

    #endregion


文章转载自:

http://sheDFso2.yLqpp.cn
http://74IKuszB.yLqpp.cn
http://Gd6QoDFW.yLqpp.cn
http://89F2djg9.yLqpp.cn
http://VbRQJrp3.yLqpp.cn
http://jpEPUqOh.yLqpp.cn
http://nDgRWN6Q.yLqpp.cn
http://J6cRhYWo.yLqpp.cn
http://Wn05bBWW.yLqpp.cn
http://6yCclI4O.yLqpp.cn
http://pRVzMESI.yLqpp.cn
http://qZRVaDKO.yLqpp.cn
http://rDdVLOr1.yLqpp.cn
http://zY5dcual.yLqpp.cn
http://niCatqeb.yLqpp.cn
http://1vvjy8h6.yLqpp.cn
http://sC1AHTtJ.yLqpp.cn
http://bgsD6lBo.yLqpp.cn
http://XBxIxobi.yLqpp.cn
http://bwmmZ82H.yLqpp.cn
http://LKo4FRox.yLqpp.cn
http://FEZpwpLZ.yLqpp.cn
http://4LJD0GmK.yLqpp.cn
http://vc5bbBrf.yLqpp.cn
http://H0ZthXp9.yLqpp.cn
http://ewyNfls3.yLqpp.cn
http://s4HFIbwY.yLqpp.cn
http://vL4XQ4Ig.yLqpp.cn
http://OfONzXbD.yLqpp.cn
http://QDzJSnwy.yLqpp.cn
http://www.dtcms.com/a/388228.html

相关文章:

  • [Dify] Agent 模式下的流程自动化范式解析
  • Java泛型:类型安全的艺术与实践指南
  • React+antd实现监听localStorage变化多页面更新+纯js单页面table模糊、精确查询、添加、展示功能
  • 事件驱动临床系统:基于FHIR R5 SubscriptionsBulk Data的编程实现(中)
  • 电源滤波器如何“滤”出稳定电力
  • 非连续内存分配
  • CKA08--PVC
  • 贪心算法应用:分数背包问题详解
  • What is Vibe Coding? A New Way to Build with AI
  • 【Anaconda_pandas+numpy】the pandas numpy version incompatible in anaconda
  • 【3D点云测量视觉软件】基于HALCON+C#开发的3D点云测量视觉软件,全套源码+教学视频+点云示例数据,开箱即用
  • 卡尔曼Kalman滤波|基础学习(一)
  • MoPKL模型学习(与常见红外小目标检测方法)
  • 数据驱动变革时代,自动驾驶研发如何破解数据跨境合规难题?
  • Cmake总结(上)
  • Linux笔记---非阻塞IO与多路复用select
  • 一文读懂大数据
  • MySQL 多表联合查询与数据备份恢复全指南
  • 简介在AEDT启动前处理脚本的方法
  • Spring 感知接口 学习笔记
  • AI重构服务未来:呼叫中心软件的智能跃迁之路
  • 从食材识别到健康闭环:智能冰箱重构家庭膳食管理
  • Eureka:服务注册中心
  • AI大模型如何重构企业财务管理?
  • 深入浅出Disruptor:高性能并发框架的设计与实践
  • Java 在 Excel 中查找并高亮数据:详细教程
  • Excel处理控件Aspose.Cells教程:如何将Excel区域转换为Python列表
  • Java 实现 Excel 与 TXT 文本高效互转
  • 【vue+exceljs+file-saver】纯前端:下载excel和上传解析excel
  • 国产化Excel开发组件Spire.XLS教程:使用 Python 设置 Excel 格式,从基础到专业应用