29.Silverlight碰撞测试、检测自定义控件碰撞,雷达扫描图之扫描雷达点状态
雷达扫描图中当雷达指针转动扫描到某一个点上的时候,判断这个点的CPU值是否已经超过60的警戒位置如果超过将此点设置为红色。
在Silverlight中我们的雷达指针是一直在做圆运动的,我们要随时检测雷达指针的位置,以及雷达是否碰撞到一个Device设备了。如果碰撞到 了,就检测设备CPU值为多少?在这里我们需要解决两个问题。第一、如何随时观测雷达指针的当前位置?第二、如何检测雷达指针是否碰撞接触到了设备点?
针对第一个问题,需要做以下处理:
•在本例中使用Timer控件,每隔50毫秒检测一次当前的雷达指针控件位置
•雷达指针的位置根据检测当前雷达指针旋转角度的正余弦函数得到左上角点的X、Y位置,分别加上宽和高得到右下角点的位置。
•在本实例中的碰撞检测函数是根据国外友人Andy的两个函数改编而来的,UserControlBounds函数里面获取Point的方式有所不同。
针对第二个问题,我们需要做以下处理:
•根据雷达指针的左上角和右下角的两个点的位置构造一个Rect结构A(注意Rect结构描述矩形的宽高和原点),然后同理根据Device自定义控件构造一个Rect结构。
•检测者A、B两个Rect是否重合,如果重合则进行像素级别的对比是否碰撞接触在一起。
•因为有很多个设备点,所以需要循环检测每一个设备点在某一个时间点是否和雷达指针碰撞。
本篇实例源码基于上一节所述,本节中将雷达指针单独制作成为一个自定义控件,另外为设备自定义控件增加了一个属性IsOutStrip(设置如果超过警戒值则为红色),现在我们来看看本篇关键源码:
- public MainPage()
- {
- InitializeComponent();
- AddCanvasTransform();
- }
- RandarPointer rpointer = new RandarPointer();
- public void AddCanvasTransform()
- {
- AddDevice();
- //设置一个50毫秒启动一次的定时器
- time = new Timer(CheckIsContent, rpointer, 0, 50);
- }
- private void AddDevice()
- {
- #region 添加闪动的设备
- LayoutRoot.Children.Clear();
- //添加雷达指针
- LayoutRoot.Children.Add(rpointer);
- for (int i = 0; i < 15; i++)
- {
- Device dev = new Device();
- //设置X、Y坐标和Z层次
- dev.SetValue(Canvas.TopProperty, dev.Y);
- dev.SetValue(Canvas.LeftProperty, dev.X);
- //设置 dev.Tag为控件的左上角的点坐标和右下角的点坐标
- double DevRight = dev.X + 16;
- double DevButtom = dev.Y + 16;
- dev.SetValue(Canvas.ZIndexProperty, 600);
- dev.Tag = dev.X + "|" + dev.Y + "|" + DevRight + "|" + DevButtom;
- LayoutRoot.Children.Add(dev);
- }
- #endregion
- }
- //添加一个Timer定时器检测当前的指针的位置。
- Timer time;
- public void CheckIsContent(object state)
- {
- this.rpointer.Dispatcher.BeginInvoke(new labelDelegete(UpdateLab));
- }
- public delegate void labelDelegete();
- public void UpdateLab()
- {
- Rectangle rectangle = rpointer.FindName("rectangle") as Rectangle;
- //获取到当前雷达指针的左上角点的位置和右下角点的位置,赋值给Tag
- double top = -Math.Sin(rpointer.rTransform.Angle) * 253 + 300;
- double left = -Math.Cos(rpointer.rTransform.Angle) * 253 + 300;
- double right = 300;
- double buttom = 300;
- rpointer.Tag = left + "|" + top + "|" + right + "|" + buttom;
- //循环获取所有的Device控件的位置和当前时间雷达指针是否碰撞
- foreach (UIElement ui in LayoutRoot.Children)
- {
- Device device = ui as Device;
- if (device != null)
- {
- Rectangle rectangleblue = device.Rectangleblue;
- //检测雷达指针是否碰撞到设备,
- if (CheckCollision(device, rectangleblue, rpointer, rectangle))
- {
- //检测设备CPU占用值是否大于60%,如果大于则报警
- if (device.Value > 60)
- {
- //让其显示为红色
- device.IsOutStrip = true;
- }
- }
- }
- }
- }
- /// <summary>
- /// 检查控件的位置是否碰撞在一起
- /// </summary>
- /// <param name="control1">第一用户控件</param>
- /// <param name="controlElem1">第一用户控件内部需要检测是否碰撞的控件</param>
- /// <param name="control2">第二用户控件</param>
- /// <param name="controlElem2">第二用户控件内部需要检测是否碰撞的控件</param>
- /// <returns></returns>
- private bool CheckCollision(FrameworkElement control1, FrameworkElement controlElem1, FrameworkElement control2, FrameworkElement controlElem2)
- {
- // 创建两个Rect结构
- Rect rect1 = UserControlBounds(control1);
- Rect rect2 = UserControlBounds(control2);
- //检测这两个Rect结构是否重合
- rect1.Intersect(rect2);
- if (rect1 == Rect.Empty)
- {
- // no collision - GET OUT!
- return false;
- }
- else
- {
- bool bCollision = false;
- Point ptCheck = new Point();
- // 更精准的像素级别的碰撞对比
- for (int x = Convert.ToInt32(rect1.X); x < Convert.ToInt32(rect1.X + rect1.Width); x++)
- {
- for (int y = Convert.ToInt32(rect1.Y); y < Convert.ToInt32(rect1.Y + rect1.Height); y++)
- {
- ptCheck.X = x;
- ptCheck.Y = y;
- List<UIElement> hits = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(ptCheck, control1) as List<UIElement>;
- if (hits.Contains(controlElem1))
- {
- // we have a hit on the first control elem, now see if the second elem has a similar hit
- List<UIElement> hits2 = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(ptCheck, control2) as List<UIElement>;
- if (hits2.Contains(controlElem2))
- {
- bCollision = true;
- break;
- }
- }
- }
- if (bCollision) break;
- }
- return bCollision;
- }
- }
- /// <summary>
- /// 根据需要检测的控件的坐标位置,绘制出需要检测控件的副本Rect控件
- /// </summary>
- /// <param name="control"></param>
- /// <returns></returns>
- public Rect UserControlBounds(FrameworkElement control)
- {
- //重新创建一个Rect结构。
- string[] PointDirect = control.Tag.ToString().Split('|');
- Point ptTopLeft = new Point(Convert.ToDouble(PointDirect[0]), Convert.ToDouble(PointDirect[1]));
- Point ptBottomRight = new Point(Convert.ToDouble(PointDirect[2]), Convert.ToDouble(PointDirect[3]));
- return new Rect(ptTopLeft, ptBottomRight);
- }
本实例采用VS2010+Silverlight编写,如需源码点击 SLRandarHitTest.rar 下载,点击下图可查看Silverlight运行效果:
本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/822552
29.Silverlight碰撞测试、检测自定义控件碰撞,雷达扫描图之扫描雷达点状态相关推荐
- Silverlight实用窍门系列:29.Silverlight碰撞测试、检测自定义控件碰撞,雷达扫描图之扫描雷达点状态【附带源码实例】...
雷达扫描图中当雷达指针转动扫描到某一个点上的时候,判断这个点的CPU值是否已经超过60的警戒位置如果超过将此点设置为红色. 在Silverlight中我们的雷达指针是一直在做圆运动的,我们要随时检测雷 ...
- 27.Silverlight二维旋转+平面渐变+动画,模拟雷达扫描图之基本框架
在现实生活中的雷达运行扫描到物体的某一些属性(比如:速度,频率)超过安全范围值将会报警.在实际的某一些项目中(比如监控系统),我们也想制作一个雷达扫描图来模拟扫描各种设备那么应该如何做呢? 我们将各种 ...
- Silverlight实用窍门系列:27.Silverlight二维旋转+平面渐变+动画,模拟雷达扫描图之基本框架【附带源码实例】...
在现实生活中的雷达运行扫描到物体的某一些属性(比如:速度,频率)超过安全范围值将会报警.在实际的某一些项目中(比如监控系统),我们也想制作一个雷达扫描图来模拟扫描各种设备那么应该如何做呢? 我们将各种 ...
- Silverlight实用窍门系列:28.Silverlight制作随机分布雷达扫描点,模拟雷达扫描图之被扫描设备【附带源码实例】...
实际项目中,我们模拟一个监控多台电脑的雷达扫描图效果.我们假设发现了很多台设备,这些设备具有CPU使用率这个属性,在雷达扫描的时候,如果CPU的值高于90则报警为红色. 本节实例建立在上一节的基础之上 ...
- 2018年9月柳叶刀杂志 深度学习技术解决肺炎分类检测问题 高分辨率CT扫描图 病例队列研究 翻译
Deep learning for classifying fibrotic lung disease on high-resolutino computed tomography: a case-c ...
- 【SOAR】使用Soar自动化检测Host碰撞
前言 在之前,各位大师傅对Host碰撞进行了很多讨论.那么Host碰撞怎么使用SOAR扫描器来进行探测呢?本文主要讨论一下使用SOAR去做Host碰撞的一个实现方法. 什么Host碰撞? 火线Zone ...
- Unity 2D检测物体碰撞
文章目录 添加物理脚本 使用脚本检测碰撞 添加物理脚本 Unity2D中,检测物体碰撞首相要给物体添加两个属性分别是: rigibody和collider,刚体和碰撞器. collider有不同的形状 ...
- 假定在使用CSMA/CD协议的10Mb/s以太网中某个站在发送数据时检测到碰撞,执行退避算法时选择了随机数r=100。试问这个站需要等待多长时间后才能再次发送数据?如果是100Mb
假定在使用CSMA/CD协议的10Mb/s以太网中某个站在发送数据时检测到碰撞,执行退避算法时选择了随机数r=100.试问这个站需要等待多长时间后才能再次发送数据?如果是100Mb/s的以太网呢? 以 ...
- ROS 教程2 机器人雷达建图 蒙特卡洛定位 导航 路径规划 仿真
ros 机器人雷达建图 蒙特卡洛定位 导航 路径规划 仿真 move_base gmapping acml 博文github 一.安装 turtlebot 移动机器人底座 进行导航 1.安装系统依赖 ...
最新文章
- git生成ssh keys步骤与使用
- Powershell 如何批量获取文件大小的实现代码
- Codeforces 861D - Polycarp's phone book 字典树/hash
- Windows Runtime (RT)
- HashTable 基础
- Dockerfile制作自定义镜像
- 【Merry Christmas】圣诞节,给博客添加浪漫的下雪效果!
- 2个dataframe,df1的每一列分别乘以df2的某一列
- 【iPod转换精灵V10.2 官方最新版】强大的视频转换功能
- 如何设置内网和外网同时使用
- matlab乘除号怎么打,matlab中的乘除法
- 【GNN报告】Mila实验室/蒙特利尔大学朱兆成:基于图神经网络的知识图谱推理
- 少吃柿子、山楂、黑枣,警惕鞣酸
- 【Basic Algebra】群论学习整理
- 计算机按硬件组合及用途分为,计算机基础.doc
- HTML 版本声明 DOCTYPE 标签
- Android Studio 快捷键大全
- 怎么给图片名称快速重命名?来跟我学着两个实用方法
- 无多普勒频移的海底混响单元散射模型卷积法
- python 典型变量分析