WPF基础知识系例

news2024/11/28 14:49:33

WPF系列-绘图和动画

  • 1、WPF绘图
    • 1.1 直线
    • 1.2 矩形
    • 1.3 椭圆
    • 1.4 路径

1、WPF绘图

这里将从静态图像绘制入手,进而学习动画效果制作。WPF 拥有自己的一套图形 API ,使用这套 API 不但可以轻松地绘制出精美的图形,还可以方便地对图形进行滤镜、变形等效果。WPF 绘制出的图形为矢量图,图片放大或缩小不会出现锯齿现象。引用别人 WPF 绘制的图像,直接把 XAML 代码拿来用即可。
WPF 的基本图形包括以下几个(均为 Shape 类的派生类):

  • Line: 直线段,可以设置笔触(Stroke)。
  • Rectangle: 矩形,既有笔触,还可以填充背景色(Fill)。
  • Ellipse: 椭圆,长宽相等的则为圆,既有笔触又有填充。
  • Polygon: 多边形,有多条直线段围成的闭合区域,既有笔触又有填充。
  • Polyline: (不闭合)折线,由多条首位相接的直线段组成。
  • Path: (闭合区域)路径,基本图像中功能最强大的,可以有若干直线、圆弧、贝塞尔曲线组成。

1.1 直线

直线是最简单的图形,由起点(X1,Y1)和终点(X2,Y2)两个点坐标构成,通过设置 X1 和 Y1 的属性值,可以设置直线的起点,通过设置 X2 和 Y2 的属性值,可以设置直线的终点坐标,控制不同直线的起点和终点坐标,可以实现直线的平行、交错等效果。Stroke(笔触)属性的数据类型就是 Brush (画刷) ,凡是 Brush 的派生类均可以给该属性赋值,当然使用渐变色画刷还可以画出渐变效果的直线,Line 的部分属性设置还可以将直线变成虚线(StrokeDashArray)或者控制线段起点(StrokeStartLineCap)终点(StrokeEndLineCap)形状。下面我们看下这些属性实现的效果。

<Window x:Class="LSCX_WPFSerial._12.LineUI"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:LSCX_WPFSerial._12"
        mc:Ignorable="d"
        Title="LineUI" Height="260" Width="280">
    <Grid>
        <Line X1="20" Y1="20" X2="260" Y2="20" Stroke="Black" StrokeThickness="10"/>
        <Line X1="20" Y1="40" X2="260" Y2="40" Stroke="Red" StrokeThickness="8"/>
        <Line X1="20" Y1="60" X2="260" Y2="60" Stroke="Bisque" StrokeThickness="6"/>
        <Line X1="20" Y1="80" X2="260" Y2="80" Stroke="Aqua" StrokeThickness="4"/>
        <Line X1="20" Y1="100" X2="260" Y2="100" Stroke="Purple" StrokeThickness="2"/>
        <Line X1="20" Y1="120" X2="260" Y2="120" Stroke="Red" StrokeDashArray="3" StrokeThickness="1"/>
        <Line X1="20" Y1="140" X2="260" Y2="140" Stroke="Red" StrokeDashArray="5" StrokeThickness="1"/>
        <Line X1="20" Y1="180" X2="260" Y2="180" Stroke="Coral" StrokeEndLineCap="Triangle" StrokeThickness="8"/>
        <Line X1="20" Y1="200" X2="260" Y2="200" Stroke="Coral" StrokeEndLineCap="Round" StrokeThickness="8"/>
        <Line X1="20" Y1="220" X2="260" Y2="220" StrokeEndLineCap="Round" StrokeThickness="8">
            <Line.Stroke>
                <LinearGradientBrush EndPoint="0,0.5" StartPoint="1,0.5">
                    <GradientStop Color="Red" Offset="0"/>
                    <GradientStop Offset="1" />
                </LinearGradientBrush>
            </Line.Stroke>
        </Line>
        <Line X1="20" Y1="240" X2="260" Y2="240" StrokeEndLineCap="Round" StrokeThickness="8">
            <Line.Stroke>
                <LinearGradientBrush EndPoint="0,0.5" StartPoint="1,0.5">
                    <GradientStop Color="Red" Offset="0"/>
                    <GradientStop Color="Purple" Offset="1" />
                </LinearGradientBrush>
            </Line.Stroke>
        </Line>
    </Grid>
</Window>

实现效果如下所示:
在这里插入图片描述这里我们使用绘图的容器是 Grid ,常用的布局容器主要是 Canvas 和 Grid 。

1.2 矩形

矩形由笔触(Stroke)即边线 和填充( Fill ) 构成。 Stroke 属性的设置与 Line —样,Fill 属性的数据类型是 Brush。 Brush 是个抽象类, 所以不可直接使用 Brush 类的实例为 Fill 属性陚值,必须使用 Brush 派生类的实例进行陚值。 WPF 的绘图系统包含非常丰富的 Brush 类型, 常用的有:
SolidColorBrush: 实心画刷。 在 XAML 中可以使用颜色名称字符串( 如 Red、 Blue) 直接赋值。
LinearGradientBrush: 线性渐变画刷。 色彩沿设定的直线方向、 按设定的变化点进行渐变。
RadialGradientBrush: 径向渐变画刷。 色彩沿半径的方向、 按设定的变化点进行渐变, 形成圆形填充。
ImageBrush: 使用图片( Image) 作为填充内容。
DrawingBrush: 使用矢量图( Vector ) 和位图( Bitmap) 作为填充内容。
VisualBrush: WPF 中 的 每 个 控 件 都 是 由 FrameworkElement 类 派 生 来 的 , 而FrameworkElement 又是由 Visual 类派牛.来的。 Visual 意为“ 可视” 之意, 每个控件的可视化形象就可以通过 Visual 类的方法获得。 获得这个可视化的形象后, 我们可以用这个形象进行填充。下面我们来使用这些属性画一些矩形,并使用不同的填充。

<Window x:Class="LSCX_WPFSerial._12.Rectangle"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:LSCX_WPFSerial._12"
        mc:Ignorable="d"
        Title="Rectangle" Height="450" Width="800">
    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="160"/>
            <RowDefinition Height="10"/>
            <RowDefinition Height="160"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="180"/>
            <ColumnDefinition Width="10"/>
            <ColumnDefinition Width="180"/>
            <ColumnDefinition Width="10"/>
            <ColumnDefinition Width="180"/>
        </Grid.ColumnDefinitions>
        <!--纯色填充-->
        <Rectangle Stroke="Red" Fill="LightBlue"/>
        <!--线性渐变色填充-->
        <Rectangle Grid.Column="2" Grid.Row="0">
            <Rectangle.Fill>
                <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                    <GradientStop Color="#ffbf7f" Offset="0"/>
                    <GradientStop Color="#ffcc99" Offset="0.25"/>
                    <GradientStop Color="#ffdbb7" Offset="0.5"/>
                    <GradientStop Color="#ffead6" Offset="1"/>
                </LinearGradientBrush>
                    
            </Rectangle.Fill>
        </Rectangle>
        <!--径向渐变色填充-->
        <Rectangle Grid.Column="4" Grid.Row="0">
            <Rectangle.Fill>
                <!--默认填充的起点坐标 0,0 终点坐标 1,1 所以可以直接省略 StartPoint="0,0" EndPoint="1,1"-->
                <RadialGradientBrush>
                    <GradientStop Color="#ffbf7f" Offset="0"/>
                    <GradientStop Color="#ffcc99" Offset="0.25"/>
                    <GradientStop Color="#ffdbb7" Offset="0.5"/>
                    <GradientStop Color="#ffead6" Offset="1"/>
                </RadialGradientBrush>

            </Rectangle.Fill>
        </Rectangle>

        <!--图片填充-->
        <Rectangle Grid.Column="0" Grid.Row="2">
            <Rectangle.Fill>
                <ImageBrush ImageSource="/Images/黑.jpg" TileMode="Tile" Stretch="Uniform"/>
            </Rectangle.Fill>
        </Rectangle>

        <!--矢量图填充-->
        <Rectangle Grid.Column="2" Grid.Row="2">
            <Rectangle.Fill>
                <DrawingBrush Viewport="0,0,0.2,0.2" TileMode="Tile">
                    <DrawingBrush.Drawing>
                        <GeometryDrawing Brush="LightBlue">
                            <GeometryDrawing.Geometry>
                                <EllipseGeometry RadiusX="15" RadiusY="15"/>
                            </GeometryDrawing.Geometry>
                        </GeometryDrawing>
                    </DrawingBrush.Drawing>
                </DrawingBrush>
            </Rectangle.Fill>
        </Rectangle>
        
        <!--线性渐变填充边线-->
        <Rectangle Grid.Column="4" Grid.Row="2" StrokeThickness="10">
            <Rectangle.Stroke>
                <LinearGradientBrush>
                    <GradientStop Color="#ffbf7f" Offset="0.3"/>
                    <GradientStop Color="#ffead6" Offset="1"/>
                </LinearGradientBrush>

            </Rectangle.Stroke>
        </Rectangle>
    </Grid>
</Window>

效果如下所示:
在这里插入图片描述接下来,我们看一下使用 VisualBrush 的例子,这里我们用 Button 作为目标控件为案例实现。 XAML 代码如下:

 <!--VisualBrush按钮实例-->
        <StackPanel x:Name="stackpanelTop" Background="White" Grid.Column="4">
            <Button x:Name="btn_Top" Content="确定" Height="40"/>
        </StackPanel>
        <Button Content="向下复制按钮" Grid.Column="4" Grid.Row="1"  Click="CloneVisual"/>
        <StackPanel x:Name="stackpanelBottom" Grid.Row="2" Grid.Column="4" Orientation="Vertical" Background="White"/>

实现后效果如下:
请添加图片描述

1.3 椭圆

椭圆作为一种常见的图像,使用方法与矩形基本一致,只是图像形状上的差别,下面以绘制一个球体为例子,球体轮廓是圆形的,让椭圆变成圆的方式是 width=Height,球体的阴影效果我们使用径向渐变实现。XAML 代码如下:

<Window x:Class="LSCX_WPFSerial._12.EllipseUI"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:LSCX_WPFSerial._12"
        mc:Ignorable="d"
        Title="EllipseUI" Height="450" Width="800">
    <Grid>
        <Ellipse Stroke="Gray" Width="200" Height="200" Cursor="Hand" ToolTip="Ball">
            <Ellipse.Fill>
                <RadialGradientBrush GradientOrigin="0.2,0.8" RadiusX="0.75" RadiusY="0.75">
                    <RadialGradientBrush.RelativeTransform>
                        <TransformGroup>
                            <RotateTransform Angle="90" CenterX="0.5" CenterY="0.5"/>
                        </TransformGroup>
                    </RadialGradientBrush.RelativeTransform>
                    <GradientStop Color="#FFFFFFFF" Offset="0"/>
                    <GradientStop Color="#FF444444" Offset="0.66"/>
                    <GradientStop Color="#FF999999" Offset="1"/>
                </RadialGradientBrush>
            </Ellipse.Fill>
        </Ellipse>
    </Grid>
</Window>

显示效果如下:
在这里插入图片描述
我们来分析下这个元的实现过程,我们先只是用径向填充看一下效果

 <Ellipse Stroke="Gray" Width="140" Height="140" Cursor="Hand" ToolTip="Ball">
            <Ellipse.Fill>
                <RadialGradientBrush>
                    <GradientStop Color="#FFFFFFFF" Offset="0"/>
                    <GradientStop Color="#FF444444" Offset="0.66"/>
                    <GradientStop Color="#FF999999" Offset="1"/>
                </RadialGradientBrush>
            </Ellipse.Fill>
        </Ellipse>

在这里插入图片描述
我们得到的是一个类似点光源的发光效果,那么怎么实现球体效果,就需要增加阴影和径向填充的中心位置,即发光点的位置。这里是通过 RadialGradientBrush GradientOrigin=“0.2,0.8” RadiusX=“0.75” RadiusY=“0.75” 来实现,GradientOrigin 属性就是控制发光点的位置,他以左上角为原点,通过坐标点来控制发光点出现的位置,坐标值范围是0-1,GradientOrigin=“0.2,0.8” 就表示 发光点位于x轴 0.2 位置,y轴0.8 位置。RadiusX=“0.75” RadiusY=“0.75” 则是用来控制发光点辐射的范围,RadiusX= RadiusY 表示发光区域为圆形区域,当不相时则为椭圆形区域,0.75 表示覆盖区域占整个圆的 75% 。而剩下的区域就形成了 **阴影的效果 **。如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发光点旋转角度是通过下马这个属性值来实现,CenterX=0.5 CenterY=“0.5” 表示旋转中心位于圆心位置,坐标参考也是左上角为原点位置,旋转是按照顺时针旋转,旋转90度。把原本位于左下角的发光点旋转90度后变换到左上角了。

  <RadialGradientBrush.RelativeTransform>
                        <TransformGroup>
                            <RotateTransform Angle="90" CenterX="0.5" CenterY="0.5"/>
                        </TransformGroup>
                    </RadialGradientBrush.RelativeTransform>

在这里插入图片描述
以上就是对椭圆的具体分析了,相信大家对部分属性的理解也会更加深刻一些。

1.4 路径

路径可以说是WPF 绘图中最强大的工具了,用这一个就可以实现所有类型的图形,通过直线、圆弧、贝塞尔曲线组合实现。路径的一个重要属性就是 Data ,Data 的数据类型是 Geometry (几何图形)我们使用这一属性对线段进行拼接形成复杂的图形。
Data 语法有两种形式:

  1. 标签式标准语法;
  2. 用于绘制几何图形的 路径标记语法
    Geometry 是抽象类,不能直接使用,我们需要使用他的子类作为 Data 的数据源。Geometry 的常用子类:
  • LineGeometry : 直线几何图形
  • RectangleGeometry :矩形几何图形
  • EillpseGeometry :椭圆几何图形
  • PathGeometry :路径几何图形
  • StreamGeometry :PathGeometry 的代替品,轻量级,不支持 Binding和动画等。
  • CombinedGeometry:由多个基本几何图形联合在一起形成单个几何图形。
  • GeometryGroup:由多个基本几何图形组合在一起,形成几何图形组。

下面我们看下各种图形的实现吧,XAML代码如下:

<Window x:Class="LSCX_WPFSerial._12.PathUI"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:LSCX_WPFSerial._12"
        mc:Ignorable="d"
        Title="PathUI" Height="540" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="260"/>
            <ColumnDefinition Width="260"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="260"/>
            <RowDefinition Height="260"/>
        </Grid.RowDefinitions>

        <!--直线几何图形-->
        <Path Stroke="Red" StrokeThickness="5" Grid.Column="0" Grid.Row="0">
            <Path.Data>
                <LineGeometry StartPoint="10,10" EndPoint="150,150"/>
            </Path.Data>
        </Path>
        <!--矩形几何图形 RadiusX、Y 设置矩阵圆角信息-->
        <Path Stroke="Green" StrokeThickness="5" Grid.Column="1" Grid.Row="0">
            <Path.Data>
                <RectangleGeometry Rect="10,10,150,150" RadiusX="10" RadiusY="10"/>
            </Path.Data>
        </Path>
        <!--椭圆几何图形-->
        <Path Stroke="Black" Fill="Black" Grid.Column="0" Grid.Row="1">
            <Path.Data>
                <EllipseGeometry Center="80,80" RadiusX="60" RadiusY="60"/>
            </Path.Data>
        </Path>
        <!--Path 自定义路径-->
        <Path Stroke="Yellow" Fill="Orange" Grid.Column="1" Grid.Row="1">
            <Path.Data>
                <PathGeometry>
                    <!--<PathGeometry.Figures>-->
                        <!--PathFigure是PathGeometry 默认内容属性如果没有限制采用默认则可省略不写-->
                    <PathFigure StartPoint="25,140" IsClosed="False">
                        <!--<PathFigure.Segments>-->
                            <!--Segments是 PathFigure 默认内容属性可省略不写-->
                            <LineSegment Point="20,40"/>
                            <LineSegment Point="40,110"/>
                            <LineSegment Point="50,20"/>
                            <LineSegment Point="80,110"/>
                            <LineSegment Point="110,20"/>
                            <LineSegment Point="120,110"/>
                            <LineSegment Point="140,40"/>
                            <LineSegment Point="135,140"/>
                        <!--</PathFigure.Segments>-->
                    </PathFigure>
                    <!--</PathGeometry.Figures>-->
                </PathGeometry>
            </Path.Data>
        </Path>
    </Grid>
</Window>

效果如下图所示:
在这里插入图片描述
其中最复杂的就算是 Path 的使用了,但 Path 却也是最为核心重要的,接下来我们就终点来看一下 Path。
对Path 的标签语言进行分析后发现核心部分就是下面这部分:

    <PathFigure >
<!--各种线段实现 -->
</PathFigure>

那么我们来分析一下这个各种线段的实现部分,我们先看下有哪些线段:

  • LineSegment : 直线段
  • ArcSegment : 圆弧段
  • BezierSegment: 三次方贝塞尔曲线段(默认的贝塞尔曲线就是三次曲线)
  • QuadraticSegment: 二次方贝塞尔曲线段
  • PolyLineSegment:多直线段
  • PolyBezierSegment:多三次方贝塞尔曲线段
  • PolyQuadraticBezierSegment:多二次方贝塞尔曲线段

使用注意的一点就是这些线段是没有起点的,起点的位置是上一个线段的终点位置,所以第一个线段的起点就是图形起点,位于 PathFigure 的 StartPoint 。LineSegment 最为简单,最先实现 ,具体实例 XAML代码如下:

  <Path Stroke="Green" Grid.Column="2" Grid.Row="0" Fill="LightGreen" StrokeThickness="3">
            <Path.Data>
                <PathGeometry>
                    <PathFigure IsClosed="True" StartPoint="0,0">
                        <LineSegment Point="150,0"/>
                        <LineSegment Point="150,30"/>
                        <LineSegment Point="90,30"/>
                        <LineSegment Point="90,60"/>
                        <LineSegment Point="150,60"/>
                        <LineSegment Point="150,90"/>
                        <LineSegment Point="90,90"/>
                        <LineSegment Point="90,120"/>
                        <LineSegment Point="150,120"/>
                        <LineSegment Point="150,150"/>
                        <LineSegment Point="0,150"/>
                        <LineSegment Point="0,120"/>
                        <LineSegment Point="60,120"/>
                        <LineSegment Point="60,90"/>
                        <LineSegment Point="0,90"/>
                        <LineSegment Point="0,60"/>
                        <LineSegment Point="60,60"/>
                        <LineSegment Point="60,30"/>
                        <LineSegment Point="0,30"/>
                    </PathFigure>
                </PathGeometry>
            </Path.Data>
        </Path>

代码效果如下:
在这里插入图片描述ArcSegment 用来绘制圆弧,point 属性用来指明圆弧的连接终点:圆弧截取自椭圆,Size 属性即为完整椭圆的的横轴半径和纵轴半径: SweepDirection 属性指明圆弧是按照顺时针还是逆时针方向。如果椭圆上的两个点位置不对称,那么这两个点之间的圆弧会分成大弧和小弧;IsLaegeArc 属性用来说明是否使用大弧来连接。RotationAngle 属性用来指明圆弧与母圆弧的旋转角度。

在这里插入图片描述接下来先简单地画一个三次方的贝塞尔曲线,具体实例 XAML代码如下:

<Path Stroke="Red" StrokeThickness="6" Margin="30" Grid.Column="2" Grid.Row="1">
            <Path.Data>
                <PathGeometry>
                    <PathFigure StartPoint="0,0">
                        <BezierSegment Point1="200,0" Point2="60,300" 
                        	Point3="400,300"/>
                    </PathFigure>
                </PathGeometry>
            </Path.Data>
        </Path>

在这里插入图片描述其中p1 和 p2 是控制点,p0 和 p3 为曲线的起点和终点。而二次方和三次方贝塞尔曲线类似,只不过控制点变成了一个,XAML代码如下:

 <Path Stroke="Green" StrokeThickness="6" Margin="30" Grid.Column="2" Grid.Row="1">
            <Path.Data>
                <PathGeometry>
                    <PathFigure StartPoint="100,100">
                        <QuadraticBezierSegment Point1="200,-100" Point2="200,300"/>
                    </PathFigure>
                </PathGeometry>
            </Path.Data>
        </Path>

在这里插入图片描述接下来就是使用 GeometryGroup 将多个贝塞尔曲线组合在一起 形成更复杂的图形,XAML代码如下:

  <Path Stroke="Black" Fill="LightBlue" StrokeThickness="1" Grid.Column="3" Grid.Row="0">
            <Path.Data>
                <GeometryGroup>
                    <PathGeometry>
                        <PathFigure StartPoint="0,0">
                            <BezierSegment Point1="250,0" Point2="50,200" Point3 ="300,200"/>
                        </PathFigure>
                    </PathGeometry>

                    <PathGeometry>
                        <PathFigure StartPoint="0,0">
                            <BezierSegment Point1="230,0" Point2="50,200" Point3 ="300,200"/>
                        </PathFigure>
                    </PathGeometry>

                    <PathGeometry>
                        <PathFigure StartPoint="0,0">
                            <BezierSegment Point1="210,0" Point2="50,200" Point3 ="300,200"/>
                        </PathFigure>
                    </PathGeometry>

                    <PathGeometry>
                        <PathFigure StartPoint="0,0">
                            <BezierSegment Point1="190,0" Point2="50,200" Point3 ="300,200"/>
                        </PathFigure>
                    </PathGeometry>

                    <PathGeometry>
                        <PathFigure StartPoint="0,0">
                            <BezierSegment Point1="170,0" Point2="50,200" Point3 ="300,200"/>
                        </PathFigure>
                    </PathGeometry>

                    <PathGeometry>
                        <PathFigure StartPoint="0,0">
                            <BezierSegment Point1="150,0" Point2="50,200" Point3 ="300,200"/>
                        </PathFigure>
                    </PathGeometry>

                    <PathGeometry>
                        <PathFigure StartPoint="0,0">
                            <BezierSegment Point1="130,0" Point2="50,200" Point3 ="300,200"/>
                        </PathFigure>
                    </PathGeometry>

                </GeometryGroup>
            </Path.Data>
        </Path>

实现效果如下:
在这里插入图片描述

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

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

相关文章

致敬逆行者网页设计作品 大学生抗疫感动专题网页设计作业模板 疫情感动人物静态HTML网页模板下载

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

RPC 对比 HTTP

初识RPC RPC 远程方法调用&#xff08;Remote Procedure Call&#xff09;大多用在服务治理领域 基本都是分布式环境中的注册中心来负责新服务的注册、服务续约、服务下线、服务销毁国内 Dubbo 是应用最广的 RPC 框架国外 gRPC RPC协议 无论哪种RPC方案&#xff0c;都要自定义…

你好,法语!A2知识点总结(3)

3.句型 3.1疑问 注意1 主谓倒装的疑问句式&#xff0c;主语必须是代词。 •主语是名词&#xff0c;不能直接倒装&#xff0c;要人为加进去一个代替主语的代词放在动词后面&#xff0c;“-”连接 •EX: Votre pre est professeur? •Est-votre pre professeur? •Votre pre e…

Kafka的设计原理

Kafka的设计原理和使用场景一、Kafka简介二、Kafka的架构2.1、Kafka 一些重要概念2.2、工作流程2.3、副本原理2.4、分区和主题的关系2.5、生产者2.5.1、分区可以水平扩展2.5.2、分区策略2.6、消费者2.6.1、消费方式2.6.2、分区分配策略2.7、数据可靠性保证2.7.1、副本数据同步策…

Linux基础知识

目录 流行的Linux发行版本 Linux系统的启动顺序 禁止使用ping命令 鉴定故障解决办法 user 不在 sudoers 文件中。此事将被报告解决办法 修改文件或目录的所属用户与权限 1、chgrp&#xff1a;更改文件属组 2、chown&#xff1a;更改文件属主&#xff0c;也可以同时更改文…

Agent 与对象的辨析

如果说对象是70年代以来软件界最激动人心的革新之一&#xff0c;那么&#xff0c;Agent的相关理论和技术&#xff0c;为分布式开放系统的设计与实现提供了新的途径&#xff0c;可以称之为软件开发的又一重大突破。讨论问题的前提是概念的澄清&#xff0c;什么是对象&#xff1f…

【学习笔记49】JavaScript的this指向

一、this指向 每一个函数内部都有一个关键字thisthis的值, 和函数的调用有关, 与函数书写无关 1. 普通调用方式 一个普通的全局函数, 在正常调用的情况下, this window function fn() {console.log(this); }fn() // this window2. 函数放置到对象 如果将函数放置到对象…

图数据技术护航网络安全 - Neo4j 大中华区总经理 方俊强

网络数字化及人工智能为许多行业来革命性的进步&#xff0c;但与此同时&#xff0c;网络安全领域产生的问题也日益严峻。人工智能进攻性风险和网络威胁领域的发展正在重新定义企业安全&#xff0c;从而给企业带来了更高的挑战。如何守护网络安全&#xff0c;成为企业深化数字化…

CSDN第十一场竞赛

目录 1.比赛详情 2.竞赛详情 3.原题回顾 (1).圆小艺 思路模拟 代码实现 (2). K皇把妹 思路模拟 代码实现 (3).筛选宝物 思路模拟 代码实现 (4).圆桌 思路模拟 代码实现 4.总结 1.比赛详情 报名地址&#xff1a;https://edu.csdn.net/contest/detail/24?utm_sou…

目标检测论文解读复现之二十:基于改进Yolov5的地铁隧道附属设施与衬砌表观病害检测方法

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0…

14个SpringBoot优化小妙招

1. 定义配置文件信息 有时候我们为了统一管理会把一些变量放到 yml 配置文件中 例如 用 ConfigurationProperties 代替 Value 使用方法 定义对应字段的实体 Data // 指定前缀 ConfigurationProperties(prefix "developer") Component public class DeveloperPro…

力扣(LeetCode)813. 最大平均值和的分组(C++)

动态规划 本题需要用到前缀和&#xff0c;前缀和需要将下标 iii 后移一位&#xff0c;所以我们将状态的下标 iii 也后移一位&#xff1b;由于状态转移依赖于 j−1j-1j−1 &#xff0c;我们将 jjj 的下标后移一位。 class Solution { public:double largestSumOfAverages(vecto…

2022天梯赛练习集(2022.9-2022.10)

使用函数判断完全平方数 没有加&#xff08;int&#xff09;过不了 int IsSquare(int n){if((int)sqrt(n) * sqrt(n) ! n) return 0;else return 1; } 使用函数求余弦函数的近似值 double funcos(double e, double x){double sum 1, item 1;for(int i 0; fabs(item) >…

Tmuxs -高效使用Linux terminal

Tmuxs -高效使用Linux terminal前言what&#xff1f;重要概念安装Tmux 常用命令Tmux 常用内部命令窗口&#xff08;window&#xff09;指令&#xff1a;面板&#xff08;pane&#xff09;指令&#xff1a;如何用鼠标调整pane大小配置生效参考配置参考前言 这个利器绝对可以提升…

eMMC编程基础 -(二)eMMC基础介绍

eMMC编程基础 -&#xff08;二&#xff09;eMMC基础介绍1 eMMC 简介1.1 eMMC系统概述1.2 eMMC 的整体架构如下图片所示&#xff1a;2 Flash Memory1 eMMC 简介 eMMC 是 embedded MultiMediaCard 的简称。 eMMC 是对 MMC 的一个拓展&#xff0c;以满足更高标准的性能、成本、体…

文件包含笔记

很多语言支持使用包含文件&#xff0c;这样允许开发者把可重复使用的代码存入单个文件中&#xff0c;在未来需要使用时&#xff0c;将它包含在其他代码文件中即可使用。 如果是像 C/C 这种编译语言&#xff0c;即使可以包含任意文件&#xff0c;若没有调用其中函数也不会有什么…

【从零开始学微服务】05.微服务的优势和不足

大家好&#xff0c;欢迎来到万猫学社&#xff0c;跟我一起学&#xff0c;你也能成为微服务专家。 没有“银弹” 在一些电影中&#xff0c;“银弹”被视作能迅速杀死狼人的武器&#xff0c;是杀死狼人的灵丹妙药。“银弹”常被比喻为解决复杂问题的良方或高招。 由于软件的复杂…

11.27

一.进制转换 这道题的思路就是先把每个数模对应的进制.再除以,就得到对应的, 因为可能会有16进制,所以直接弄一个字符串数组,按照"0123456789ABCDEF"顺序存储,再用模找里面对应的就可以了 但是有可能是负数,所以我们需要在此之前判断一下 如果用字符串临时拼接会产…

2008年武汉高校630操作系统真题B卷

操作系统————核心系统软件 竞争计算机系统资源的基本单位————进程 UNIX————分时操作系统 操作系统中必不可少的调度————进程调度 进程和程序的本质区别————前者是动态后者是静态 磁带————顺序存储文件 某进程在运行过程中需要等待从磁盘上读入数…

tensorflow-serving docker模型部署(以mnist为例)

✨ 博客主页&#xff1a;小小马车夫的主页 ✨ 所属专栏&#xff1a;Tensorflow 文章目录前言一、环境介绍二、tensorflow-serving docker安装三、单模型部署 (以官方demo saved_model_half_plus_two_cpu为例)1、docker模型部署2、python requests模型预测四、多模型部署 (以mni…