Skyline实现橡皮筋效果绘制矩形框

这种类似于框选的效果用的比较普遍,一般三维平台和GIS平台都提供了支持接口,可是Skyline就是这么傲娇!

思路是这样的:绘制出的矩形框应该是一直与屏幕边框平行的,也就是矩形框的实际旋转角度是等于摄像机的偏移角YAW值的,这样我们只要知道矩形的宽度,用矩形的两个对角点沿摄像机方向或者沿摄像机反方向延长一个宽度的距离就能得到矩形的另外两个点了。这个宽度利用两个对角点的距离和摄像机偏移角度很容易就能算出来,就不赘叙了。

最核心的代码就是正确计算矩形对角线与水平方向的夹角了:

1         //计算矩形对角点的夹角
2         private double GetAngle(IPosition6 Poi)
3         {
4             var includeAngle = _sgworld.CoordServices.GetAimingAngles(_Position, Poi);
5             var angle = includeAngle.Yaw - 90 - _Position.Yaw;
6             return (angle / 180 * 3.14);
7         }

其他主要代码抄录如下:

 1         SGWorld _sgworld = Application3D.SGworld;
 2         private ITerrainPolygon6 _TerrainRctg;
 3         private IPosition6 _Position;
 4               public ITerrainPolygon6 TerrainRectangle
 5         {
 6             get { return _TerrainRctg; }
 7         }
 8
 9          //左键开始绘制长方形
10         public bool OnLButtonDown(int Flags, int X, int Y)
11         {
12             if(_Position ==null)
13             {
14                 var wpi = _sgworld.Window.PixelToWorld(X, Y, WorldPointType.WPT_DEFAULT);
15                 _Position = wpi.Position;
16                 _Position.Yaw = _sgworld.Navigate.GetPosition(AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE).Yaw;
17             }
18             else
19             {
20                 //第二次点击结束绘制
21                 FinshEdit();
22             }
23             return false;
24         }
25
26        //鼠标移动
27         public void OnFrame()
28         {
29             //创建或更新长方形
30             if (_Position == null) return;
31
32             var mi = _sgworld.Window.GetMouseInfo();
33             var position = _sgworld.Window.PixelToWorld(mi.X, mi.Y, WorldPointType.WPT_DEFAULT).Position;
34             var length = _Position.DistanceTo(position);
35             var angle = GetAngle(position);
36             var width = Math.Sin(angle) * length;  /*这里矩形的宽就得到了*/
37
38             var poi1 = _Position.Move(width * -1, _Position.Yaw, 0);  /*两个对角点沿摄像机方向延伸一个宽度*/
39             var poi2 = position.Move(width, _Position.Yaw, 0);
40
41             var array = new double[] {_Position .X,_Position .Y,1,
42                                      poi1 .X ,poi1 .Y ,1,
43                                      position .X ,position .Y ,1,
44                                      poi2 .X ,poi2 .Y ,1};
45             var cRing = _sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(array);
46             var cPolygonGeometry = _sgworld.Creator.GeometryCreator.CreatePolygonGeometry(cRing, null);
47
48             if (_TerrainRctg == null)
49             {
50                 var nLineColor = 0xFF00FF00;
51                 var nFillColor = 0xBB00FFFF;
52                 var eAltitudeTypeCode = AltitudeTypeCode.ATC_TERRAIN_RELATIVE;
53                 _TerrainRctg = _sgworld.Creator.CreatePolygon(cPolygonGeometry, nLineColor, nFillColor, eAltitudeTypeCode, parentID, "选中区域");
54             }
55             else
56             {
57                 _TerrainRctg.Geometry = cPolygonGeometry;
58             }
59         }       
时间: 2024-10-14 22:44:23

Skyline实现橡皮筋效果绘制矩形框的相关文章

用canvas实现鼠标拖动绘制矩形框

需要用到jCanvas插件和jQuery. jCanvas下载:https://raw.githubusercontent.com/caleb531/jcanvas/master/jcanvas.min.js 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>鼠标拖动绘制矩形框(canvas)</ti

CAD交互绘制矩形框(com接口)

主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE dX2 直线的结束点x坐标 DOUBLE dY2 直线的结束点y坐标 IMxDrawCustomEntity::Draw 把实体绘制到图上.一般用于动态拖放时,在拖放结束时,绘制到图上. c#中实现代码说明: 动态拖放时的绘制事件: private void DrawPathToPolyline()

C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框

最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大概介绍一下原因,GDI画矩形框就不说了,很简单的.这里面最主要的就是滚轮放大和左键移动两个事件,要计算矩形框的坐标位置.下面将代码贴出如下: 先是定义需要的变量,就四个变量. //矩形框坐标        private Rectangle DrawRect = new Rectangle(0, 0

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Android UI2013-05-23 15:04 1600人阅读 评论(1) 收藏 举报 目录(?)[+] http://blog.csdn.net/yanzi1225627/article/details/8580034 最近一直在审视以前做过的东西,关于android摄像头预览,预览界面上呈现矩形框,在

CAD交互绘制带周长面积的矩形框(com接口)

主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE dX2 直线的结束点x坐标 DOUBLE dY2 直线的结束点y坐标 _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dPosX >文字的位置的X坐标 DOUBLE dPosY 文字的位置的Y坐标 BSTR pszText 文字内容字符串 DOUB

【python】PIL 批量绘制图片矩形框工具

工具采用PIL:Python Imaging Library,图像处理标准库.PIL功能非常强大,但API却非常简单易用. 安装PIL 在Debian/Ubuntu Linux下直接通过apt安装 $ sudo apt-get install python-imaging Windows平台直接通过pip安装 pip install pillow 批量工具脚本 默认执行方式为:              执行脚本命令 python drawline.py           1.获取当前路径下的

openlayers之绘制矩形星星拉框放大自定义图形

简介:openlayers绘制矩形.星星.拉框绘制,以及自定义图形. 实际是对ol.interaction.Draw的扩展,geometryFunction属性. 查看详细教程 原文地址:https://www.cnblogs.com/dqygiser/p/9782169.html

玩转Android Camera开发(五):基于Google自带算法实时检测人脸并绘制人脸框(网络首发,附完整demo)

本文主要介绍使用Google自带的FaceDetectionListener进行人脸检测,并将检测到的人脸用矩形框绘制出来.本文代码基于PlayCameraV1.0.0,在Camera的open和preview流程上进行了改动.原先是放在单独线程里,这次我又把它放到Surfaceview的生命周期里进行打开和开预览. 首先要反省下,去年就推出了静态图片的人脸检测demo,当时许诺一周内推出Camera预览实时检测并绘制的demo,结果拖到现在才整.哎,屌丝一天又一天,蹉跎啊.在demo制作过程中

HTML5 在canvas中绘制矩形

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/32930501 一.绘制矩形 canvas使用原点(0,0)在左上角的坐标系统,x坐标向右递增,y坐标向下递增. 使用绘图环境的矩形绘制函数来绘制矩形. fillRect(x,y,width,height) : 绘制一个实心的矩形. strokeRect(x,y,width,height) : 绘制一个空心的矩形. clearRect(x,y,width,height) : 清