道路倒角 三角网 两侧偏移

news2025/2/5 19:53:31
  public void 多段线和直线两侧缓冲区()
  {
      List<Curve> ents1 = Z.db.SelectEntities<Curve>();

      List<Polyline> ents = Z.db.CurvesToPolyLines2(ents1);
      //Z.db.SelectEntities<Polyline>();
      double offsetDistance = 5.0;//p距离
      double offsetDistance2 = 1.0;//p距离
      List<Line> rightPolylines = new List<Line>();
      List<Line> rightPolylines2 = new List<Line>();
      Region myRegion = PolylineToRegion(ents, offsetDistance , offsetDistance2,out rightPolylines);
      Region myRegion2 = LineToRegion(rightPolylines, offsetDistance2, out rightPolylines2);
      myRegion.BooleanOperation(BooleanOperationType.BoolSubtract, myRegion2);  //面域相减
      //Z.db.AddEntityToModeSpace(resultPolylines.ToArray());
      //Z.db.AddEntityToModeSpace(resultCir.ToArray());
      //Z.db.AddEntityToModeSpace(regions.ToArray());
      Z.db.AddEntityToModeSpace(myRegion);
      //Z.db.AddEntityToModeSpace(rightPolylines.ToArray());
  }
  public Region PolylineToRegion(List<Polyline> ents, double offsetDistance, double offsetDistance2, out List<Line> rightPolylines)
  {
      List<Polyline> resultPolylines = new List<Polyline>();
      List<Line> rightPolylines2 = new List<Line>();
      List<Circle> resultCir = new List<Circle>();
      List<Region> regions = new List<Region>();
      DBObjectCollection tempColl = new DBObjectCollection();//
      DBObjectCollection allColl = new DBObjectCollection();//所有对象集合
      
      foreach (var item in ents)
      {   
          Polyline polyline = item;
          double radius = 0;  
          //Circle circle1 = new Circle(polyline.EndPoint, Vector3d.ZAxis, radius);//最后一个点画圆
          //circle1.ColorIndex = 1;
          //resultCir.Add(circle1);
          //allColl.Add(circle1);
          for (int i = 0; i < polyline.NumberOfVertices - 1; i++)
          {
              //if (i == polyline.NumberOfVertices - 2)
              //{
              //    Circle circle1 = new Circle(polyline.EndPoint, Vector3d.ZAxis, radius);//最后一个点画圆
              //    circle1.ColorIndex = 1;
              //    resultCir.Add(circle1);
              //    allColl.Add(circle1);   
              //}
              // polyline.GetOffsetCurvesGivenPlaneNormal(Vector3d.ZAxis, offsetDistance);
              // 获取当前段的起点和终点
              Point3d startPt = polyline.GetPoint3dAt(i);//.GetPointAt(i);
              Point3d endPt = polyline.GetPoint3dAt(i + 1);
              //Region region1 = new Region();//创建面域
              // 创建偏移的直线段
              Line lineSeg = new Line(startPt, endPt);
              DBObjectCollection offsetLineSegLeft = lineSeg.GetOffsetCurves(offsetDistance);// (offsetDistance, Vector3d.ZAxis, OffsetCurveExtensionType.Chamfer);
              DBObjectCollection offsetLineSegRight = lineSeg.GetOffsetCurves(offsetDistance * (-1.0));
              Line leftline = offsetLineSegLeft[0] as Line;
              Line rightline = offsetLineSegRight[0] as Line;
             
               radius = leftline.GetClosestPointTo(endPt, false).DistanceTo(endPt)- offsetDistance2; //  .GetDistAtPoint(endPt);
              //if (i >= 0 && i < polyline.NumberOfVertices - 2)//起始点不画圆圈
                  if (true)//起始点画圆圈
                  {
                  if (i==0)
                  {
                      Circle circle1 = new Circle(startPt, Vector3d.ZAxis, radius);
                      //circle1.ColorIndex = 1;
                      resultCir.Add(circle1);
                      allColl.Add(circle1); ;//创建圆
                  }
                  Circle circle = new Circle(endPt, Vector3d.ZAxis, radius);//创建圆
                  //circle.ColorIndex = 1;
                  resultCir.Add(circle);
                  allColl.Add(circle);
              }
             
               将偏移后的线段转换为多段线
              Polyline plLeft = new Polyline();
              //plLeft.ColorIndex = 1;
              plLeft.AddVertexAt(0, new Point2d(leftline.StartPoint.X, leftline.StartPoint.Y), polyline.GetBulgeAt(i), 0, 0);
              plLeft.AddVertexAt(1, new Point2d(leftline.EndPoint.X, leftline.EndPoint.Y), 0, 0, 0);
              resultPolylines.Add(plLeft);

              Polyline plRight = new Polyline();
              //plRight.ColorIndex = 1;
              plRight.AddVertexAt(0, new Point2d(rightline.StartPoint.X, rightline.StartPoint.Y), polyline.GetBulgeAt(i), 0, 0);
              plRight.AddVertexAt(1, new Point2d(rightline.EndPoint.X, rightline.EndPoint.Y), 0, 0, 0);
              resultPolylines.Add(plRight);
             // rightPolylines2.Add(plRight);//需要减去的里边线
              Polyline rect = new Polyline();
              rect.AddVertexAt(0, new Point2d(leftline.StartPoint.X, leftline.StartPoint.Y), polyline.GetBulgeAt(i), 0, 0);
              rect.AddVertexAt(1, new Point2d(leftline.EndPoint.X, leftline.EndPoint.Y), 0, 0, 0);
              rect.AddVertexAt(2, new Point2d(rightline.EndPoint.X, rightline.EndPoint.Y), polyline.GetBulgeAt(i) * (-1), 0, 0);
              rect.AddVertexAt(3, new Point2d(rightline.StartPoint.X, rightline.StartPoint.Y), 0, 0, 0);
              //rect.ColorIndex = 1;
              rect.Closed = true;
              //Z.db.AddEntityToModeSpace(rect);//画多段线
              allColl.Add(rect);
          }
       
          tempColl = Region.CreateFromCurves(allColl);//region的边界是一个对象集合
          for (int j = 0; j < tempColl.Count; j++)//这里不可以-1
          {
              regions.Add(tempColl[j] as Region);//加入retions
              //regions[j].ColorIndex = 1;
          }


      }
      Region combinedRegion = new Region();
      foreach (Region region in regions)
      {
          combinedRegion.BooleanOperation(BooleanOperationType.BoolUnite, region);
      }
      DBObjectCollection dbc = new DBObjectCollection();
      combinedRegion.Explode( dbc );
      foreach (var item in dbc)
      {
          if (item is Line line )
          {
              //Polyline pl = new Polyline();
              //pl.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
              rightPolylines2.Add(line);
          }
          
      }
      rightPolylines = rightPolylines2;
      return combinedRegion;
  }
  public Region LineToRegion(List<Line> ents, double offsetDistance, out List<Line> rightPolylines)
  {
      List<Polyline> resultPolylines = new List<Polyline>();
      List<Line> rightPolylines2 = new List<Line>();
      List<Circle> resultCir = new List<Circle>();
      List<Region> regions = new List<Region>();
      DBObjectCollection tempColl = new DBObjectCollection();//
      DBObjectCollection allColl = new DBObjectCollection();//所有对象集合
      List<Line> linerep = Outershape.RepairLine(ents);
      foreach (var item in linerep)
      {
          Point3d startPt = item.StartPoint;
          Point3d endPt = item.EndPoint;
          DBObjectCollection offsetLineSegLeft = item.GetOffsetCurves(offsetDistance);// (offsetDistance, Vector3d.ZAxis, OffsetCurveExtensionType.Chamfer);
          DBObjectCollection offsetLineSegRight = item.GetOffsetCurves(offsetDistance * (-1.0));
          Line leftline = offsetLineSegLeft[0] as Line;
          Line rightline = offsetLineSegRight[0] as Line;
          double radius = leftline.GetClosestPointTo(endPt, false).DistanceTo(endPt); //  .GetDistAtPoint(endPt);                                                                              //{
          Circle circle = new Circle(endPt, Vector3d.ZAxis, radius);//创建圆
          //circle.ColorIndex = 1;
          resultCir.Add(circle);
          allColl.Add(circle);
      }
          foreach (var item in ents)
          {
              Point3d startPt = item.StartPoint;
              Point3d endPt = item.EndPoint;
              DBObjectCollection offsetLineSegLeft = item.GetOffsetCurves(offsetDistance);// (offsetDistance, Vector3d.ZAxis, OffsetCurveExtensionType.Chamfer);
              DBObjectCollection offsetLineSegRight = item.GetOffsetCurves(offsetDistance * (-1.0));
              Line leftline = offsetLineSegLeft[0] as Line;
              Line rightline = offsetLineSegRight[0] as Line;
              //double radius = leftline.GetClosestPointTo(endPt, false).DistanceTo(endPt); //  .GetDistAtPoint(endPt);                                                                              //{
              //Circle circle = new Circle(endPt, Vector3d.ZAxis, radius);//创建圆
              //circle.ColorIndex = 1;
              //resultCir.Add(circle);
              //allColl.Add(circle);
          //}
           将偏移后的线段转换为多段线
          Polyline plLeft = new Polyline();//画左边线
          //plLeft.ColorIndex = 1;
          plLeft.AddVertexAt(0, new Point2d(leftline.StartPoint.X, leftline.StartPoint.Y), 0, 0, 0);
          plLeft.AddVertexAt(1, new Point2d(leftline.EndPoint.X, leftline.EndPoint.Y), 0, 0, 0);
          resultPolylines.Add(plLeft);

          Polyline plRight = new Polyline();//画右边线
          //plRight.ColorIndex = 1;
          plRight.AddVertexAt(0, new Point2d(rightline.StartPoint.X, rightline.StartPoint.Y),0, 0, 0);
          plRight.AddVertexAt(1, new Point2d(rightline.EndPoint.X, rightline.EndPoint.Y), 0, 0, 0);
          resultPolylines.Add(plRight);
           rightPolylines2.Add(plRight);//需要减去的里边线
          Polyline rect = new Polyline();//画矩形
          rect.AddVertexAt(0, new Point2d(leftline.StartPoint.X, leftline.StartPoint.Y), 0, 0, 0);
          rect.AddVertexAt(1, new Point2d(leftline.EndPoint.X, leftline.EndPoint.Y), 0, 0, 0);
          rect.AddVertexAt(2, new Point2d(rightline.EndPoint.X, rightline.EndPoint.Y), 0, 0, 0);
          rect.AddVertexAt(3, new Point2d(rightline.StartPoint.X, rightline.StartPoint.Y), 0, 0, 0);
          //rect.ColorIndex = 1;
          rect.Closed = true;
          //Z.db.AddEntityToModeSpace(rect);//画多段线
          allColl.Add(rect);
          //}
          tempColl = Region.CreateFromCurves(allColl);//region的边界是一个对象集合
          for (int j = 0; j < tempColl.Count; j++)//这里不可以-1
          {
              regions.Add(tempColl[j] as Region);//加入retions
              //regions[j].ColorIndex = 1;
          }


      }
      Region combinedRegion = new Region();
      foreach (Region region in regions)
      {
          combinedRegion.BooleanOperation(BooleanOperationType.BoolUnite, region);
      }
      DBObjectCollection dbc = new DBObjectCollection();
      combinedRegion.Explode(dbc);
      foreach (var item in dbc)
      {
          if (item is Line line)
          {
              //Polyline pl = new Polyline();
              //pl.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
              rightPolylines2.Add(line);
          }

      }
      rightPolylines = rightPolylines2;
      return combinedRegion;
  }

c5c09b75fd6e414d94ee56264e136946.jpg

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

贪心算法(常见贪心模型)

常见贪心模型 简单排序模型 最小化战斗力差距 题目分析&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e5 10;int n; int a[N];int main() {// 请在此输入您的代码cin >> n;for (int i 1;i < n;i) cin >> a[i];sort(a1,a1n);…

供应链系统设计-供应链中台系统设计(六)- 商品中心概念篇

概述 我们在供应链系统设计-中台系统设计系列&#xff08;五&#xff09;- 供应链中台实践概述 中描述了什么是供应链中台&#xff0c;供应链中台主要包含了那些组成部门。包括业务中台、通用中台等概念。为了后续方便大家对于中台有更深入的理解&#xff0c;我会逐一针对中台…

Linux(Centos 7.6)目录结构详解

Linux(Centos 7.6)是一个操作系统&#xff0c;其核心设计理念是将一切资源抽象为文件&#xff0c;即一切皆文件。比如系统中的硬件设备硬盘、网络接口等都被视为文件。Windows系统一般是分为C、D、E盘。而Linux(Centos 7.6)是以斜线"/"作为文件系统的开始目录&#x…

transform、animation、transition?

transform、transition 和 animation 都是 CSS 属性&#xff0c;用于创建视觉效果&#xff0c;但它们的工作方式和用途不同&#xff1a; 1. transform (变换元素): 作用: transform 用于改变元素的旋转、缩放、移动、倾斜等属性&#xff0c;但不改变元素的初始状态和最终状态…

大数据技术-Hadoop(三)Mapreduce的介绍与使用

目录 一、概念和定义 二、WordCount案例 1、WordCountMapper 2、WordCountReducer 3、WordCountDriver 三、序列化 1、为什么序列化 2、为什么不用Java的序列化 3、Hadoop序列化特点&#xff1a; 4、自定义bean对象实现序列化接口&#xff08;Writable&#xff09; 4…

Echarts+vue电商平台数据可视化——webSocket改造项目

websocket的基本使用&#xff0c;用于测试前端能否正常获取到后台数据 后台代码编写&#xff1a; const path require("path"); const fileUtils require("../utils/file_utils"); const WebSocket require("ws"); // 创建WebSocket服务端的…

神经网络-Inception

Inception网络是由Google开发的一种深度卷积神经网络架构&#xff0c;旨在解决计算机视觉领域中的图像分类和物体识别任务。 Inception网络最初在2014年被提出&#xff0c;并在ImageNet图像分类挑战赛上取得了很好的结果。其设计灵感来自于模块化的思想&#xff0c;将不同尺度…

js给dom分页

减少js操作dom js引擎与渲染引擎相互独立, js操作dom过程开销大操作到了dom层面会触发渲染树的变化,触发回流与重绘开销大 让js给dom分压 js处理完操作后,最后给dom 缓存变量 let container document.getElementById(container) let content for(let count0;count<…

深度学习——神经网络中前向传播、反向传播与梯度计算原理

一、前向传播 1.1 概念 神经网络的前向传播&#xff08;Forward Propagation&#xff09;就像是一个数据处理的流水线。从输入层开始&#xff0c;按照网络的层次结构&#xff0c;每一层的神经元接收上一层神经元的输出作为自己的输入&#xff0c;经过线性变换&#xff08;加权…

秒鲨后端之MyBatis【2】默认的类型别名、MyBatis的增删改查、idea中设置文件的配置模板、MyBatis获取参数值的两种方式、特殊SQL的执行

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! 下篇更新&#xff1a; 秒鲨后端之MyBatis【3】自定义映射resultMap、动态SQL、MyBatis的缓存、MyBatis的逆向工程、分页插件。 默认的类型别名 MyBatis的增删改查 添加 <!--int insertUs…

瑞芯微全新芯片平台RK3506优势详解,高集成低功耗,为工业而生 触觉智能测评

RK3506是瑞芯微Rockchip在2024年第四季度全新推出的Arm嵌入式芯片平台&#xff0c;三核Cortex-A7单核Cortex-M0多核异构设计&#xff0c;CPU频率达1.5Ghz, M0 MCU为200Mhz。 而RK3506芯片平台下的工业级芯片型号RK3506J&#xff0c;具备-40-85℃的工业宽温性能、发热量小&#…

AIOps平台的功能对比:如何选择适合的解决方案?

定义与概念 AIOps&#xff0c;即人工智能运维&#xff08;Artificial Intelligence for IT Operations&#xff09;&#xff0c;是将人工智能技术应用于 IT 运维领域&#xff0c;以实现自动化、智能化的运维管理。它通过整合大数据、机器学习等先进技术&#xff0c;对海量运维数…

Python + 深度学习从 0 到 1(03 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ 神经网络的数据表示 – 张量 你可能对矩阵很熟悉&a…

Lumos学习王佩丰Excel第二十三讲:饼图美化与PPT图表

一、双坐标柱形图的补充知识 1、主次坐标设置 2、主次坐标柱形避让&#xff08;通过增加两个系列&#xff0c;挤压使得两个柱形挨在一起&#xff09; 增加两个系列 将一个系列设置成主坐标轴&#xff0c;另一个设成次坐标轴 调整系列位置 二、饼图美化 1、饼图美化常见设置 …

基于Vue+SSM+SpringCloudAlibaba书籍管理系统

功能要求 一、登录功能&#xff08;http://localhost:8080/#/login&#xff09; 输入账号和密码(admin/admin)进行登录&#xff1a; 如果密码错误&#xff0c;给出提示信息 如果密码正确&#xff0c;跳转到主页 账号或密码错误&#xff1a; 账号密码正确&#xff1a;跳转到…

【优先算法】滑动窗口 --(结合例题讲解解题思路)(C++)

目录 ​编辑 1.什么是滑动窗口&#xff1f; 2. 滑动窗口例题 2.1 例题1&#xff1a;长度最小的子数组 2.1.1 解题思路 2.1.2 方法一&#xff1a;暴力枚举出所有的子数组的和 2.1.3 方法二&#xff1a;使用 “同向双指针” 也就是滑动窗口来进行优化 2.2 例题2&#xff1a;无重…

VS Code 从命令行启动

在 VS Code 中&#xff0c;code 命令允许你在命令行中快速打开文件、文件夹或新窗口。 安装 原本地址&#xff1a;https://code.visualstudio.com/docs/setup/mac 使用 使用 code 命令 打开文件&#xff1a;你可以通过在命令行输入 code 文件名 来直接打开一个文件。 打开文…

微服务-配置管理

文章目录 1.什么是配置管理2.配置共享添加共享配置拉取共享配置 3.配置热更新添加配置到Nacos配置热更新 4.动态路由监听Nacos配置变更 1.什么是配置管理 到目前为止我们已经解决了微服务相关的几个问题&#xff1a; 微服务远程调用微服务注册、发现微服务请求路由、负载均衡…

ArrayList 和LinkedList的区别比较

前言 ‌ArrayList和LinkedList的主要区别在于它们的底层数据结构、性能特点以及适用场景。‌ArrayList和LinkedList从名字分析&#xff0c;他们一个是Array&#xff08;动态数组&#xff09;的数据结构&#xff0c;一个是Linked&#xff08;链表&#xff09;的数据结构&#x…

MySQL--》如何在SQL中巧妙运用函数与约束,优化数据处理与验证?

目录 函数使用 字符串函数 数值函数 日期函数 流程函数 约束 外键约束 约束规则 函数使用 函数是指一段可以直接被另一段程序调用的程序或代码&#xff0c;在mysql当中有许多常见的内置函数&#xff0c;接下来开始对这些内置函数及其作用进行简单的讲解和使用&#xf…