皮皮网

皮皮网

【移动平台源码】【DNFjs脚本源码】【unity dotween 源码详解】geometry源码注释

时间:2024-11-30 03:17:17 分类:娱乐

1.(五) Geometries
2.用C#计算出球、源码圆柱和圆锥的注释表面积和体积的源代码:
3.Flutter(四)之Flutter的布局Widget
4.如何从零开始制作一个LaTeX模板?
5.ROS Melodic 上部署python3 环境
6.arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)

geometry源码注释

(五) Geometries

       本文主要介绍以下内容:

       专栏代码地址: github.com/ue/three....

       本文代码地址: github.com/ue/three....

       在three.js概念里,mesh是源码由几何体Geometry和材质Material组成的,在源码Mesh.js可以看到之间的注释关系:

       Mesh = Geometry + Material

       为什么会有Mesh三角网的概念呢?

       首先我们要回顾下图形渲染管线了。

       所以,源码从上图可以理解:

       Geometry: 就是注释移动平台源码在准备顶点数据,对应Vertex处理过程; Mesh: 就是源码对应的Triangle三角面处理过程; Material:对应Fragment片元处理过程,对每个三角面片进行着色、注释贴图等等处理;

       几何体,源码就是注释在准备一堆顶点数据,主要包括顶点数据、源码颜色数据、注释UV贴图数据、源码法向量数据等等;简单的注释说,几何体就是源码数据源,如果你对如何通过三角面片拼接成几何体非常了解,完全可以自己组织数据,不幸的是,这样操作不仅麻烦,而且也是非常困难的事情。所以,three.js内置常用的几何体,供大家直接使用,DNFjs脚本源码然后控制Position、Scale、Rotation、visible等空间属性,来操控物体。

       Three.js一共有 种内置的图元。

       简单整个例子,了解下使用流程,其他几何体触类旁通,参考three.js官网即可。

       参考代码:

       执行命令:

       运行后,场景中多一个Line。

       运行后,多出一个三角锥:

       为什么即存在Geometry,又存在BufferGeometry?

       说白了,Geometry更适合于人来理解,自定义的地方比较多,但性能比较低一些;

       BufferGeometry更适合计算机来理解,自定义的地方很少,适合对图形学非常了解的人使用,但是性能很高。

       内置的unity dotween 源码详解几何体,都是一些非常基础的模型,可以使用这些基础模型组装成,搭积木的方式,组成非常复杂的场景。

       目前国内,数字产业化搞得如火如荼,各个行业都要数字化,所以数据的来源也是非常复杂的,多种多样的,比如:BIM行业的Revit数据模型、CAD图纸,GIS行业的各种数据要素、倾斜摄影、tiles,可以参考CesiumLab的数据转换这张图。

       最终都会将各行各业的数据进行转换,轻量化,瓦片化等等技术手段,传输给Three.js的BufferGeometry,进行渲染;

       或者将数据通过Datasmith的插件,转换数据转换成Unreal Engine的资产进行渲染。

       后期会针对熟悉的溯源码伪造后果行业数据进行一一分析,探讨应用场景。

       图形学分为三大部分,几何、渲染、动画。

用C#计算出球、圆柱和圆锥的表面积和体积的源代码:

       class Geometry

        {

        public static int VSphere(int r)//球体积

        {

        return Math.PI*r*r;

        }

        public static int VCylinda(int r,int h)\\圆柱体积

        {

        return Math.PI*r*r*h;

        }

        public static int VCone(int r,int h)\\圆锥体积

        {

        return Math.PI*r*r*h/3;

        }

        public static int SSphere(int r)\\球表面积

        {

        return 4*Math.PI*r*r;

        }

        public static int SCylinda(int r,int h)\\圆柱表面积

        {

        return Math.PI*(r^2*2+2*r*h);

        }

        public static int SCone1(int r,int h)\\圆锥表面积(须知底面半径和高)

        {

        return Math.PI*(r^2+r*Math.Sqrt(r^2+h^2));

        }

        public static int SCone2(int r,int l)\\圆锥表面积(须知底面半径和母线长)

        {

        return Math.PI*(r^2+r*l);

        }

        }

       静态方法,直接调用就好。

Flutter(四)之Flutter的布局Widget

       ä¸€.单子布局组件

       å•å­å¸ƒå±€ç»„件的含义是其只有一个子组件,可以通过设置一些属性设置该子组件所在的位置信息等。

       æ¯”较常用的单子布局组件有:Align、Center、Padding、Container。

1.1.Align组件1.1.1.Align介绍

       çœ‹åˆ°Align这个词,我们就知道它有我们的对齐方式有关。

       åœ¨å…¶ä»–端的开发中(iOS、Android、前端)Align通常只是一个属性而已,但是Flutter中Align也是一个组件。

       æˆ‘们可以通过源码来看一下Align有哪些属性:

constAlign({ Keykey,this.alignment:Alignment.center,//对齐方式,默认居中对齐this.widthFactor,//宽度因子,不设置的情况,会尽可能大this.heightFactor,//高度因子,不设置的情况,会尽可能大Widgetchild//要布局的子Widget})

       è¿™é‡Œæˆ‘们特别解释一下widthFactor和heightFactor作用:

       å› ä¸ºå­ç»„件在父组件中的对齐方式必须有一个前提,就是父组件得知道自己的范围(宽度和高度);

       å¦‚æžœwidthFactor和heightFactor不设置,那么默认Align会尽可能的大(尽可能占据自己所在的父组件);

       æˆ‘们也可以对他们进行设置,比如widthFactor设置为3,那么相对于Align的宽度是子组件跨度的3倍;

1.1.2.Align演练

       æˆ‘们简单演练一下Align:

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}1.2.Center组件1.2.1.Center介绍

       Center组件我们在前面已经用过很多次了。

       äº‹å®žä¸ŠCenter组件继承自Align,只是将alignment设置为Alignment.center。

       æºç åˆ†æžï¼š

classCenterextendsAlign{ constCenter({ Keykey,doublewidthFactor,doubleheightFactor,Widgetchild}):super(key:key,widthFactor:widthFactor,heightFactor:heightFactor,child:child);}1.2.2.Center演练

       æˆ‘们将上面的代码Align换成Center

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnCenter(child:Icon(Icons.pets,size:,color:Colors.red),widthFactor:3,heightFactor:3,);}}1.3.Padding组件1.3.1.Padding介绍

       Padding组件在其他端也是一个属性而已,但是在Flutter中是一个Widget,但是Flutter中没有Margin这样一个Widget,这是因为外边距也可以通过Padding来完成。

       Padding通常用于设置子Widget到父Widget的边距(你可以称之为是父组件的内边距或子Widget的外边距)。

       æºç åˆ†æžï¼š

constPadding({ Keykey,@requiredthis.padding,//EdgeInsetsGeometry类型(抽象类),使用EdgeInsetsWidgetchild,})1.3.2.Padding演练

       ä»£ç æ¼”练:

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnPadding(padding:EdgeInsets.all(),child:Text("莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。",style:TextStyle(color:Colors.redAccent,fontSize:),),);}}1.4.Container组件

       Container组件类似于其他Android中的View,iOS中的UIView。

       å¦‚果你需要一个视图,有一个背景颜色、图像、有固定的尺寸、需要一个边框、圆角等效果,那么就可以使用Container组件。

.1.Container介绍

       Container在开发中被使用的频率是非常高的,特别是我们经常会将其作为容器组件。

       ä¸‹é¢æˆ‘们来看一下Container有哪些属性:

Container({ this.alignment,this.padding,//容器内补白,属于decoration的装饰范围Colorcolor,//背景色Decorationdecoration,//背景装饰DecorationforegroundDecoration,//前景装饰doublewidth,//容器的宽度doubleheight,//容器的高度BoxConstraintsconstraints,//容器大小的限制条件this.margin,//容器外补白,不属于decoration的装饰范围this.transform,//变换this.child,})

       å¤§å¤šæ•°å±žæ€§åœ¨ä»‹ç»å…¶å®ƒå®¹å™¨æ—¶éƒ½å·²ç»ä»‹ç»è¿‡äº†ï¼Œä¸å†èµ˜è¿°ï¼Œä½†æœ‰ä¸¤ç‚¹éœ€è¦è¯´æ˜Žï¼š

       å®¹å™¨çš„大小可以通过width、height属性来指定,也可以通过constraints来指定,如果同时存在时,width、height优先。实际上Container内部会根据width、height来生成一个constraints;

       color和decoration是互斥的,实际上,当指定color时,Container内会自动创建一个decoration;

       decoration属性稍后我们详细学习;

1.4.2.Container演练

       ç®€å•è¿›è¡Œä¸€ä¸ªæ¼”示:

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnCenter(child:Container(color:Color.fromRGBO(3,3,,.5),width:,height:,child:Icon(Icons.pets,size:,color:Colors.white),),);}}1.4.3.BoxDecoration

       Container有一个非常重要的属性decoration:

       ä»–对应的类型是Decoration类型,但是它是一个抽象类。

       åœ¨å¼€å‘中,我们经常使用它的实现类BoxDecoration来进行实例化。

       BoxDecoration常见属性:

constBoxDecoration({ this.color,//颜色,会和Container中的color属性冲突this.image,//背景图片this.border,//边框,对应类型是Border类型,里面每一个边框使用BorderSidethis.borderRadius,//圆角效果this.boxShadow,//阴影效果this.gradient,//渐变效果this.backgroundBlendMode,//背景混合this.shape=BoxShape.rectangle,//形变})

       éƒ¨åˆ†æ•ˆæžœæ¼”示:

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnCenter(child:Container(//color:Color.fromRGBO(3,3,,.5),width:,height:,child:Icon(Icons.pets,size:,color:Colors.white),decoration:BoxDecoration(color:Colors.amber,//背景颜色border:Border.all(color:Colors.redAccent,width:3,style:BorderStyle.solid),//这里也可以使用Border.all统一设置//top:BorderSide(//color:Colors.redAccent,//width:3,//style:BorderStyle.solid//),borderRadius:BorderRadius.circular(),//这里也可以使用.only分别设置boxShadow:[BoxShadow(offset:Offset(5,5),color:Colors.purple,blurRadius:5)],//shape:BoxShape.circle,//会和borderRadius冲突gradient:LinearGradient(colors:[Colors.green,Colors.red])),),);}}1.4.4.实现圆角图像

       ä¸Šä¸€ä¸ªç« èŠ‚我们提到可以通过Container+BoxDecoration来实现圆角图像。

       å®žçŽ°ä»£ç å¦‚下:

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}0二.多子布局组件

       åœ¨å¼€å‘中,我们经常需要将多个Widget放在一起进行布局,比如水平方向、垂直方向排列,甚至有时候需要他们进行层叠,比如图片上面放一段文字等;

       è¿™ä¸ªæ—¶å€™æˆ‘们需要使用多子布局组件(Multi-childlayoutwidgets)。

       æ¯”较常用的多子布局组件是Row、Column、Stack,我们来学习一下他们的使用。

2.1.Flex组件

       äº‹å®žä¸Šï¼Œæˆ‘们即将学习的Row组件和Column组件都继承自Flex组件。

       Flex组件和Row、Column属性主要的区别就是多一个direction。

       å½“direction的值为Axis.horizontal的时候,则是Row。

       å½“direction的值为Axis.vertical的时候,则是Column。

       åœ¨å­¦ä¹ Row和Column之前,我们先学习主轴和交叉轴的概念。

       å› ä¸ºRow是一行排布,Column是一列排布,那么它们都存在两个方向,并且两个Widget排列的方向应该是对立的。

       å®ƒä»¬ä¹‹ä¸­éƒ½æœ‰ä¸»è½´ï¼ˆMainAxis)和交叉轴(CrossAxis)的概念:

       å¯¹äºŽRow来说,主轴(MainAxis)和交叉轴(CrossAxis)分别是下图

       å¯¹äºŽColumn来说,主轴(MainAxis)和交叉轴(CrossAxis)分别是下图

2.1.Row组件2.1.1.Row介绍

       Row组件用于将所有的子Widget排成一行,实际上这种布局应该是借鉴于Web的Flex布局。

       å¦‚果熟悉Flex布局,会发现非常简单。

       ä»Žæºç ä¸­æŸ¥çœ‹Row的属性:

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}1

       mainAxisSize:

       è¡¨ç¤ºRow在主轴(æ°´å¹³)方向占用的空间,默认是MainAxisSize.max,表示尽可能多的占用水平方向的空间,此时无论子widgets实际占用多少水平空间,Row的宽度始终等于水平方向的最大宽度

       è€ŒMainAxisSize.min表示尽可能少的占用水平空间,当子widgets没有占满水平剩余空间,则Row的实际宽度等于所有子widgets占用的的水平空间;

       mainAxisAlignment:表示子Widgets在Row所占用的水平空间内对齐方式

       å¦‚æžœmainAxisSize值为MainAxisSize.min,则此属性无意义,因为子widgets的宽度等于Row的宽度

       åªæœ‰å½“mainAxisSize的值为MainAxisSize.max时,此属性才有意义

       MainAxisAlignment.start表示沿textDirection的初始方向对齐,

       å¦‚textDirection取值为TextDirection.ltr时,则MainAxisAlignment.start表示左对齐,textDirection取值为TextDirection.rtl时表示从右对齐。

       è€ŒMainAxisAlignment.end和MainAxisAlignment.start正好相反;

       MainAxisAlignment.center表示居中对齐。

       crossAxisAlignment:表示子Widgets在纵轴方向的对齐方式

       Row的高度等于子Widgets中最高的子元素高度

       å®ƒçš„取值和MainAxisAlignment一样(包含start、end、center三个值)

       ä¸åŒçš„是crossAxisAlignment的参考系是verticalDirection,即verticalDirection值为VerticalDirection.down时crossAxisAlignment.start指顶部对齐,verticalDirection值为VerticalDirection.up时,crossAxisAlignment.start指底部对齐;而crossAxisAlignment.end和crossAxisAlignment.start正好相反;

2.1.2.Row演练

       æˆ‘们来对部分属性进行简单的代码演练,其他一些属性大家自己学习一下

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}.1.3.mainAxisSize

       é»˜è®¤æƒ…况下,Row会尽可能占据多的宽度,让子Widget在其中进行排布,这是因为mainAxisSize属性默认值是MainAxisSize.max。

       æˆ‘们来看一下,如果这个值被修改为MainAxisSize.max会什么变化:

2.1.4.TextBaseline

       å…³äºŽTextBaseline的取值解析

2.1.5.Expanded

       å¦‚果我们希望红色和黄色的ContainerWidget不要设置固定的宽度,而是占据剩余的部分,这个时候应该如何处理呢?

       è¿™ä¸ªæ—¶å€™æˆ‘们可以使用Expanded来包裹ContainerWidget,并且将它的宽度不设置值;

       flex属性,弹性系数,Row会根据两个Expanded的弹性系数来决定它们占据剩下空间的比例

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}.2.Column组件

       Column组件用于将所有的子Widget排成一列,学会了前面的Row后,Column只是和row的方向不同而已。

2.2.1.Column介绍

       æˆ‘们直接看它的源码:我们发现和Row属性是一致的,不再解释

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}.2.2.Column演练

       æˆ‘们直接将Row的代码中Row改为Column,查看代码运行效果

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}.3.Stack组件

       åœ¨å¼€å‘中,我们多个组件很有可能需要重叠显示,比如在一张图片上显示文字或者一个按钮等。

       åœ¨Android中可以使用Frame来实现,在Web端可以使用绝对定位,在Flutter中我们需要使用层叠布局Stack。

2.3.1.Stack介绍

       æˆ‘们还是通过源码来看一下Stack有哪些属性:

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}6

       å‚æ•°j解析:

       alignment:此参数决定如何去对齐没有定位(没有使用Positioned)或部分定位的子widget。所谓部分定位,在这里特指没有在某一个轴上定位:left、right为横轴,top、bottom为纵轴,只要包含某个轴上的一个定位属性就算在该轴上有定位。

       textDirection:和Row、Wrap的textDirection功能一样,都用于决定alignment对齐的参考系即:textDirection的值为TextDirection.ltr,则alignment的start代表左,end代表右;textDirection的值为TextDirection.rtl,则alignment的start代表右,end代表左。

       fit:此参数用于决定没有定位的子widget如何去适应Stack的大小。StackFit.loose表示使用子widget的大小,StackFit.expand表示扩伸到Stack的大小。

       overflow:此属性决定如何显示超出Stack显示空间的子widget,值为Overflow.clip时,超出部分会被剪裁(隐藏),值为Overflow.visible时则不会。

2.3.2.Stack演练

       Stack会经常和Positioned一起来使用,Positioned可以决定组件在Stack中的位置,用于实现类似于Web中的绝对定位效果。

       ä¸€ä¸ªç®€å•çš„演练:

       æ³¨æ„ï¼šPositioned组件只能在Stack中使用。

classMyHomeBodyextendsStatelessWidget{ @overrideWidgetbuild(BuildContextcontext){ returnAlign(child:Icon(Icons.pets,size:,color:Colors.red),alignment:Alignment.bottomRight,widthFactor:3,heightFactor:3,);}}7

       \

原文:/post/

如何从零开始制作一个LaTeX模板?

       从零开始,打造专业级LaTeX模板的全攻略

       想要在 LaTeX 的世界里崭露头角?从零开始创建一个符合个人需求的模板,其实并不复杂。下面是一份详尽的步骤指南,助你轻松上手:

入门 LaTeX:首先,确保你对 LaTeX 的基础有一定了解。熟悉其基本语法、命令和环境,了解如何编译文档,这将为你的模板之旅奠定坚实基础。

规划模板蓝图:明确模板的目的和设计要求,选择合适的文档类(如 article、report 或 book)和可能的宏包。比如,网站后门程序源码如果你需要创建一个学术论文模板,可能需要添加 biblatex 用于引用管理。

创建基本文档类:在工作目录下创建一个新的 .cls 文件,定义模板的核心结构。这包括设定页面布局(如 \usepackage{ geometry}),定制标题样式(如 \usepackage{ titlesec})和章节样式等。

引入关键宏包:根据需求,使用 \usepackage 命令引入宏包,比如 graphicx 用于图像插入,fancyhdr 可以定制页眉页脚。确保每个宏包都服务于你的模板目标。

自定义命令和环境:利用 \newcommand 和 \newenvironment 创建自定义命令和环境,简化文档编写,比如定义章节标题格式或创建自己的列表样式。

设计独特的标题和布局:使用宏包如 titlesec 和 geometry,个性化你的标题样式,如章节标题的字号、间距和颜色,以及页面的整体布局,如边距和页眉页脚的设计。

实践与测试:编写一个示例文档,用你的新模板操作,确保其功能性和美观性。不要忘了检查文档的编译结果,修复可能出现的错误。

文档注释与说明:为模板添加详细的注释和使用说明,以便他人能轻松理解和上手。解释每个命令和环境的作用,以及如何在文档中正确应用。

       在这个过程中,持续学习和探索是关键。参考以下资源,让你的模板之旅更加顺畅:

官方文档: LaTeX 官方文档是学习和查阅命令、环境和类的宝库。使用 texdoc 命令,如 texdoc article 可获取标准文档类的详细信息。

LaTeX Wikibook: 这个在线教程提供了丰富的实例和讲解,覆盖从入门到高级的 LaTeX 技术。

CTAN: TeX 资源库,搜索宏包、文档类和模板,这里有丰富的资源库供你发现和学习。

LaTeX Stack Exchange: 在这个问答社区,你可以提问和寻求关于模板制作的专业解答。

模板示例和文档: CTAN 上的现成模板可以作为参考,阅读源代码和文档能帮助你理解模板设计思路。

       最后,别忘了加入 LaTeX 社区,如 TeX - LaTeX Stack Exchange,与其他 LaTeX 爱好者交流心得,分享你的模板成果。这样,你的 LaTeX 技艺将不断精进,模板也将日趋完美。

ROS Melodic 上部署python3 环境

       在ROS Melodic环境下部署Python3环境,通常会遇到不兼容性问题,因为默认环境下ROS Melodic与Ubuntu .并不原生支持Python3解释器。本文将针对这一问题进行详细解答,提供解决步骤和解决方案。

       ### 简单解决方案

       解决方法之一是尝试在Python脚本的第一行修改为Python3解释器的调用方式。修改内容如下:

       bash

       #!/usr/bin/env python3

       若此步骤能解决问题,则任务完成。若出现错误信息,请继续阅读后续内容。

       ### 报错指南

       对于遇到的错误,解决步骤可参考以下部分:

       #### 解决geometry2部分

       对于geometry2相关问题,通常需要通过下载其源代码并手动编译解决。参考官方论坛中的指南进行操作。

       #### 解决PyDKL部分

       如遇到PyDKL导入错误,首先确保已安装了C++依赖库和Python插件。然后,重新配置PyKDL以兼容Python3环境。具体步骤包括安装C++库、安装对应Python插件、并禁用Python2版本的PyKDL.so文件。

       ### 动机分析

       在不升级系统或重装ROS Melodic的情况下,希望使用Python3环境和依赖包(如python-opencv、pytorch)。

       ### 问题分析

       问题的核心在于ROS Melodic默认基于Python2环境,而许多现代Python3库和ROS项目不兼容。

       ### 前提

       为了灵活切换Python2和Python3解释器,推荐使用conda管理多个Python虚拟环境。首先确保已安装conda,对于轻量级需求,建议使用mini-conda。

       ### 解决geometry2

       下载geometry源代码并手动编译,通过`catkin_make`命令正确设置Python相关参数。验证解决方案是否成功。

       ### 解决PyDKL

       遇到错误时,重新配置PyKDL环境,安装C++库和Python插件。在Python3环境中禁用Python2版本的PyKDL.so文件,确保所有依赖正确指向Python3环境。

       ### Gazebo spawn_model 报错

       针对Gazebo spawn_model脚本中的报错,修改脚本第一行调用Python3解释器,从`#!/usr/bin/env python2`改为`#!/usr/bin/env python3`,以解决与ROS Melodic环境不兼容的问题。

       通过上述步骤,可以有效地在ROS Melodic环境下部署Python3环境,解决遇到的不兼容问题。

arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)

       关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js: esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类的介绍,还有就是在线例子: esri 官网在线例子,这个也是学习 arcgis api 3.x 的好素材。

       内容概览

       基于arcgis api 的 Draw 工具基本绘制 拓展 Draw 工具的绘制 源代码 demo 下载

       本篇实现地图态势标绘功能模块

       截图如下

       本篇核心的在于调用 arcgis api 的 Draw 工具: Draw

       构造函数:

       一般来说,传参 map 对象进来就行,其他参数可选的,用默认的就行,除非你想专门设置。 默认的可绘制图形类型常量 Constants:

       可以设置绘制的符号样式:

       其中,activate 函数可以激活触发绘制的行为,绘制结束之后在绘制结束事件里面获取 geometry:

       地图态势标绘实现的思路:利用 arcgis api 的 Draw工具实现普通的点线面绘制,但是对于燕尾箭头、集结地、弧线、曲线、简单箭头等特殊的军事态势需要自定义来绘制了,所以需要拓展 Draw 工具才能实现,也是本篇的精华所在。

       1是继承拓展 Draw 的文件目录;2是实现态势标绘模块的 js 文件。 首先,需要在 map.html 页面引用进来:

       其中,paths 代表需要引用的路径。

       其次,在 map.js 文件的初始化里面引用拓展的 js 文件 DrawEx 以及 DrawExt:

       最后,在工具栏菜单的态势标绘菜单响应事件里面调用 plot.js 即可:

       其次,触发调用 Draw 绘制:

       最后,添加绘制图形在地图上展示:

       demo源码下载 下载提取码:g5cy