Skyline实现橡皮筋效果绘制矩形框
这种类似于框选的效果用的比较普遍,一般三维平台和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实现橡皮筋效果绘制矩形框的更多相关文章
- 用canvas实现鼠标拖动绘制矩形框
需要用到jCanvas插件和jQuery. jCanvas下载:https://raw.githubusercontent.com/caleb531/jcanvas/master/jcanvas.mi ...
- CAD交互绘制矩形框(网页版)
主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE ...
- CAD交互绘制矩形框(com接口)
主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE ...
- Opencv在视频中静态、动态方式绘制矩形框ROI
Opencv视频处理中的目标跟踪经常用到要在视频上画一个矩形框ROI,标注出要跟踪的物体,这里介绍两种在视频中绘制矩形框的方法,一种是"静态的",一种是"动态的" ...
- 如何用 matlab 在图片上绘制矩形框 和 添加文字 ?
如何给图像添加矩形框?以及添加想要输入的文字 ? 案例程序,如下所示: clc; close all; clear all;image = imread('/home/wangxiao/Picture ...
- C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框
最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...
- opencv::轮廓周围绘制矩形框和圆形框
基于RDP算法实现,目的是减少多边形轮廓点数 approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool ...
- Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)
Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Androi ...
- CAD交互绘制带周长面积的矩形框(网页版)
主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY1 直线的开始点y坐标 DOUBLE ...
随机推荐
- activiti基础--2----------------------(流程定义)
Deployment 部署对象 1.一次部署的多个文件信息,对于不需要的流程可以删除和修改 2.对应的表 act_re_deployment #部署对象表 act_re_procdef #流程定义表 ...
- mysql怎么在已建好的表中添加自增序列
alter table 表明 change id id int not null auto_increment unique;
- Python程序打包成exe的一些坑
今天写了一个项目,Python项目,需要在win7上跑起来,我想,这不是简单的不行么,直接上Pyinstaller不就完了? 但是后来,我发觉我真是too young too simple. 为什么这 ...
- iOS9 - 采用3D Touch
iPhone 6s/6s Plus提供了触摸屏的另一个维度的操作手势-3D Touch,通常有下面两种应用场景: 在主屏幕上重按APP图标可以提供进入APP特定功能的快捷菜单 在APP内部,可以通过重 ...
- Java多线程系列 JUC线程池05 线程池原理解析(四)
转载 http://www.cnblogs.com/skywang12345/p/3544116.html https://blog.csdn.net/programmer_at/article/d ...
- P4022 [CTSC2012]熟悉的文章
题目 P4022 [CTSC2012]熟悉的文章 题目大意:多个文本串,多个匹配串,我们求\(L\),\(L\)指(匹配串中\(≥L\)长度的子串出现在文本串才为"熟悉",使得匹配 ...
- Ubuntu下,grep的用法
grep(Global search Regular Expression and Print out the line)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.U ...
- 暑假集训第一周比赛G题
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83146#problem/G G - 向 Crawling in process... C ...
- 算法(Algorithms)第4版 练习 2.2.10
关键代码实现: private static void merge(Comparable[] input, int lo, int mid, int hi) { //copy input[lo,mid ...
- Netty使用LineBasedFrameDecoder解决TCP粘包/拆包
TCP粘包/拆包 TCP是个”流”协议,所谓流,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TC ...