这种类似于框选的效果用的比较普遍,一般三维平台和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. hdoj 1455 Sticks 【dfs】

    题意:找最短的木棍可以组成的长度, hdoj  1518 的加强版 代码: #include <stdio.h> #include <string.h> #include &l ...

  2. pinpoint改造支持查询

    原架构 改造后架构

  3. 【leetcode刷题笔记】Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  4. 狄利克雷卷积&莫比乌斯反演

    昨天刚说完不搞数论了,刚看到一个\(gcd\)的题目dalao用这个做了,虽然比正解麻烦,还是打算学一学了 数论函数: 数论函数的定义: 数论函数亦称算术函数,一类重要的函数,指定义在正整数集上的实值 ...

  5. BootStrap实现左侧或右侧竖式tab选项卡

    BootStrap实现左侧或右侧竖式tab选项卡 代码如下: <div style="height: 100px;"> <div class="col- ...

  6. new的越界访问

    今天敲代码的时候发现了一个BUG和大家分享一下,希望大家下次不要犯和我一样的错误. 如果犯了和我一样的错,也能知道自己错在哪里!   <(^-^)> 函数如下:(斐波那契数列的实现) lo ...

  7. 大话设计模式--解释器模式 interpreter -- C++实现实例

    1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...

  8. Python- Anacoda环境使用Selenium+ChromeDriver报错

    我的系统是win10,python是用Anacoda安装的,通过pip安装了selenium 后使用Chromedriver发现报错,pip安装selenium如下: pip install sele ...

  9. jmeter--轻量级接口自动化测试框架

    大致思路: jmeter完成接口脚本,Ant完成脚本执行并收集结果生成报告,最后利用jenkins完成脚本的自动集成运行. 环境安装: 1.jdk1.7 配置环境变量(参考前面的分页) 2.jmete ...

  10. 百度编辑器ueditor的toolbars的各个元素代表的功能说明

    百度编辑器ueditor的toolbars的各个元素代表的功能说明