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

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

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

         //计算矩形对角点的夹角
private double GetAngle(IPosition6 Poi)
{
var includeAngle = _sgworld.CoordServices.GetAimingAngles(_Position, Poi);
var angle = includeAngle.Yaw - - _Position.Yaw;
return (angle / * 3.14);
}

其他主要代码抄录如下:

         SGWorld _sgworld = Application3D.SGworld;
private ITerrainPolygon6 _TerrainRctg;
private IPosition6 _Position;
public ITerrainPolygon6 TerrainRectangle
{
get { return _TerrainRctg; }
} //左键开始绘制长方形
public bool OnLButtonDown(int Flags, int X, int Y)
{
if(_Position ==null)
{
var wpi = _sgworld.Window.PixelToWorld(X, Y, WorldPointType.WPT_DEFAULT);
_Position = wpi.Position;
_Position.Yaw = _sgworld.Navigate.GetPosition(AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE).Yaw;
}
else
{
//第二次点击结束绘制
FinshEdit();
}
return false;
} //鼠标移动
public void OnFrame()
{
//创建或更新长方形
if (_Position == null) return; var mi = _sgworld.Window.GetMouseInfo();
var position = _sgworld.Window.PixelToWorld(mi.X, mi.Y, WorldPointType.WPT_DEFAULT).Position;
var length = _Position.DistanceTo(position);
35 var angle = GetAngle(position);
36 var width = Math.Sin(angle) * length; /*这里矩形的宽就得到了*/ var poi1 = _Position.Move(width * -1, _Position.Yaw, 0); /*两个对角点沿摄像机方向延伸一个宽度*/
var poi2 = position.Move(width, _Position.Yaw, 0); 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); if (_TerrainRctg == null)
{
var nLineColor = 0xFF00FF00;
var nFillColor = 0xBB00FFFF;
var eAltitudeTypeCode = AltitudeTypeCode.ATC_TERRAIN_RELATIVE;
_TerrainRctg = _sgworld.Creator.CreatePolygon(cPolygonGeometry, nLineColor, nFillColor, eAltitudeTypeCode, parentID, "选中区域");
}
else
{
_TerrainRctg.Geometry = cPolygonGeometry;
}
}

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

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

    需要用到jCanvas插件和jQuery. jCanvas下载:https://raw.githubusercontent.com/caleb531/jcanvas/master/jcanvas.mi ...

  2. CAD交互绘制矩形框(网页版)

    主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE ...

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

    主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE ...

  4. Opencv在视频中静态、动态方式绘制矩形框ROI

    Opencv视频处理中的目标跟踪经常用到要在视频上画一个矩形框ROI,标注出要跟踪的物体,这里介绍两种在视频中绘制矩形框的方法,一种是"静态的",一种是"动态的" ...

  5. 如何用 matlab 在图片上绘制矩形框 和 添加文字 ?

    如何给图像添加矩形框?以及添加想要输入的文字 ? 案例程序,如下所示: clc; close all; clear all;image = imread('/home/wangxiao/Picture ...

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

    最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...

  7. opencv::轮廓周围绘制矩形框和圆形框

    基于RDP算法实现,目的是减少多边形轮廓点数 approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool ...

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

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

  9. CAD交互绘制带周长面积的矩形框(网页版)

    主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE ...

随机推荐

  1. go语言之并发编程 channel

    前面介绍了goroutine的用法,如果有多个goroutine的话相互之间是如何传递数据和通信的呢.在C语言或者JAVA中,传输的方法包括共享内存,管道,信号.而在Go语言中,有了更方便的方法,就是 ...

  2. android控件层次

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  3. 自编码器(autoencoder)

    今天我们会来聊聊用神经网络如何进行非监督形式的学习. 也就是 autoencoder, 自编码. 压缩与解压 有一个神经网络, 它在做的事情是 接收一张图片, 然后 给它打码, 最后 再从打码后的图片 ...

  4. Javascript中闭包的个人理解

       Javascript的一个特殊点就在于它的闭包和回调特性,这两个特性让初学Javascript的我是云里雾里,至今仍在苦苦摸索与理解.在一番苦思之后,整理了一下资料,将自己的理解思路记录下来,以 ...

  5. 【leetcode刷题笔记】Same Tree

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  6. 【leetcode】Balanced Binary Tree

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  7. MySQL的进程状态

    通过show processlist查看MySQL的进程状态,在State列上面的状态有如下这些: Analyzing线程对MyISAM 表的统计信息做分析(例如, ANALYZE TABLE ).c ...

  8. MHA高可用集群安装配置

    4台服务器 192.168.136.128 主 192.168.136.129 从 192.168.136.130 从 192.168.136.131 管理服务器 一主2从,一管理,安装mysql并配 ...

  9. 总结最近写的h5项目

    其实最近最大的感触就是真正独立完结一个项目的人学到的东西是最多,但并不意味着自己已全部吸收,还是得消化消化 最近做了一个移动端的h5页面,感兴趣的可以访问看一看:http://app.500jia.c ...

  10. Confluence 6 恢复一个空间的问题解决

    如果你在导入的时候遇到了问题,检查下面的一些提示. 你的文件太大而不能上传?这个是非常常见的错误.出现的原因是备份文件不能在规定的时间内上传到服务器上.为了避免这个错误,放置你的导出文件到  < ...