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 ...
随机推荐
- Cordova-安装Cordova过程详细解
官方网站Apache Cordova 前提是你电脑上 1:全局安装了Node 2:全局安装了npm 3:安装了java,并配置好环境 4:下载安装好android-sdk,并配好环境,注意安卓虚拟机可 ...
- 项目中nodejs包高效升级插件npm-check-updates
nodejs包高效升级插件npm-check-updates 最近想升级npm的包 1.//常规的包升级方式/2.npm update (包) 到npm一搜发现了一个很好的升级工具 npm-check ...
- 2django 视图与网址进阶
一.在网页中做加减法 采用/add/?a=11&b=22这样get方法进行 django-admin.py startproject zqxt_views cd zqxt_views pyth ...
- java 类中定义接口的调用方法
public class Human { public interface MyAction { public void getPower(); } } public class Test{ publ ...
- ThinkPHP中Widget的两种写法及调用
Widget扩展一般用于页面组件的扩展,在页面根据需要输出不同的内容,下面介绍一下ThinkPHP中Widget的两种写法及调用 写法一: ArticlWidget.class.php文件: clas ...
- iOS JSON 和 Mode l转换
MJExtension 是我们项目开发常用的一个第三方框架 很好用. https://github.com/CoderMJLee/MJExtension 映射 json value key 直 ...
- Android系统篇之—-编写简单的驱动程序并且将其编译到内核源码中【转】
本文转载自:大神 通过之前的一篇文章,我们了解了 Android中的Binder机制和远程服务调用 在这篇文章中主要介绍了Android中的应用在调用一些系统服务的时候的原理,那么接下来就继续来介绍一 ...
- Charles进行HTTPS抓包(iOS为例)
各种抓包工具的原理都是一样的,使用方面也都是差不多的,因为最近在用Mac,所以抓包工具开始用Charles了,记录一下抓取HTTPS的步骤. 连接代理, 开启抓包工具, 手机设置代理服务器,端口号(默 ...
- java的远程访问接口的实例
被别人远程调用和自己远程调用别人接口的理解: 被别人调用接口:其实没有什么神秘的,就是我们写一个正常的方法提供一个访问路径. 调用别人的接口:本质时一个Request请求,实际要使用到javax.ne ...
- Native App vs Web App 以及 Hybrid App的实现原理
移动应用基本的三种类型 1) Native 应用程序 2) Web 应用程序 3) 混合应用程序(Hybrid: Native应用和web应用结合) Native 应用 直接运行在电脑上或者智能 ...