WPF 实现星空效果

本文经原作者授权以原创方式二次分享,欢迎转载、分享。

原文作者:普通的地球人

原文地址:https://www.cnblogs.com/tsliwei/p/6282183.html

Github地址:https://github.com/WPFDevelopersOrg/WPFDevelopers

效果

  • 前阵子看到ay的蜘蛛网效果和知乎的登录页背景,觉得效果很酷.自己也想写一个.于是写着写着就变成这样了.少女梦幻的赶脚有木有.我这有着一颗少女心的抠脚大汉;

实现思路分为两个部分:

1)星星无休止的漫游;

2)星星之间的连线;

  • 星星和连线非别放到两个容器里,以便分开操作;

星星
  • 把星星的运动分解为X轴和Y轴两个不相干的运动,分别操作.操作就是随机生成一个速度,随机生成一个时间.运动完之后再随机生成一个速度,随机生成一个时间......无限循环;

  • 星星的旋转也是同样的道理;

连线
  • 首先解释下连线的规则.两个星星之间连线,每个星星都有一个连线的势力范围,就是宽度乘以连线倍率,这个连线倍率可以在窗体设置.当两个势力范围有交集的时候,就连线;

  • 例:星1宽度5,星2宽度10,连线倍率是3,那么这两个星星的距离小于5*3+10*3=45时就连线,大于45时断开.如果连线倍率设置为4,则两个星星减的距离小于5*4+10*4=60时连线,大于60时断开;

实现与资源占有率

  • 星星运动的实现有两种:

1)基于GridTranslateTransformDoubleAnimation动画控制星星的位移.

2)基于Canvas通过帧动画控制CanvasX,Y.

连线的实现也有两种:

1)简单粗暴.在每一帧都清空连线容器.然后双层循环星星,重新连接所有星星(符合连线规则的).

2)在每一帧循环连线,判断连线规则.符合就改变此连线的X1,Y1,X2,Y2而不去重新new连线.不符合规则的就移除.然后依然是双层循环星星,看符合规则的两个星星间有没有连线,没有的就new一个.

众所周知,WPF做这种动画资源占有率还是比较高的,写了这么多实现,也是因为这个.

大体上还是基于Canvas的实现占用资源稍低.但也有个问题,如果给星星再加一个模糊效果的话,基于Canvas实现的资源占有率不会飙升,而是帧数明显降低.(也可能是我电脑环境的原因)

并不能说那种实现好与坏,可能具体运行环境不一样,参数设置不一样,每种实现都有不同的表现.

然后关于资源占有率问题,以我目前的水平,就只能到这了.博友们自己取舍吧.

源码如下

1)StarrySky.cs代码如下;

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;namespace WPFDevelopers.Controls
{[TemplatePart(Name = GridTemplateName, Type = typeof(Grid))][TemplatePart(Name = CanvasTemplateName, Type = typeof(Canvas))]public class StarrySky : Control{private const string GridTemplateName = "PART_GridLineContainer";private const string CanvasTemplateName = "PART_CanvasStarContainer";private Grid _grid;private Canvas _canvas;public static readonly DependencyProperty StarCountProperty =DependencyProperty.Register("StarCount", typeof(int), typeof(StarrySky), new UIPropertyMetadata(10));public static readonly DependencyProperty StarSizeMinProperty =DependencyProperty.Register("StarSizeMin", typeof(int), typeof(StarrySky), new UIPropertyMetadata(5));public static readonly DependencyProperty StarSizeMaxProperty =DependencyProperty.Register("StarSizeMax", typeof(int), typeof(StarrySky), new UIPropertyMetadata(20));public static readonly DependencyProperty StarVMinProperty =DependencyProperty.Register("StarVMin", typeof(int), typeof(StarrySky), new UIPropertyMetadata(10));public static readonly DependencyProperty StarVMaxProperty =DependencyProperty.Register("StarVMax", typeof(int), typeof(StarrySky), new UIPropertyMetadata(20));public static readonly DependencyProperty StarRVMinProperty =DependencyProperty.Register("StarRVMin", typeof(int), typeof(StarrySky), new UIPropertyMetadata(90));public static readonly DependencyProperty StarRVMaxProperty =DependencyProperty.Register("StarRVMax", typeof(int), typeof(StarrySky), new UIPropertyMetadata(360));public static readonly DependencyProperty LineRateProperty =DependencyProperty.Register("LineRate", typeof(int), typeof(StarrySky), new UIPropertyMetadata(3));private readonly Random _random = new Random();private StarInfo[] _stars;static StarrySky(){DefaultStyleKeyProperty.OverrideMetadata(typeof(StarrySky),new FrameworkPropertyMetadata(typeof(StarrySky)));}public StarrySky(){Loaded += delegate{CompositionTarget.Rendering += delegate{StarRoamAnimation();AddOrRemoveStarLine();MoveStarLine();};};}public override void OnApplyTemplate(){base.OnApplyTemplate();_grid = GetTemplateChild(GridTemplateName) as Grid;_canvas = GetTemplateChild(CanvasTemplateName) as Canvas;}public int StarCount{get => (int)GetValue(StarCountProperty);set => SetValue(StarCountProperty, value);}public int StarSizeMin{get => (int)GetValue(StarSizeMinProperty);set => SetValue(StarSizeMinProperty, value);}public int StarSizeMax{get => (int)GetValue(StarSizeMaxProperty);set => SetValue(StarSizeMaxProperty, value);}public int StarVMin{get => (int)GetValue(StarVMinProperty);set => SetValue(StarVMinProperty, value);}public int StarVMax{get => (int)GetValue(StarVMaxProperty);set => SetValue(StarVMaxProperty, value);}public int StarRVMin{get => (int)GetValue(StarRVMinProperty);set => SetValue(StarRVMinProperty, value);}public int StarRVMax{get => (int)GetValue(StarRVMaxProperty);set => SetValue(StarRVMaxProperty, value);}public int LineRate{get => (int)GetValue(LineRateProperty);set => SetValue(LineRateProperty, value);}public void InitStar(){//清空星星容器_stars = new StarInfo[StarCount];_canvas.Children.Clear();_grid.Children.Clear();//生成星星for (var i = 0; i < StarCount; i++){double size = _random.Next(StarSizeMin, StarSizeMax + 1); //星星尺寸var starInfo = new StarInfo{X = _random.Next(0, (int)_canvas.ActualWidth),XV = (double)_random.Next(-StarVMax, StarVMax) / 60,XT = _random.Next(6, 301), //帧Y = _random.Next(0, (int)_canvas.ActualHeight),YV = (double)_random.Next(-StarVMax, StarVMax) / 60,YT = _random.Next(6, 301), //帧StarLines = new Dictionary<StarInfo, Line>()};var star = new Path{Data = Application.Current.Resources["PathStarrySky"] as Geometry,Width = size,Height = size,Stretch = Stretch.Fill,Fill = GetRandomColorBursh(),RenderTransformOrigin = new Point(0.5, 0.5),RenderTransform = new RotateTransform { Angle = 0 }};Canvas.SetLeft(star, starInfo.X);Canvas.SetTop(star, starInfo.Y);starInfo.StarRef = star;//设置星星旋转动画SetStarRotateAnimation(star);//添加到容器_stars[i] = starInfo;_canvas.Children.Add(star);}}private void SetStarRotateAnimation(Path star){double v = _random.Next(StarRVMin, StarRVMax + 1); //速度double a = _random.Next(0, 360 * 5); //角度var t = a / v; //时间var dur = new Duration(new TimeSpan(0, 0, 0, 0, (int)(t * 1000)));var sb = new Storyboard{Duration = dur};//动画完成事件 再次设置此动画sb.Completed += (S, E) => { SetStarRotateAnimation(star); };var da = new DoubleAnimation{To = a,Duration = dur};Storyboard.SetTarget(da, star);Storyboard.SetTargetProperty(da, new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)"));sb.Children.Add(da);sb.Begin(this);}private SolidColorBrush GetRandomColorBursh(){var r = (byte)_random.Next(128, 256);var g = (byte)_random.Next(128, 256);var b = (byte)_random.Next(128, 256);return new SolidColorBrush(Color.FromRgb(r, g, b));}/// <summary>///     星星漫游动画/// </summary>private void StarRoamAnimation(){if (_stars == null)return;foreach (var starInfo in _stars){//X轴运动if (starInfo.XT > 0){//运动时间大于0,继续运动if (starInfo.X >= _canvas.ActualWidth || starInfo.X <= 0)//碰到边缘,速度取反向starInfo.XV = -starInfo.XV;//位移加,时间减starInfo.X += starInfo.XV;starInfo.XT--;Canvas.SetLeft(starInfo.StarRef, starInfo.X);}else{//运动时间小于0,重新设置速度和时间starInfo.XV = (double)_random.Next(-StarVMax, StarVMax) / 60;starInfo.XT = _random.Next(100, 1001);}//Y轴运动if (starInfo.YT > 0){//运动时间大于0,继续运动if (starInfo.Y >= _canvas.ActualHeight || starInfo.Y <= 0)//碰到边缘,速度取反向starInfo.YV = -starInfo.YV;//位移加,时间减starInfo.Y += starInfo.YV;starInfo.YT--;Canvas.SetTop(starInfo.StarRef, starInfo.Y);}else{//运动时间小于0,重新设置速度和时间starInfo.YV = (double)_random.Next(-StarVMax, StarVMax) / 60;starInfo.YT = _random.Next(100, 1001);}}}/// <summary>///     添加或者移除星星之间的连线/// </summary>private void AddOrRemoveStarLine(){//没有星星 直接返回if (_stars == null || StarCount != _stars.Length)return;//生成星星间的连线for (var i = 0; i < StarCount - 1; i++)for (var j = i + 1; j < StarCount; j++){var star1 = _stars[i];var x1 = star1.X + star1.StarRef.Width / 2;var y1 = star1.Y + star1.StarRef.Height / 2;var star2 = _stars[j];var x2 = star2.X + star2.StarRef.Width / 2;var y2 = star2.Y + star2.StarRef.Height / 2;var s = Math.Sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)); //两个星星间的距离var threshold = star1.StarRef.Width * LineRate + star2.StarRef.Width * LineRate;if (s <= threshold){if (!star1.StarLines.ContainsKey(star2)){var line = new Line{X1 = x1,Y1 = y1,X2 = x2,Y2 = y2,Stroke = GetStarLineBrush(star1.StarRef, star2.StarRef)};star1.StarLines.Add(star2, line);_grid.Children.Add(line);}}else{if (star1.StarLines.ContainsKey(star2)){_grid.Children.Remove(star1.StarLines[star2]);star1.StarLines.Remove(star2);}}}}/// <summary>///     移动星星之间的连线/// </summary>private void MoveStarLine(){//没有星星 直接返回if (_stars == null)return;foreach (var star in _stars)foreach (var starLine in star.StarLines){var line = starLine.Value;line.X1 = star.X + star.StarRef.Width / 2;line.Y1 = star.Y + star.StarRef.Height / 2;line.X2 = starLine.Key.X + starLine.Key.StarRef.Width / 2;line.Y2 = starLine.Key.Y + starLine.Key.StarRef.Height / 2;}}/// <summary>///     获取星星连线颜色画刷/// </summary>/// <param name="star0">起始星星</param>/// <param name="star1">终点星星</param>/// <returns>LinearGradientBrush</returns>private LinearGradientBrush GetStarLineBrush(Path star0, Path star1){return new LinearGradientBrush{GradientStops = new GradientStopCollection{new GradientStop { Offset = 0, Color = (star0.Fill as SolidColorBrush).Color },new GradientStop { Offset = 1, Color = (star1.Fill as SolidColorBrush).Color }}};}}/// <summary>///     星星/// </summary>internal class StarInfo{/// <summary>///     X坐标/// </summary>public double X { get; set; }/// <summary>///     X轴速度(单位距离/帧)/// </summary>public double XV { get; set; }/// <summary>///     X坐标以X轴速度运行的时间(帧)/// </summary>public int XT { get; set; }/// <summary>///     Y坐标/// </summary>public double Y { get; set; }/// <summary>///     Y轴速度(单位距离/帧)/// </summary>public double YV { get; set; }/// <summary>///     Y坐标以Y轴速度运行的时间(帧)/// </summary>public int YT { get; set; }/// <summary>///     对星星的引用/// </summary>public Path StarRef { get; set; }public Dictionary<StarInfo, Line> StarLines { get; set; }}
}

2)StarrySky.xaml代码如下;

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:controls="clr-namespace:WPFDevelopers.Controls"><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Basic/ControlBasic.xaml"/></ResourceDictionary.MergedDictionaries><RadialGradientBrush x:Key="StarrySkyRadialGradientBrush" GradientOrigin="0.5,0" Center="0.5,0.3" RadiusX="0.7"><GradientStop Color="#FF04040E" Offset="0"/><GradientStop Color="#FF24315D" Offset="1"/></RadialGradientBrush><Style TargetType="{x:Type controls:StarrySky}" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Background" Value="{StaticResource StarrySkyRadialGradientBrush}"></Setter><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type controls:StarrySky}"><Grid Background="{TemplateBinding Background}"><Grid x:Name="PART_GridLineContainer"/><Canvas x:Name="PART_CanvasStarContainer"/></Grid></ControlTemplate></Setter.Value></Setter></Style>
</ResourceDictionary>

3)StarrySkyExample.xaml代码如下;

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.StarrySkyExample"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:wpfdev="https://github.com/WPFDevelopersOrg/WPFDevelopers"xmlns:ws="https://github.com/WPFDevelopersOrg.WPFDevelopers.Minimal"xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><UserControl.Resources><Style TargetType="{x:Type TextBlock}"><Setter Property="Foreground" Value="White"></Setter><Setter Property="FontSize" Value="14"></Setter><Setter Property="VerticalAlignment" Value="Center"></Setter><Setter Property="Margin" Value="2"></Setter></Style><Style TargetType="{x:Type StackPanel}"><Setter Property="Margin" Value="2"></Setter></Style><Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"><Setter Property="ws:ElementHelper.Watermark" Value="输入内容"></Setter><Setter Property="Margin" Value="-30,0"></Setter><Setter Property="Width" Value="100"></Setter></Style></UserControl.Resources><Grid><!--<wpfdev:StarrySky StarCount="{Binding ElementName=tbx_starCount,Path=Text}"StarSizeMin="{Binding ElementName=tbx_starSizeMin,Path=Text}"StarSizeMax="{Binding ElementName=tbx_starSizeMax,Path=Text}"StarVMin="{Binding ElementName=tbx_starVMin,Path=Text}"StarVMax="{Binding ElementName=tbx_starVMax,Path=Text}"StarRVMin="{Binding ElementName=tbx_starRVMin,Path=Text}"StarRVMax="{Binding ElementName=tbx_starRVMax,Path=Text}"LineRate="{Binding ElementName=tbx_lineRate,Path=Text}"Name="myStarrySky"></wpfdev:StarrySky>--><wpfdev:StarrySky Name="myStarrySky"></wpfdev:StarrySky><StackPanel HorizontalAlignment="Left" VerticalAlignment="Top"><StackPanel Orientation="Horizontal"><TextBlock Text="星星个数:"></TextBlock><TextBox x:Name="tbx_starCount" Text="{Binding ElementName=myStarrySky,Path=StarCount}"/></StackPanel><StackPanel Orientation="Horizontal"><TextBlock Text="最小尺寸:"></TextBlock><TextBox Name="tbx_starSizeMin"  Text="{Binding ElementName=myStarrySky,Path=StarSizeMin}"></TextBox></StackPanel><StackPanel Orientation="Horizontal"><TextBlock Text="最大尺寸:"></TextBlock><TextBox Name="tbx_starSizeMax" Text="{Binding ElementName=myStarrySky,Path=StarSizeMax}"></TextBox></StackPanel><StackPanel Orientation="Horizontal"><TextBlock Text="最小速度:"></TextBlock><TextBox Name="tbx_starVMin" Text="{Binding ElementName=myStarrySky,Path=StarVMin}"></TextBox></StackPanel><StackPanel Orientation="Horizontal"><TextBlock Text="最大速度:"></TextBlock><TextBox Name="tbx_starVMax" Text="{Binding ElementName=myStarrySky,Path=StarVMax}"></TextBox></StackPanel><StackPanel Orientation="Horizontal"><TextBlock Text="最小转速:"></TextBlock><TextBox Name="tbx_starRVMin" Text="{Binding ElementName=myStarrySky,Path=StarRVMin}"></TextBox></StackPanel><StackPanel Orientation="Horizontal"><TextBlock Text="最大转速:"></TextBlock><TextBox Name="tbx_starRVMax" Text="{Binding ElementName=myStarrySky,Path=StarRVMax}"></TextBox></StackPanel><StackPanel Orientation="Horizontal"><TextBlock Text="连线倍率:"></TextBlock><TextBox Name="tbx_lineRate" Text="{Binding ElementName=myStarrySky,Path=LineRate}"></TextBox></StackPanel><Button Name="btn_render" Content="生成" Click="btn_render_Click"/></StackPanel></Grid>
</UserControl>

4)StarrySkyExample.xaml.cs代码如下;

using System.Windows.Controls;namespace WPFDevelopers.Samples.ExampleViews
{/// <summary>/// StarrySkyExample.xaml 的交互逻辑/// </summary>public partial class StarrySkyExample : UserControl{public StarrySkyExample(){InitializeComponent();}private void btn_render_Click(object sender, System.Windows.RoutedEventArgs e){myStarrySky.InitStar();}}
}

源码1[1]Gtihub[2]Gitee[3]

参考资料

[1]

源码: https://files.cnblogs.com/files/tsliwei/StarrySkyBasedOnCanvasYOUHUA.zip

[2]

Gtihub: https://github.com/WPFDevelopersOrg/WPFDevelopers

[3]

gitee: https://gitee.com/WPFDevelopersOrg/WPFDevelopers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

data类型的Url的格式

data类型的Url的格式 一、data类型的简介 所谓"data"类型的Url格式&#xff0c;是在RFC2397中提出的&#xff0c;目的对于一些“小”的数据&#xff0c;可以在网页中直接嵌入&#xff0c;而不是从外部文件载入。例如对于img这个Tag&#xff0c;哪怕 这个图片非常非…

C语言试题八十之统计单词个数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 终端输入一…

SSIS 执行变量中的脚步输出列顺序与SQL查询列顺序不同

这个问题是朋友遇到的&#xff0c;做一个SSIS的程序将数据导入到txt。然后再用Oracle的工具导入到Oracle。但是在SSIS中执行变量脚步的时候&#xff0c;发现输出的列名称跟查询的列名称完全不同。比如Schema_id在查询的第三列&#xff0c;但是输出的时候到了第6列。 如图&#…

【ArcGIS风暴】ArcGIS自定义坐标系统案例教程---以阿尔伯斯投影(Albers)为例

在实际工作中,经常需要进行矢量数据或栅格数据的投影转换工作,但有时候ArcGIS中恰恰没有我们需要的坐标系,此时,就需要我们自定义坐标系。本文以阿尔伯斯投影(Albers)为例,讲解自定义投影的一般过程及注意事项。 文章目录 1. 确定投影名称2. 选择投影坐标系及修改参数4.…

C语言试题八十一之利用递归函数调用方式,将所输入的5个字符,相反顺序打印

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 利用递归函…

Unity5 GI与PBS渲染从用法到着色代码

本文主要介绍Untiy5以后的GI&#xff0c;PBS&#xff0c;以及光源探头&#xff0c;反射探头的用法以及在着色器代码中如何发挥作用&#xff0c;GI是如何影响渲染的&#xff0c;主要分成三个部分&#xff0c;最开始说明PBS需要的材质与相应概念&#xff0c;二是Unity 里相应GI的…

Web前端笔试面试题汇总(转自github)

前言 本文总结了一些优质的前端面试题&#xff08;多数源于网络&#xff09;&#xff0c;初学者阅后也要用心钻研其中的原理&#xff0c;重要知识需要系统学习&#xff0c;透彻学习&#xff0c;形成自己的知识链。万不可投机取巧&#xff0c;只求面试过关是错误的&#xff01; …

Blazor University (31)表单 —— 验证

原文链接&#xff1a;https://blazor-university.com/forms/validation/验证源代码[1]DataAnnotationsValidator 是 Blazor 中的标准验证器类型。在 EditForm 组件中添加此组件将启用基于 System.ComponentModel.DataAnnotations.ValidationAttribute 的 .NET 属性的表单验证。…

CSDN,CNBLOGS博客文章一键转载插件 终于更新了!

之前&#xff0c;Shawn Chou等朋友一直建议插件支持cnblogs文章转载&#xff0c;但一直没时间修改插件&#xff0c;今天晚上抽时间将插件进行了升级&#xff0c;可以支持 CSDN,CNBLOGS博客文章的一键转载。时间仓促&#xff0c;难免有各种问题&#xff0c;欢迎提出建议&#xf…

ROS2_Control官方资料+运动控制

Getting Started — ROS2_Control: Rolling Dec 2023 documentation Getting Started Edit on GitHub Youre reading the documentation for a development version. For the latest released version, please have a look at Iron. Getting Started Installation Binar…

三、教你搞懂渐变堆叠面积图《手把手教你 ECharts 数据可视化详解》

注&#xff1a;本系列教程需要对应 JavaScript 、html、css 基础&#xff0c;否则将会导致阅读时困难&#xff0c;本教程将会从 ECharts 的官方示例出发&#xff0c;详解每一个示例实现&#xff0c;从中学习 ECharts 。 ECharts 官方示例&#xff1a;https://echarts.apache.o…

C语言试题八十二之输入小写字母,把小写字母转换成大写字母。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 输入小写字…

Serv-U服务器的管理3

&#xff18;&#xff0e;编辑&#xff29;&#xff30;访问规则对于某些扰乱服务器秩序但又不方便删除其账户的用户&#xff0c;可以利用“编辑&#xff29;&#xff30;访问规则”允许或阻止特定的&#xff29;&#xff30;访问。&#xff33;&#xff45;&#xff52;&#…

【ArcGIS风暴】什么是点云?什么是Las数据集?一篇文章告诉你点云数据的奥秘

摄影测量Pix4d等软件,或激光雷达数据一般都是LAS格式的点云数据,有很大的适用范围和优点,那么,到底什么是LAS数据集呢,一文告诉你LAS数据集的来龙去脉。 扩展阅读: 什么是点云?什么是Las数据集?一篇文章告诉你点云数据的奥秘 ArcGIS+CASS点云(.las)数据生成等高线方法案…

试用了多款报表工具,终于找到了基于.Net 6开发的一个了

Part1前言上一个月有一个项目需要用到数据分析&#xff0c;将老板感兴趣的数据给他整理成一个面板&#xff0c;方便他实时查看&#xff0c;于是自己了解到了BI,当时我们项目就用了metabase&#xff0c;metabase是一款开源的BI分析工具&#xff0c;开发语言clojureReact为主。就…

4种CSS文字竖排方法

2019独角兽企业重金招聘Python工程师标准>>> 有时候&#xff0c;我们需要对网页某个区域的文字竖排&#xff0c;竖向排列&#xff0c;横向的当然大家都见惯了&#xff0c;对于竖排&#xff0c;一时间找不到思路了&#xff0c;呵呵&#xff0c;其实和横排一样简单&am…

知道这20个正则表达式,能让你少写1,000行代码

正则表达式&#xff0c;一个十分古老而又强大的文本处理工具&#xff0c;仅仅用一段非常简短的表达式语句&#xff0c;便能够快速实现一个非常复杂的业务逻辑。熟练地掌握正则表达式的话&#xff0c;能够使你的开发效率得到极大的提升。 正则表达式经常被用于字段或任意字符串的…

Android之SwipeRefreshLayout嵌套RecyclerView遇到的坑

1 、需求 RecyclerView多布局里面加入SwipeRefreshLayout实现下拉刷新 2、关键代码 <androidx.swiperefreshlayout.widget.SwipeRefreshLayoutandroid:id="@+id/mainRefresh"android:layout_width="match_parent"android:layout_height="0dp"…

TCP连接出现大量TIME_WAIT的解决办法

一个TCP/IP连接断开以后&#xff0c;会通过TIME_WAIT的状态保留一段时间&#xff0c;时间过了才会释放这个端口&#xff0c;当端口接受的频繁请求数量过多的时候&#xff0c;就会产生大量的TIME_WAIT状态的连接&#xff0c;这些连接占着端口&#xff0c;会消耗大量的资源。面对…

【ArcGIS风暴】ArcGIS10.6创建LAS数据集的两种方法并加载点云数据

文章目录 1. 使用上下文菜单创建 LAS 数据集2. 使用地理处理工具创建 LAS 数据集3. 显示LAS数据集LAS 数据集是位于文件夹中的独立文件,并且引用 LAS 格式的激光雷达数据和用于定义表面特征的可选表面约束要素。可使用创建 LAS 数据集工具或 ArcCatalog 中文件夹的上下文菜单快…