公司法
当前位置: 首页 法律大全

cad怎么捕捉直线交点(如果实现与在线CAD图中的线段实时求交点)

时间:2023-06-14 作者: 小编 阅读量: 1 栏目名: 法律大全

随着web在线CAD图查看的普及,需求也不断涌现,一些需求不再满足的在线图形的查看,而涉及到web端在线图形的几何运算。获取CAD图上面的绘制的所有线段坐标在线获取CAD图上所有线段坐标有两种方式在栅格模式下,可以去后台通过条件查询获取所有线段坐标。webworker是运行在后台的JavaScript,不会影响页面的性能。

随着web在线CAD图查看的普及,需求也不断涌现,一些需求不再满足的在线图形的查看,而涉及到web端在线图形的几何运算。本文以如果实现与在线CAD图中的线段实时求交点这例,介绍下如何在web端cad图几何运算的功能实现。

如果实现与在线CAD图中的线段实时求交点

需要实现的功能有

  • 在线查看CAD图
  • 获取CAD图上面的绘制的所有线段坐标
  • 线段相交
  • 实时计算相交

先上实现效果

实现效果图功能实现介绍在线查看CAD图

如果在Web网页端展示CAD图形(唯杰地图云端图纸管理平台 https://vjmap.com/app/cloud),这个在前面的博文中已讲过,这里不再重复,有需要的朋友可下载工程源代码研究下。

获取CAD图上面的绘制的所有线段坐标

在线获取CAD图上所有线段坐标有两种方式

在栅格模式下,可以去后台通过条件查询获取所有线段坐标。代码如下

//栅格样式去服务器获取坐标点数据// 栅格样式获取捕捉点// 查询所有坐标数据,字段含义可参考https://vjmap.com/guide/svrStyleVar.htmllet res = await svc.conditionQueryFeature({ fields:"s3", condition:"s3 != ''", limit: 100000})res = res.result.map(e => e.s3.split(";"))snapObj.features = []for(let item of res) {let coordinates = []for(let pt of item) {const p = pt.split(",")if (p.length >= 2) {coordinates.push(map.toLngLat([ p[0],p[1]]))}}if (coordinates.length == 1) {snapObj.features.push({type: "Feature",geometry: {type: "Point",coordinates: coordinates[0]}})}else if (coordinates.length > 1) {snapObj.features.push({type: "Feature",geometry: {type: "LineString",coordinates: coordinates}})}}

在矢量模式下,可以直接在前端获取当前渲染的线图层的所有线坐标,代码如下

// 查询矢量图层上所有的线图层let features = map.queryRenderedFeatures({layers: ['vector-layer-lines']})let mapGeoDatas = {type: "FeatureCollection",features: features.map(f => {return {id: f.id,type: f.type,properties: f.properties,geometry: f.geometry}})}

线段相交

/** * 线段相交 * @return {{result: string, status: boolean} | {result: string, status: boolean} | {x: number, y: number, status: boolean, ratio: number} | {result: string, status: boolean}}*/exportfunction segmentIntersect(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number): {result: string;status: boolean;x?: undefined;y?: undefined;ratio?: undefined;} | {status: boolean;x: number;y: number;ratio: number;result?: undefined;};

在示例中,我们模拟了一条随机的线条,并且让这条线条实时动起来。代码如下

// 让相交线动起来const moveLine =(newStartPoint, newEndPoint) => {let data = map.getSourceData(intersectLine.sourceId);let geoData = map.fromLngLat(data);// 开始点插值函数let mapProgressToValueStart = vjmap.interpolate([0, 1],[geoData.features[0].geometry.coordinates[0], [newStartPoint.x, newStartPoint.y]])// 终点插值函数let mapProgressToValueEnd = vjmap.interpolate([0, 1],[geoData.features[0].geometry.coordinates[1], [newEndPoint.x, newEndPoint.y]])vjmap.createAnimation({from: 0,to: 1,duration: 5000,ease:vjmap.linear, //线性onUpdate: latest => {let beginPoint = mapProgressToValueStart(latest)let endPoint = mapProgressToValueEnd(latest)// 修改坐标data.features[0].geometry.coordinates = map.toLngLat([beginPoint, endPoint])map.setData(intersectLine.sourceId, data)},onComplete: (e) => {map.fire("moveLineFinish"); // 发送线移动完成事件}})}

实时相交

相交计算如果数据量大时,会耗CPU资源,会导致图形卡顿,如果需要做到实时相交,并且运行界面不卡顿,需要用WebWorker的技术。web worker 是运行在后台的 JavaScript,不会影响页面的性能。web worker 无疑是解决 js 计算能力弱的一大利器.

在唯杰地图 vjmap中有对webworker的封装,可以直接把一个匿名函数做为一个webworker去运行。相关代码如下

/* 如果要用vjmap库中其他的函数,获取库脚本的内容let script = await vjmap.httpHelper.get("js/vjmap/vjmap.min.js", undefined, {raw: true})*/// 启动webworker计算相交函数let intersect = vjmap.WorkerProxy(getIntersects, {// vjmap: script.data, //脚本内容, 如果要用vjmap库中其他的函数,可以获取库脚本的内容 ,把脚本内容传给webworkerintersectFunc: vjmap.segmentIntersect // 把主进程库的相交函数做为上下文传进去,这个方法是不用引入vjmap整个库,只用里面的某个函数,但是这个函数不能调用其他函数,如果调用了其他函数会报错,这时只有用上面注释的那个办法,把整个vjmap库都导入进webworker});// 用webworker计算相交点const calcIntersect = async ()=> {// 获取线的坐标let coordinates = map.fromLngLat(map.getSourceData(intersectLine.sourceId)).features[0].geometry.coordinates;// 启动webworker计算相交点let intersectPoints = await intersect(coordinates[0], coordinates[1], geoDatas)intersectSymbols.setData(map.toLngLat(intersectPoints)); //修改数据map.fire("calcIntersectFinish"); // 发送线移动完成事件}map.on("calcIntersectFinish", async ()=> setTimeout(async ()=> await calcIntersect(), 15))calcIntersect();// 如果要停止webworker//intersect.worker.terminate()

最终效果如下

上面的案例代码已开源。访问 (https://vjmap.com/demo/#/demo/map/geo/geoWebWorkerIntersect) ,查看效果和代码即可。

    推荐阅读
  • 怎样烧红烧肉(家常红烧肉的做法)

    怎样烧红烧肉原料:精品五花肉、炖肉料包、葱、冰糖、茶叶。五花肉切条放入凉水中撇去血沫。焯水定型;捞出后晾凉切一样大的方块。锅中放少许油倒入白砂糖炒糖色。糖色的气泡由大变小迅速关火,倒入开水。加少许绍酒,加开水烧,熟得快,加入茶叶水,可以去腥味。改回炒锅大火,放冰糖,使汁粘稠即可出锅,香葱段点缀。

  • 2022杭州径山茶圣节时间、地点、活动一览

    最终集齐所有铜币的游客可至“大宋钱庄”兑换神秘礼物。今来茶韵生活01、陆羽说论坛为进一步挖掘径山茶宴有关历史文化,本届茶圣节特邀请茶学专家交流讨论如何更好保护和传承国家非物质文化遗产。为打造文化传播年,第二十一届中国茶圣节以春迎、夏凉、秋韵、冬福四大主题贯穿全年。

  • 《重生之门》给罗队发短信的人身份

    但是通过前文,不难推测应该是庄文杰发给罗队的短信,只是没有暴露自己的身份。罗坚来到青檀假日酒店排查,没有发现任何异常,庄文杰和许正清乔装改扮随后赶来,他们一出现就被人盯上,庄文杰和许正清来到地下停车场,庄文杰巧妙引开那些人,混进游客中进入酒店。这件事情把十二年前的洛神案串联起来了。

  • 爱情名著哪个好看(随侃名著佳作第6期)

    言下之意,他主动向周晓白提出分手。钟跃民成为一个军人,上了战场,并且是在战斗中受伤,被送到战地医疗帐篷内救治。而周晓白和钟跃民在时隔十多年后的相遇一刻,也是被编剧以及导演,安排得相当的特别,并不是那种悲情欲绝又或者是感动无比的相遇时刻。

  • 板栗可以保存多久 板栗怎么能保存时间长

    如果是晒干的板栗可以存放3-4个月,生板栗在常温下合理贮存可以存放1-2个月,煮熟的栗子大概可以放一周,熟板栗放冰箱冷冻能保存30天左右,熟板栗放冰箱冷藏保存可以存放5天。

  • 贾宝玉与红楼梦的关系(贾宝玉的春梦到底在暗示什么)

    贾宝玉与红楼梦的关系?要知道,贾琏这个人极其好色,而且好的就是熟女,那么从这个曲折的描述中,我们可以推断出,秦可卿应该是那种熟女中的极品。这个问题在书中得不到直接的答案,因为在后面的文章中,秦可卿一共只出现三个镜头:介绍弟弟秦钟与贾宝玉相见,秦可卿病后王熙凤带贾宝玉去探病,秦可卿临死前在梦里向王熙凤交代后事。

  • 简单又好看的剪纸适合儿童(孩子能学会的幼儿简单剪纸教程)

    接下来我们就一起去研究一下吧!简单又好看的剪纸适合儿童幼儿园的孩子经常要做各种各样的手工,通过做手工,提高孩子的审美能力,锻炼孩子的动手能力,培养孩子的专注力和耐心,让孩子更聪明。用蓝天白云绿色的草地,太阳、小兔子和小蘑菇,可以贴出一幅画,也可以用这个画面编出一个小故事,带孩子度过愉快的亲子时光。欢迎关注,学习更多幼儿小手工。

  • 摩尔庄园钓鲤鱼的最佳方法(摩尔庄园钓鲤鱼的有什么最佳方法)

    以下内容希望对你有帮助!摩尔庄园钓鲤鱼的最佳方法工具/原料:华为手机、安卓系统、摩尔庄园游戏。进入游戏后操纵游戏角色进行移动了。去商店购买钓鱼的诱饵。来到池塘边进行的钓鱼。等待的水面出现波动即可钓到鲤鱼了。

  • 国外的懒人产品(歪国产品咖在用哪些可爱的小工具)

    quotes=trueUsabilityHub我通常使用UsabilityHub来帮助确定设计方案。

  • 一年四季水果时间表(一年四季的时令水果是什么)

    3月(春季):枇杷、红香蕉、樱桃、杨桃、番荔枝、青枣、甘果蔗、草莓、番石榴、牛奶蕉、柑桔、观赏南瓜、果桑、鹤首瓜。12月(冬季):樱桃、番茄、红香蕉、鸡蛋果、木瓜、草莓、百香果、杨桃、无花果、番石榴、牛奶蕉、鹤首瓜、观赏南瓜、果蔗、台湾青枣、黑提子、人心果、柠檬、菠萝、油梨、柑橘、橙子。