29.Silverlight碰撞测试、检测自定义控件碰撞,雷达扫描图之扫描雷达点状态

简介:

     雷达扫描图中当雷达指针转动扫描到某一个点上的时候,判断这个点的CPU值是否已经超过60的警戒位置如果超过将此点设置为红色。

        在Silverlight中我们的雷达指针是一直在做圆运动的,我们要随时检测雷达指针的位置,以及雷达是否碰撞到一个Device设备了。如果碰撞到 了,就检测设备CPU值为多少?在这里我们需要解决两个问题。第一、如何随时观测雷达指针的当前位置?第二、如何检测雷达指针是否碰撞接触到了设备点?

        针对第一个问题,需要做以下处理:

             •在本例中使用Timer控件,每隔50毫秒检测一次当前的雷达指针控件位置

             •雷达指针的位置根据检测当前雷达指针旋转角度的正余弦函数得到左上角点的X、Y位置,分别加上宽和高得到右下角点的位置。

             •在本实例中的碰撞检测函数是根据国外友人Andy的两个函数改编而来的,UserControlBounds函数里面获取Point的方式有所不同。

        针对第二个问题,我们需要做以下处理:

             •根据雷达指针的左上角和右下角的两个点的位置构造一个Rect结构A(注意Rect结构描述矩形的宽高和原点),然后同理根据Device自定义控件构造一个Rect结构。

             •检测者A、B两个Rect是否重合,如果重合则进行像素级别的对比是否碰撞接触在一起。

             •因为有很多个设备点,所以需要循环检测每一个设备点在某一个时间点是否和雷达指针碰撞。

        本篇实例源码基于上一节所述,本节中将雷达指针单独制作成为一个自定义控件,另外为设备自定义控件增加了一个属性IsOutStrip(设置如果超过警戒值则为红色),现在我们来看看本篇关键源码:

 


 
 
  1. public MainPage() 
  2. InitializeComponent(); 
  3.  
  4. AddCanvasTransform(); 
  5. RandarPointer rpointer = new RandarPointer(); 
  6. public void AddCanvasTransform() 
  7.  
  8. AddDevice(); 
  9. //设置一个50毫秒启动一次的定时器 
  10. time = new Timer(CheckIsContent, rpointer, 0, 50); 
  11.  
  12. private void AddDevice() 
  13. #region 添加闪动的设备 
  14. LayoutRoot.Children.Clear(); 
  15. //添加雷达指针 
  16. LayoutRoot.Children.Add(rpointer); 
  17. for (int i = 0; i < 15; i++) 
  18. Device dev = new Device(); 
  19. //设置X、Y坐标和Z层次 
  20. dev.SetValue(Canvas.TopProperty, dev.Y); 
  21. dev.SetValue(Canvas.LeftProperty, dev.X); 
  22.  
  23. //设置 dev.Tag为控件的左上角的点坐标和右下角的点坐标 
  24. double DevRight = dev.X + 16; 
  25. double DevButtom = dev.Y + 16; 
  26. dev.SetValue(Canvas.ZIndexProperty, 600); 
  27. dev.Tag = dev.X + "|" + dev.Y + "|" + DevRight + "|" + DevButtom; 
  28. LayoutRoot.Children.Add(dev); 
  29. #endregion 
  30. //添加一个Timer定时器检测当前的指针的位置。 
  31. Timer time
  32. public void CheckIsContent(object state) 
  33. this.rpointer.Dispatcher.BeginInvoke(new labelDelegete(UpdateLab)); 
  34.  
  35. public delegate void labelDelegete(); 
  36. public void UpdateLab() 
  37. Rectangle rectangle = rpointer.FindName("rectangle"as Rectangle; 
  38. //获取到当前雷达指针的左上角点的位置和右下角点的位置,赋值给Tag 
  39. double top = -Math.Sin(rpointer.rTransform.Angle) * 253 + 300; 
  40. double left = -Math.Cos(rpointer.rTransform.Angle) * 253 + 300; 
  41. double right = 300; 
  42. double buttom = 300; 
  43. rpointer.Tag = left + "|" + top + "|" + right + "|" + buttom; 
  44.  
  45. //循环获取所有的Device控件的位置和当前时间雷达指针是否碰撞 
  46. foreach (UIElement ui in LayoutRoot.Children) 
  47. Device device = ui as Device; 
  48. if (device != null
  49. Rectangle rectangleblue = device.Rectangleblue; 
  50. //检测雷达指针是否碰撞到设备, 
  51. if (CheckCollision(device, rectangleblue, rpointer, rectangle)) 
  52. //检测设备CPU占用值是否大于60%,如果大于则报警 
  53. if (device.Value > 60) 
  54. //让其显示为红色 
  55. device.IsOutStrip = true
  56. /// <summary> 
  57. /// 检查控件的位置是否碰撞在一起 
  58. /// </summary> 
  59. /// <param name="control1">第一用户控件</param> 
  60. /// <param name="controlElem1">第一用户控件内部需要检测是否碰撞的控件</param> 
  61. /// <param name="control2">第二用户控件</param> 
  62. /// <param name="controlElem2">第二用户控件内部需要检测是否碰撞的控件</param> 
  63. /// <returns></returns
  64. private bool CheckCollision(FrameworkElement control1, FrameworkElement controlElem1, FrameworkElement control2, FrameworkElement controlElem2) 
  65. // 创建两个Rect结构 
  66. Rect rect1 = UserControlBounds(control1); 
  67. Rect rect2 = UserControlBounds(control2); 
  68.  
  69. //检测这两个Rect结构是否重合 
  70. rect1.Intersect(rect2); 
  71. if (rect1 == Rect.Empty) 
  72. // no collision - GET OUT
  73. return false
  74. else 
  75. bool bCollision = false
  76. Point ptCheck = new Point(); 
  77.  
  78. // 更精准的像素级别的碰撞对比 
  79. for (int x = Convert.ToInt32(rect1.X); x < Convert.ToInt32(rect1.X + rect1.Width); x++) 
  80. for (int y = Convert.ToInt32(rect1.Y); y < Convert.ToInt32(rect1.Y + rect1.Height); y++) 
  81. ptCheck.X = x; 
  82. ptCheck.Y = y; 
  83.  
  84. List<UIElement> hits = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(ptCheck, control1) as List<UIElement>; 
  85. if (hits.Contains(controlElem1)) 
  86. // we have a hit on the first control elem, now see if the second elem has a similar hit 
  87. List<UIElement> hits2 = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(ptCheck, control2) as List<UIElement>; 
  88. if (hits2.Contains(controlElem2)) 
  89. bCollision = true
  90. break; 
  91. if (bCollision) break; 
  92. return bCollision; 
  93. /// <summary> 
  94. /// 根据需要检测的控件的坐标位置,绘制出需要检测控件的副本Rect控件 
  95. /// </summary> 
  96. /// <param name="control"></param> 
  97. /// <returns></returns
  98. public Rect UserControlBounds(FrameworkElement control) 
  99. //重新创建一个Rect结构。 
  100. string[] PointDirect = control.Tag.ToString().Split('|'); 
  101. Point ptTopLeft = new Point(Convert.ToDouble(PointDirect[0]), Convert.ToDouble(PointDirect[1])); 
  102. Point ptBottomRight = new Point(Convert.ToDouble(PointDirect[2]), Convert.ToDouble(PointDirect[3])); 
  103.  
  104. return new Rect(ptTopLeft, ptBottomRight); 

        本实例采用VS2010+Silverlight编写,如需源码点击 SLRandarHitTest.rar  下载,点击下图可查看Silverlight运行效果:



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/822552

相关文章
|
2月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
71 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
7月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
7月前
|
NoSQL 算法 大数据
国内首个图计算标准发布,悦数图数据库通过测试
近日,经中国通信标准化协会批准,《大数据图计算平台技术要求与测试方法》标准正式发布,这是我国首个图计算平台标准,为图计算平台的发展提供了一个标准化的指导方针,对于推动我国图技术的发展具有重要意义。
|
2月前
|
安全 网络安全
Kali渗透测试:使用Armitage扫描网络
Kali渗透测试:使用Armitage扫描网络
61 3
|
2天前
|
算法 数据挖掘 测试技术
犬类癌症检测(CANDiD)研究:使用独立测试集对1000多只犬进行基于高通量测序的多癌种早期检测"液体活检"血液测试的临床验证
这项研究首次在大规模独立测试集上验证了基于NGS的液体活检在犬类多癌种检测中的应用。该方法具有很高的特异性,可以作为一种新的无创癌症筛查和辅助诊断工具。通过早期发现癌症,有望改善犬类癌症的诊断和管理模式。
26 12
|
2月前
|
机器学习/深度学习 JSON 算法
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-Seg模型进行图像分割的完整流程,包括图像分割的基础知识、YOLOv5-Seg模型的特点、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。通过实例代码,指导读者从自定义数据集开始,直至模型的测试验证,适合深度学习领域的研究者和开发者参考。
771 3
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
|
3月前
|
人工智能 计算机视觉
AI计算机视觉笔记十五:编写检测的yolov5测试代码
该文为原创文章,如需转载,请注明出处。本文作者在成功运行 `detect.py` 后,因代码难以理解而编写了一个简易测试程序,用于加载YOLOv5模型并检测图像中的对象,特别是“人”类目标。代码实现了从摄像头或图片读取帧、进行颜色转换,并利用YOLOv5进行推理,最后将检测框和置信度绘制在输出图像上,并保存为 `result.jpg`。如果缺少某些模块,可使用 `pip install` 安装。如涉及版权问题或需获取完整代码,请联系作者。
|
3月前
|
安全 测试技术 数据库
华测检测软件登记测试
软件产品登记测试由检测机构根据委托方提供的材料,验证软件功能是否正常运行。自2000年起,测试报告可用于增值税退税、双软认证评估及高新企业认定等。测试涵盖应用、嵌入式、数据库及系统软件等,依据GB/T 25000.51-2016标准,确保软件质量并提升产品销售力及企业信任度。由具备CNAS及CMA资质的CTI华测检测提供专业服务,涵盖通用应用软件测评、APP安全检测及信息安全服务等多个方向。
|
5月前
|
SQL 安全 网络协议
网络扫描与渗透测试基础
【7月更文挑战第12天】网络扫描与渗透测试是保障网络安全的重要手段,通过模拟黑客攻击的方式,发现潜在的安全漏洞,并提供修复建议,为系统安全保驾护航。在网络安全日益重要的今天,掌握网络扫描与渗透测试技术对于企业和组织来说至关重要。希望本文能够为读者提供有益的参考和借鉴。
|
7月前
|
机器学习/深度学习 数据采集 人工智能
人工智能,应该如何测试?(四)模型全生命周期流程与测试图
本文补充了完整的业务和测试流程,包括生命周期流程图,强调测试人员在模型测试中的角色。主要测试活动有:1) 离线模型测试,使用训练集、验证集和测试集评估模型;2) 线上线下一致性测试,确保特征工程的一致性;3) A/B Test,逐步替换新旧模型以观察效果;4) 线上模型监控,实时跟踪用户行为变化;5) 数据质量测试,验证新数据质量以防影响模型效果。