【学习笔记】Windows GDI绘图(五)图形路径GraphicsPath详解(上)

文章目录

  • 图形路径GraphicsPath
  • 填充模式FillMode
  • 构造函数
    • GraphicsPath()
    • GraphicsPath(FillMode)
    • GraphicsPath(Point[],Byte[])和GraphicsPath(PointF[], Byte[])
    • GraphicsPath(Point[], Byte[], FillMode)和GraphicsPath(PointF[], Byte[], FillMode)
    • PathPointType
  • 属性
    • FillMode
    • PathData
    • PathPoints、PathTypes
    • PointCount
  • 方法
    • AddArc添加椭圆弧
    • AddBezier添加贝赛尔曲线
    • AddClosedCurve添加封闭基数样条曲线
    • AddCurve添加基数样条曲线(开放)
    • AddEllipse添加椭圆
    • AddLine添加线段

图形路径GraphicsPath

定义:表示一系列相连的线段和曲线。

namespace System.Drawing.Drawing2D;

public sealed unsafe class GraphicsPath : MarshalByRefObject, ICloneable, IDisposable

应用程序使用路径绘制形状的轮廓、填充内部和创建剪裁区域(clipping regions)。
图形引擎在世界坐标空间中维护路径中几何形状的坐标。

一个路径可以由任意数量的图形(子路径)组成。每个图形由一系列连接的线段和曲线组成,或由一个几何形状基本体组成。

一个由一系列连接的线段和曲线组成的图形(起点和终点可能合重合)是一个开放的图形,除非它被显式定义为封闭图形。可以使用CloseFigure方法显示地封闭一个图形,该方法通过从终点到起点连接一条线来封闭当前图形。

由几何形状基本体组成的图形是一个封闭的图形。

为了填充和剪切,所有开放图形都会通过在力的起点和终点之间添加一条线来封闭。

当创建路径或封闭图形时,会隐藏地启动一个新图形。当调用StartFigure方法时,会显式地创建一个新图形。

当将几何形状基本体添加到路径时,它会添加一个包含该几何形状的图形,并隐式地启动一个新图形。因此,路径中总是存在一个当前图形,当将线段和曲线添加到路径时,会根据需要隐式地添加一条线,以连接当前图形的终点与新线段或曲线的起点,从而形成一系列连接的线段和曲线。

图形具有描述如何从起点到终点之间的线段与曲线的方向。该方向由线段和曲线添加的顺序或由几何体形状基本体定义。方向用于确定剪裁和填充路径的内部。
全文图像
全文图像

填充模式FillMode

解释GraphicsPath前,先说明下路径的两种填充方式 Alternate交替模式 和 Winding绕线模式
这两种填充模式都使用奇偶规则来确定如何填充封闭路径。

路径填充模式
Allternate:

  1. 从你感兴趣的点画一条射线(通常是水平线)。
  2. 数一下射线与路径的边相交的次数。
  3. 如果交点数是奇数,点在路径内部;如果是偶数,点在路径外部。

Winding:

  1. 从你感兴趣的点画一条射线(通常是水平线)。
  2. 对射线与路径的每一个相交点,根据相交时路径边界的方向(顺时针或逆时针)进行计数:
    • 如果边界从下到上穿过射线,加1。
    • 如果边界从上到下穿过射线,减1。
  3. 如果最终计数结果不是0,则该点在路径内部;如果是0,则该点在路径外部。
[System.ComponentModel.Description("路径填充模式示例")]
public void Demo05_01(PaintEventArgs e)
{
    //生成五角星的顶点
    var pts = CalculateStarPoints(200, 200, 200, 5);
    //默认填充方式:Alternate
    using (var path = new GraphicsPath())
    {
        path.AddLines(pts);
        path.CloseFigure();
        e.Graphics.DrawPath(Pens.Black, path);
        e.Graphics.FillPath(Brushes.Green, path);

        //标志顶点顺序
        using (var font = new Font("Times New Roman", 15))
        {
            for (int i = 0; i < pts.Length; i++)
            {
                e.Graphics.DrawString(i.ToString(), font, Brushes.Red, pts[i]);
            }
        }

        //修改填充方式
        path.FillMode = FillMode.Winding;
        using (var matrix = new Matrix())
        {
            matrix.Translate(300, 0);
            path.Transform(matrix);
            e.Graphics.DrawPath(Pens.Black, path);
            e.Graphics.FillPath(Brushes.Red, path);
        }
    }
}

构造函数

GraphicsPath()

原型:

public GraphicsPath ();//默认FillMode为Alternate

构造一个填充方式为Alternate的GraphicsPath实例。

GraphicsPath(FillMode)

原型:

public GraphicsPath (System.Drawing.Drawing2D.FillMode fillMode);

构造一个指定填充方式的GraphicsPath实例。

GraphicsPath(Point[],Byte[])和GraphicsPath(PointF[], Byte[])

原型:

public GraphicsPath (System.Drawing.Point[] pts, byte[] types);
public GraphicsPath (System.Drawing.PointF[] pts, byte[] types);

通过指定点集和点集路径类型生成GraphicsPath实例,填充方式为Alternate

GraphicsPath(Point[], Byte[], FillMode)和GraphicsPath(PointF[], Byte[], FillMode)

原型:

public GraphicsPath (System.Drawing.Point[] pts, byte[] types, System.Drawing.Drawing2D.FillMode fillMode);
public GraphicsPath (System.Drawing.PointF[] pts, byte[] types, System.Drawing.Drawing2D.FillMode fillMode);

通过指定点集和点集路径类型生成GraphicsPath实例,并可指定填充方式

//定义点集
var pts = new PointF[]
{
    new PointF(100,100),
    new PointF(200,250),
    new PointF(300,270),
    new PointF(350,360),                
    new PointF(270,400)
};
//绘制点和点的序号
using (var font = new Font("Times New Roman", 15))
{
    for (int i = 0; i < pts.Length; i++)
    {
        var pt = pts[i];
        e.Graphics.FillEllipse(Brushes.Red, pt.X-5, pt.Y-5, 10, 10);
        e.Graphics.DrawString(i.ToString(), font, Brushes.Black, pt);
    }
}
//定义路径点类型
var types = new byte[]
{
    (byte)PathPointType.Start,
    (byte)PathPointType.Line,
    (byte)PathPointType.Bezier,
    (byte)PathPointType.Bezier,
    (byte)PathPointType.Bezier
};
using(var graphicsPath=new GraphicsPath(pts,types))
{
    e.Graphics.DrawPath(Pens.Black,graphicsPath);
}

构造GraphicsPath

PathPointType

类型
Bezier3默认贝赛尔曲线
Bezier33三次贝赛尔曲线
CloseSubPath128子路径的终点
DashMode16相应的线段是虚线
Line1画线
PathMarker32路径标记
PathTypeMask7用于屏蔽路径类型的高位
Start0路径的起点

属性

FillMode

原型:

public System.Drawing.Drawing2D.FillMode FillMode { get; set; }

获取或设置GraphicsPath的填充方式

PathData

原型:

public System.Drawing.Drawing2D.PathData PathData { get; }

获取该路径的点(Points)与类型(Types)数组。

var rect1 = new Rectangle(200, 100, 250, 150);
var rect2 = new Rectangle(460, 100, 250, 150);
using (var graphicsPath = new GraphicsPath())
{
    graphicsPath.AddRectangle(rect1);
    graphicsPath.AddEllipse(rect2);
    e.Graphics.DrawPath(Pens.Black, graphicsPath);

    var pathData = graphicsPath.PathData;
    var pts = pathData.Points;
    var types = pathData.Types;
    int offset = 20;
    using (var font = new Font("Times New Roman", 15))
    {
        for (int i = 0; i < pathData.Points.Length; i++)
        {
            var pt = pts[i];
            e.Graphics.FillEllipse(Brushes.Red, pt.X - 5, pt.Y - 5, 10, 10);
            e.Graphics.DrawString(i.ToString(), font, Brushes.Black, pt);
            DrawString(e, $"({pt.X},{pt.Y}) type:{types[i]}", ref offset);
        }
    }
}

PathData示例

PathPoints、PathTypes

等价于PathData的Points和Types

PointCount

原型:

public int PointCount { get; }

获取路径点集或类型的个数。

方法

AddArc添加椭圆弧

原型:

public void AddArc (float x, float y, float width, float height, float startAngle, float sweepAngle);
public void AddArc (int x, int y, int width, int height, float startAngle, float sweepAngle);
public void AddArc (System.Drawing.Rectangle rect, float startAngle, float sweepAngle);
public void AddArc (System.Drawing.RectangleF rect, float startAngle, float sweepAngle);

通过定义一个矩形来确定椭圆,再通过起始角度(x轴顺时针开始)和经过的角度,来确定一条椭圆弧线。

var rect = new Rectangle(200, 100, 300, 200);
using (var graphicsPath = new GraphicsPath())
{
    //从x轴顺时针30度开始,共画180度的弧
    graphicsPath.AddArc(rect, 30, 180);
    e.Graphics.DrawPath(Pens.Red, graphicsPath);

    graphicsPath.Reset();
    //从210度开始,共画180度的弧
    graphicsPath.AddArc(rect.Left, rect.Top, rect.Width, rect.Height, 30 + 180, 180);
    e.Graphics.DrawPath(Pens.LightGreen, graphicsPath);

    e.Graphics.DrawRectangle(Pens.Black, rect);
    e.Graphics.FillEllipse(Brushes.Red, (rect.Left + rect.Right) / 2f - 3, (rect.Top + rect.Bottom) / 2f - 3, 6, 6);
}

画一条红色的椭圆弧从30°到210°,再画一条亮绿的椭圆弧从210°到30°,刚好形成一个椭圆。
AddArc

AddBezier添加贝赛尔曲线

原型:

public void AddBezier (System.Drawing.Point pt1, System.Drawing.Point pt2, System.Drawing.Point pt3, System.Drawing.Point pt4);
public void AddBezier (System.Drawing.PointF pt1, System.Drawing.PointF pt2, System.Drawing.PointF pt3, System.Drawing.PointF pt4);
public void AddBezier (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
public void AddBezier (float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4);

通过添加4个点(1个起始点,2个控制点,1个终止点)来生成一条三次贝赛尔曲线。

// 定义贝塞尔曲线的四个控制点
Point[] bezierPoints = new Point[]
{
    new Point(50, 200),    // 起点
    new Point(150, 50),    // 控制点1
    new Point(250, 350),   // 控制点2
    new Point(350, 200)    // 终点
};
using (var path = new GraphicsPath())
{
    //绘制三次贝赛尔曲线
    path.AddBezier(bezierPoints[0], bezierPoints[1], bezierPoints[2], bezierPoints[3]);
    e.Graphics.DrawPath(Pens.LightGreen, path);

    //绘制四个点
    foreach (var pt in bezierPoints)
    {
        e.Graphics.FillEllipse(Brushes.Red, pt.X - 3, pt.Y - 3, 6, 6);
    }
    e.Graphics.DrawLine(Pens.Red, bezierPoints[0], bezierPoints[1]);
    e.Graphics.DrawLine(Pens.Red, bezierPoints[2], bezierPoints[3]);
}

定义四个点,生成一条贝赛尔曲线
AddBezier

AddClosedCurve添加封闭基数样条曲线

原型:

public void AddClosedCurve (params System.Drawing.Point[] points);//默认tension=0.5f
public void AddClosedCurve (params System.Drawing.PointF[] points);//默认tension=0.5f
public void AddClosedCurve (System.Drawing.Point[] points, float tension);
public void AddClosedCurve (System.Drawing.PointF[] points, float tension);

添加经过给定点集的基数样条曲线,可通过tension控制曲线的弯曲程度(0至1之间,0最尖锐,1最平滑)

// 定义贝四个点
Point[] pts = new Point[]
{
    new Point(50, 200),    
    new Point(150, 50),    
    new Point(250, 350),   
    new Point(350, 200)    
};
using (var path = new GraphicsPath())
{

    path.AddClosedCurve(pts);
    e.Graphics.DrawPath(Pens.LightGreen, path);

    path.Reset();
    path.AddClosedCurve(pts,0.25f);
    e.Graphics.DrawPath(Pens.Red, path);

    path.Reset();
    path.AddClosedCurve(pts, 0.75f);
    e.Graphics.DrawPath(Pens.Black, path);

    //绘制四个点
    foreach (var pt in pts)
    {
        e.Graphics.FillEllipse(Brushes.Red, pt.X - 3, pt.Y - 3, 6, 6);
    }
}

给定4个点(与前面贝赛尔曲线相同的四个点),生成不同tension的基数样条曲线。
AddClosedCurve

AddCurve添加基数样条曲线(开放)

原型:

public void AddCurve (System.Drawing.PointF[] points, int offset, int numberOfSegments, float tension);
public void AddCurve (System.Drawing.Point[] points, int offset, int numberOfSegments, float tension);
public void AddCurve (System.Drawing.PointF[] points, float tension);
public void AddCurve (params System.Drawing.Point[] points);//默认tension=0.5
public void AddCurve (params System.Drawing.PointF[] points);//默认tension=0.5
public void AddCurve (System.Drawing.Point[] points, float tension);
参数说明
points待绘制基数样条要经过的点
offset从第几个点开始画曲线(序号为0开始)
numberOfSegments要画几段(两个点之间为1段)曲线
offset+numberOfSegments<=points的个数-1
tension张力系数,指定曲线在控制点之间弯曲量的值,在0到1之间。
大于 1 的值会产生不可预测的结果。

两个基数样条控制点之间的曲线,其它也是一段贝赛尔曲线。
具体算法见下面示例。
通过AddCurve和DrawBezier绘制相同的基数样条曲线。

[System.ComponentModel.Description("GraphicsPath的AddCurve方法Curve转Bezier")]
public void Demo05_07(PaintEventArgs e)
{
    Point[] controlPoints = {
                    new Point(50, 150), // 控制点1
                    new Point(150, 50), // 控制点2
                    new Point(250, 250), // 控制点3
                    new Point(350, 100),  // 控制点4
                    new Point(450, 150)  // 控制点5
                    };
    //绘制基数样条曲线的控制点
    foreach (var pt in controlPoints)
    {
        e.Graphics.DrawEllipse(Pens.DarkRed, pt.X - 10, pt.Y - 10, 20, 20);
    }
    using (var path=new GraphicsPath())
    {
        float tension = 0.8f;
        path.AddCurve(controlPoints, tension);
        // 绘制基数样条曲线
        e.Graphics.DrawPath(new Pen(Color.LightGreen, 7), path);

        // 将基数样条曲线转换为贝赛尔曲线后再绘制
        for (int i = 0; i < controlPoints.Length - 1; i++)
        {
            PointF[] bezierPoints = CurveToBezier(
                i > 0 ? controlPoints[i - 1] : controlPoints[i],
                controlPoints[i],
                controlPoints[i + 1],
                i < controlPoints.Length - 2 ? controlPoints[i + 2] : controlPoints[i + 1],
                tension
            );
            //curve转bezier
            e.Graphics.DrawBezier(Pens.Black, bezierPoints[0], bezierPoints[1], bezierPoints[2], bezierPoints[3]);
        }

        //绘制路径所有控制点
        var dataPoints = path.PathPoints;
        foreach(var pt in dataPoints)
        {
            e.Graphics.FillEllipse(Brushes.DarkViolet, pt.X - 5, pt.Y - 5, 10, 10);
        }
    }
}
/// <summary>
/// 将四个基数样条控制点转换为贝塞尔曲线控制点
/// </summary>
/// <param name="p0"></param>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <param name="p3"></param>
/// <param name="tension">张力系数(0~1)之间</param>
/// <returns></returns>
private PointF[] CurveToBezier(PointF p0, PointF p1, PointF p2, PointF p3, float tension = 0.5f)
{
    float t = tension / 3;

    return new PointF[]
    {
        p1,
        new PointF(p1.X + t * (p2.X - p0.X), p1.Y + t * (p2.Y - p0.Y)),
        new PointF(p2.X - t * (p3.X - p1.X), p2.Y - t * (p3.Y - p1.Y)),
        p2
    };
}

Curve转Bezier
一样定义多个控制点,分多次绘制基数样条曲线

Pen penRed = new Pen(Color.Red, 3);
Pen penLightGreen = new Pen(Color.Green, 1);

[System.ComponentModel.Description("GraphicsPath的AddCurve方法分段绘制")]
public void Demo05_08(PaintEventArgs e)
{
    Point[] controlPoints = {
                    new Point(50, 150), // 控制点1
                    new Point(150, 50), // 控制点2
                    new Point(250, 250), // 控制点3
                    new Point(350, 100),  // 控制点4
                    new Point(450, 150)  // 控制点5
                    };
    //绘制基数样条曲线的控制点
    foreach (var pt in controlPoints)
    {
        e.Graphics.DrawEllipse(Pens.DarkRed, pt.X - 10, pt.Y - 10, 20, 20);
    }
    using (var path = new GraphicsPath())
    {
        float tension = 0.8f;
        //从第1个点开始,绘制3段基数样条曲线
        path.AddCurve(controlPoints,0,3,tension);
        e.Graphics.DrawPath(penRed, path);

        path.Reset();
        //从第2个点开始,绘制3段基数样条曲线
        path.AddCurve(controlPoints, 1, 3, tension);
        e.Graphics.DrawPath(penLightGreen, path);
    }
}

分段绘制基数样条曲线

AddEllipse添加椭圆

原型:

public void AddEllipse (System.Drawing.Rectangle rect);
public void AddEllipse (System.Drawing.RectangleF rect);
public void AddEllipse (int x, int y, int width, int height);
public void AddEllipse (float x, float y, float width, float height);

通过定义矩形来确定一个椭圆路径

var rect = new RectangleF(100, 100, 200, 150);

using (var path = new GraphicsPath())
{
    //添加椭圆路径
    path.AddEllipse(rect);
    e.Graphics.DrawPath(penRed, path);

    e.Graphics.DrawRectangle(penLightGreen,rect.X, rect.Y, rect.Width, rect.Height);
}

绘制一个矩形包着的椭圆
椭圆

AddLine添加线段

原型:

public void AddLine (int x1, int y1, int x2, int y2);
public void AddLine (float x1, float y1, float x2, float y2);
public void AddLine (System.Drawing.Point pt1, System.Drawing.Point pt2);
public void AddLine (System.Drawing.PointF pt1, System.Drawing.PointF pt2);

通过定义两个点的坐标,添加一条线段。

using (var path = new GraphicsPath())
{
    path.AddLine(150, 150, 300, 300);
    path.AddLine(300, 300, 0, 300);
    path.AddLine(0, 300, 150, 150);

    e.Graphics.DrawPath(penRed, path);
}

添加三条线段围成一个三角形
AddLine

内容太多,另起一篇吧!
【学习笔记】Windows GDI绘图目录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DAMA:数据治理 CDGA/CDGP 认证考试备考经验分享

一、关于DAMA中国和CDGA/CDGP考试 国际数据管理协会&#xff08;DAMA国际&#xff09;是一个全球性的专业组织&#xff0c;由数据管理和相关的专业人士组成&#xff0c;非营利性机构&#xff0c;厂商中立。协会自1980年成立以来&#xff0c;一直致力于数据管理和数字化的研究、…

IJNM-International Journal of Network Management 智能网络管理

文章目录 一、期刊简介二、征稿信息三、期刊表现四、投稿须知五、投稿咨询 一、期刊简介 International Journal of Network Management 是一本网络管理领域的研究人员、开发人员和从业人员向国际观众展示其工作的论坛。该杂志致力于传播信息&#xff0c;这将改善计算机网络和…

leetcode-55 跳跃游戏

leetcode Problem: 55. 跳跃游戏 思路 假设我们是一个小人&#xff0c;从第一个下标开始&#xff0c;每次经过一个位置&#xff0c;我们就可以根据当前位置的数值nums[i]和位置下标i计算出该位置所能到达的后续位置的最大值rnums[i]i。而这个r之前的区域一定都是可以经过的。…

信息系统项目管理师0128:输出(8项目整合管理—8.6管理项目知识—8.6.3输出)

点击查看专栏目录 文章目录 8.6.3 输出 8.6.3 输出 经验教训登记册 经验教训登记册可以包含执行情况的类别和详细的描述&#xff0c;还可包括与执行情况相关的影响、建议和行动方案。经验教训登记册可以记录遇到的挑战、问题、意识到的风险和机会以及其他适用的内容。经验教训…

阴影映射(线段树)

实时阴影是电子游戏中最为重要的画面效果之一。在计算机图形学中&#xff0c;通常使用阴影映射方法来实现实时阴影。 游戏开发部正在开发一款 2D 游戏&#xff0c;同时希望能够在 2D 游戏中模仿 3D 游戏的光影效果&#xff0c;请帮帮游戏开发部&#xff01; 给定 x-y 平面上的…

如何在cPanel面板中开启盗链保护

本周有一个客户&#xff0c;购买Hostease的主机&#xff0c; 客户购买的是Linux虚拟主机&#xff0c;带cPanel面板的。询问我们的在线客服&#xff0c;如何可以防止他的网站上的图片不被盗用。cPanel的盗链保护功能可以帮助客户防止图片被盗链。 盗链&#xff08;Hotlinking&a…

11.【Orangepi Zero2】基于Linux的智能垃圾桶项目

基于Linux的垃圾分类项目 功能需求 语音接入控制垃圾分类识别&#xff0c;并触发垃圾桶的开关盖 回顾二阶段的Socket编程&#xff0c;实现Sockect发送指令远程控制垃圾分类识别&#xff0c;并触发垃圾桶的开关盖 图像识别垃圾分类功能 语音播报垃圾物品类型 OLED显示垃圾物…

五分钟”手撕“图书管理系统

前言&#xff1a; 图书馆管理系统需要结合JavaSE的绝大部分知识&#xff0c;是一个很好的训练项目。 为了让大家更加方便的查阅与学习&#xff0c;我把代码放开头&#xff0c;供大家查询。 还有对代码的分析&#xff0c;我将以类为单位分开讲解。 目录 全部代码 Main类 Us…

wordpress主题模板兔Modown 9.1开心版附送erphpdown v17.1插件

Modown 9.1开心版是一款模板兔开发的wordpress主题可&#xff0c;持续更新多年&#xff0c;优秀的资源下载类主题该模板基于Erphpdown&#xff0c;可以销售软件、视频教程、文章等等&#xff0c;通过主题和插件结合可以实现付费下载、付费阅读等功能&#xff0c;配合模板兔的一…

C++中获取int最大与最小值

不知道大家有没有遇到过这种要求&#xff1a;“返回值必须是int&#xff0c;如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1] &#xff0c;需要截断这个整数&#xff0c;使其保持在这个范围内。例如&#xff0c;小于 −2^31 的整数应该被固定为 −2^31 &#xff0c;大…

Pytest框架实战二

在Pytest框架实战一中详细地介绍了Pytest测试框架在参数化以及Fixture函数在API测试领域的实战案例以及具体的应用。本文章接着上个文章的内容继续阐述Pytest测试框架优秀的特性以及在自动化测试领域的实战。 conftest.py 在上一篇文章中阐述到Fixture函数的特性&#xff0c;第…

信息系统项目管理师0129:输入(8项目整合管理—8.7监控项目工作—8.7.1输入)

点击查看专栏目录 文章目录 8.7 监控项目工作8.7.1 输入8.7 监控项目工作 监控项目工作是跟踪、审查和报告整体项目进展,以实现项目管理计划中确定的绩效目标的过程。本过程的主要作用: 让干系人了解项目的当前状态并认可为处理绩效问题而采取的行动;通过成本和进度预测,让…

VTK9.2.0+QT5.14.0绘制三维显示背景

背景 上一篇绘制点云的博文中&#xff0c;使用的vtkCameraOrientationWidget来绘制的坐标轴&#xff0c;最近又学习到两种新的坐标轴绘制形式。 vtkOrientationMarkerWidget vtkAxesActor 单独使用vtkAxesActor能够绘制出坐标轴&#xff0c;但是会随着鼠标操作旋转和平移时…

弱监督语义分割-对CAM的生成过程进行改进3

三、擦除图像高响应部分以获取更多的分割领域 ECS-Net: Improving Weakly Supervised Semantic Segmentation by Using Connections Between Class Activation Maps&#xff08;ICCV,2021&#xff09; 1.引言 我们首先从图像中擦除高响应区域&#xff0c;并生成这些擦除图像…

Java进阶学习笔记2——static

static&#xff1a; 叫静态&#xff0c;可以修饰成员变量、成员方法。 成员变量按照有无static修饰&#xff0c;分为两种&#xff1a; 类变量&#xff1a;有static修饰&#xff0c;属于类&#xff0c;在计算机中只有一份&#xff0c;会被类的全部对象共享。静态成员变量。 实…

[Algorithm][动态规划][路径问题][下降路径最小和][最小路径和][地下城游戏]详细讲解

目录 1.下降路径最小和1.题目链接2.算法原理详解3.代码实现 2.最小路径和1.题目链接2.算法原理详解3.代码实现 3.地下城游戏1.题目链接2.算法原理详解3.代码实现 1.下降路径最小和 1.题目链接 下降路径最小和 2.算法原理详解 思路&#xff1a; 确定状态表示 -> dp[i][j]的…

CAN总线的终端电阻为什么要分布在两端?

CAN总线的终端节点需要分布在两端&#xff0c;主要是为了防止信号反射。 在任何传输线路中&#xff0c;当信号传输到线路的末端时&#xff0c;如果末端没有被正确匹配&#xff0c;就会产生反射信号。这个反射信号会沿着原来的路线返回&#xff0c;与原来的信号叠加&#xff0c;…

LINUX系统编程:命名管道

匿名管道的通信只能在&#xff0c;有血缘关系的进程中&#xff0c;本质就是&#xff0c;子进程会拷贝一份父进程的文件描述符表&#xff0c;父子进程就可以看到操作系统的同一块资源&#xff08;文件&#xff09;&#xff0c;以这块资源为媒介进行通信。 命名管道&#xff0c;…

C++ (week4):Linux基础

文章目录 零、Linux简介1.配置环境2.Linux历史3.Linux模型 一、vim二、Linux命令行 (shell命令)1.常用命令与快捷键(1)常用命令①man命令&#xff1a;查看帮助手册 (2)快捷键 2.用户子系统(1)Linux用户(2)用户命令 3.文件子系统命令(1)目录命令1.创建文件&#xff1a;mkdir2.删…

15、24年--信息系统管理——管理要点

1、数据管理 数据管理使指通过规划、控制与提供数据和信息资产的职能,包括开发、执行和监督有关数据的计划、策略、方案、项目、流程、方法和程序,以获取、控制、保护、交付和提高数据和信息资产价值。 DCMM定义了数据战略、数据治理、数据架构、数据应用、数据安全、…