【学习笔记】Windows GDI绘图(九)Graphics详解(上)

news2025/1/21 10:11:59

文章目录

  • Graphics 定义
    • 创建Graphics对象的方法
    • 通过Graphics绘制不同的形状、线条、图像和文字等
    • 通过Graphics操作对象坐标
  • Graphics属性
    • Clip(裁切/绘制区域)
    • ClipBounds获取裁切区域矩形范围
    • CompositiongMode合成方式
    • CompositingQuality渲染质量
    • DpiX和DpiY 水平、垂直分辨率
    • InterpolationMode插值模式
    • PageScale页面缩放
    • PixelOffsetMode像素偏移模式
    • RenderingOrigin绘制原点
    • SmoothingMode平滑方式
    • TextContrast 文本Gamma校正值 和 TextRenderingHint文本渲染方式
    • Transform变换矩阵
    • VisibleClipBounds可见裁切外接矩形

蓦然回首,写了这么多篇关于GDI+绘图的笔记,也一直在使用的Graphics对象,既然还没深入了解Graphics,在此补上吧。
(注意,本文中示例的方法都是在OnPaint事件中运行)
全文图像
Graphics详解上

Graphics 定义

public sealed class Graphics : MarshalByRefObject, IDisposable, System.Drawing.IDeviceContext

Graphics 类提供用于将对象绘制到显示设备的方法。 与 Graphics 特定设备上下文关联。

创建Graphics对象的方法

  • 通过对继承自 System.Windows.Forms.Control的对象调用 Control.CreateGraphics 方法
  • 通过处理控件的事件Control.Paint并访问 Graphics 类的 属性来获取 Graphics 对象System.Windows.Forms.PaintEventArgs
  • 使用 FromImage 方法从图像创建 Graphics 对象

通过Graphics绘制不同的形状、线条、图像和文字等

  • 提供DrawLine、 DrawArc、 DrawClosedCurve、DrawCurve、DrawEllipse、DrawPie、
    DrawPolygon、DrawBezier和 DrawRectangle等方法
  • 提供DrawImage、DrawImageUnscale、DrawIcon和DrawString等方法

通过Graphics操作对象坐标

操作Transform或执行相关矩阵变换

Graphics属性

Clip(裁切/绘制区域)

原型:

public System.Drawing.Region Clip { get; set; }

作用:获取或设置Grahics的裁切区域

var region1 = new Region(new Rectangle(105, 100, 200, 30));
var region2 = new Region(new Rectangle(315, 100, 215, 30));
//合并两个区域
region1.Union(region2);

//设置裁切(绘制区域)
e.Graphics.Clip = region1;

// 填充裁切区域
e.Graphics.FillRegion(Brushes.LightGreen, e.Graphics.Clip);

//演示裁切区域 
e.Graphics.DrawString("裁切区域外的文字是看不到的", new Font("黑体",
    28.0F, FontStyle.Regular), Brushes.Black, 90F, 90F);

设置两个裁切区域并填充颜色,将要输出的文字一部分在区域内,一部分在区域外,显示其效果。
Clip

ClipBounds获取裁切区域矩形范围

原型:

public System.Drawing.RectangleF ClipBounds { get; }

作用:获取Graphics的裁切区域的外包矩形。生成的矩形单位用PageUnit决定。
注意,当裁切区域是无限的时,返回的矩形是一个无意义的大矩形。需要确定区域是否为无限的,可通过IsInfinite判断。

int offset = 20;
if (e.Graphics.Clip.IsInfinite(e.Graphics))
{
    DrawString(e, $"Clip为无限区域", ref offset);
}
else
{
    //获取裁切区域
    var rect = e.Graphics.ClipBounds;
    DrawString(e, $"ClipBounds:({rect.X},{rect.Y},{rect.Width},{rect.Height})", ref offset);
    var rect2 = e.ClipRectangle;

    DrawString(e, $"ClipRectangle:({rect2.X},{rect2.Y},{rect2.Width},{rect2.Height})", ref offset);
    //默认的裁切区域就是控件的可见范围
    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(127,Color.LightGreen)), 
        new RectangleF(rect.X + 10, rect.Y + 10, rect.Width - 20, rect.Height - 20));
}

判断裁切区域是否为无限的,否则获取Graphics的裁切区域外接矩形,并四周各减去10像素后,填充。
ClipBounds

CompositiongMode合成方式

原型:

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

CompositingMode枚举

SourceCopy指定渲染颜色时,会覆盖背景颜色
SourceOver会与背景颜色混合,混合由正在渲染的颜色的Alpha分量决定
作用:获取或设置绘制图像时的合成方式(默认是SourceOver)。合成模式确定源图像中的像素是否覆盖或与背景像素组合。
注意:当TextRenderingHint为ClearTypeGridFit时,不能设为SourceCopy。
Graphics g = e.Graphics;
Rectangle rect = new Rectangle(150, 150, 200, 200);

// 设置背景颜色
g.Clear(Color.White);

// 使用半透明颜色绘制重叠矩形
using (Brush redBrush = new SolidBrush(Color.FromArgb(128, Color.Red)))         
using (Brush greenBrush = new SolidBrush(Color.FromArgb(128, Color.Green)))
using (Brush blueBrush = new SolidBrush(Color.FromArgb(128, Color.Blue)))
{
    var dy = 100f;
    var dx = (float)(dy / Math.Sqrt(3));
    // 设置合成模式为 SourceOver
    g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
    // 绘制三个圆填充红、绿、蓝
    g.FillEllipse(redBrush, rect);
    g.TranslateTransform(-dx, dy);
    g.FillEllipse(greenBrush, rect);
    g.TranslateTransform(2 * dx, 0);
    g.FillEllipse(blueBrush, rect);


    g.ResetTransform();
    g.TranslateTransform(360, 0);
    // 设置合成模式为 SourceCopy
    g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
    // 绘制三个圆填充红、绿、蓝
    g.FillEllipse(redBrush, rect);
    g.TranslateTransform(-dx, dy);
    g.FillEllipse(greenBrush, rect);
    g.TranslateTransform(2 * dx, 0);
    g.FillEllipse(blueBrush, rect);
}

使用不同的CompositingMode模式,绘制三原色红、绿、蓝的叠加效果。原本想实现三色光的效果,目前还没找到方法。
CompositingMode示例

CompositingQuality渲染质量

原型:

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

作用:获取或设置合成图像的渲染质量
CompositingQuality枚举

说明
AssumeLinear假设线性值
Default默认质量
GammaCorrected使用Gamma校正
HighQuality高质量、低速度
HighSpeed高速度、低质量
Invalid无效质量

当使用GammaCorredted时,用Gamma=2.2对图像数据进行转换。

Graphics g = e.Graphics;
Rectangle rect = new Rectangle(150, 150, 200, 200);

// 设置背景颜色
g.Clear(Color.White);

var width = 256;
var height = 256;
using (var bmp = new Bitmap("AIWoman.png"))
{
    var values = Enum.GetValues(typeof(CompositingQuality)) as CompositingQuality[];
    values = values.Where(z => z != CompositingQuality.Invalid).ToArray();

    for (int i = 0; i < values.Length; i++)
    {
        var quality = values[i];
        e.Graphics.CompositingQuality = quality;
        var sw = Stopwatch.StartNew();
        var times = 0;
        for (times = 0; times < 5; times++)
        {                        
            e.Graphics.DrawImage(bmp, 20 + 280 * (i % 3), 20 + 280 * (i / 3), width, height);
        }
        sw.Stop();
        e.Graphics.DrawString($"{quality},{sw.ElapsedMilliseconds}ms/{times}次", Font, Brushes.Red,
                new PointF(20 + 280 * (i % 3), 5 + 280 * (i / 3)));
    }
} 

用不同的CompositingQuality绘制图像。
AI美女测试图
质量上肉眼没看出多大区别,可能放大效果明显。(速度仅供参考)
CompositingQuality示例

DpiX和DpiY 水平、垂直分辨率

原型:

public float DpiX { get; }
public float DpiY { get; }

作用:获取水平和垂直的DPI。

InterpolationMode插值模式

原型:

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

作用:获取或设置Graphis的插值模式。
NearestNeighbor 是质量最低的模式,HighQualityBicubic 是质量最高的模式。

Graphics g = e.Graphics;
var width = 200;
var height = 200;
using (var bmp = new Bitmap("AIWoman.png"))
{
    var values = Enum.GetValues(typeof(InterpolationMode)) as InterpolationMode[];
    values = values.Where(z => z != InterpolationMode.Invalid).ToArray();

    long[] elapsed = new long[values.Length];
    var col = 4;
    var count = 5;
    for (int times = count - 1; times >= 0; times--)
    {
        for (int i = 0; i < values.Length; i++)
        {
            var interpolation = values[i];
            e.Graphics.InterpolationMode = interpolation;
            var sw = Stopwatch.StartNew();
            e.Graphics.DrawImage(bmp, 20 + 220 * (i % col), 20 + 220 * (i / col), width, height);
            sw.Stop();
            elapsed[i] += sw.ElapsedMilliseconds;
            if (times == 0)
            {
                e.Graphics.DrawString($"{interpolation},{elapsed[i]}ms/{count}次", Font, Brushes.Red,
                                        new PointF(20 + 220 * (i % col), 5 + 220 * (i / col)));
            }
        }
    }
}
e.Graphics.DrawString($"DpiX={e.Graphics.DpiX},DpiY={e.Graphics.DpiY}", Font, Brushes.Red, new PointF(100, 500));

用不同的InterpolationMode绘制图像,(速度仅供参考)
InterpolationMode

PageScale页面缩放

原型:

public float PageScale { get; set; }

作用:获取或设置世界单位和页面单位之间的缩放。
如果PageUnit为默认的Display时,修改PageScale后,绘制的图形没有缩放?!

using(var bmp=new Bitmap("AIWoman.png"))
{
    //如果PageUnit为默认的Display的话,PageScale不生效?
    e.Graphics.PageUnit = GraphicsUnit.Pixel;
    // 创建矩形
    Rectangle rectangle1 = new Rectangle(20, 20, 50, 100);

    // 绘制矩形
    e.Graphics.DrawRectangle(Pens.Blue, rectangle1);

    //绘制图像
    e.Graphics.DrawImage(bmp, 100, 0, 200, 200);

    // 修改PageScale 
    e.Graphics.PageScale = 2.0F;
    // 原点向右、向下各移10像素(实际是
    e.Graphics.TranslateTransform(10.0F, 15.0F);

    // 再次绘制矩形,实际的设备坐标为(60,70,100,200)
    e.Graphics.DrawRectangle(Pens.Red, rectangle1);

    //绘制图像
    e.Graphics.DrawImage(bmp, 100, 0, 200, 200);

    // Set the page scale and origin back to their original values.
    e.Graphics.PageScale = 1.0F;
    e.Graphics.ResetTransform();

    SolidBrush transparentBrush = new SolidBrush(Color.FromArgb(50,
        Color.Yellow));

    // 修改PageScale与TranslateTransform后的变换计算方法
    // x = (10 + 20) * 2
    // y = (15 + 20) * 2
    // Width = 50 * 2
    // Length = 100 * 2
    Rectangle newRectangle = new Rectangle(60, 70, 100, 200);

    //填充一个半透的矩形,与上面第二次绘制的矩形位置一致
    e.Graphics.FillRectangle(transparentBrush, newRectangle);
}     

注意修改PageScale后,绘制坐标与内容是如何计算得到的。

PageScale

  1. 使用 PageScale 进行缩放:
  • 如果您希望以简单的方式实现缩放功能,并且不需要对图像进行更复杂的变换操作,那么可以使用 PageScale 属性。
  • 当用户滚动鼠标时,您可以根据滚动的方向和幅度来调整 PageScale 的值,从而实现图像的缩放效果。
  • 这种方式简单直观,适合于一般的图像浏览控件,但可能无法满足复杂的缩放需求。
  1. 使用 Matrix 进行缩放:
  • 如果您希望更灵活地控制图像的缩放效果,并且可能需要对图像进行更复杂的变换操作,那么可以使用 Matrix 类。
  • 当用户滚动鼠标时,您可以根据滚动的方向和幅度来创建一个缩放变换矩阵,并将其应用于绘图操作,从而实现图像的缩放效果。
  • 这种方式更灵活,可以实现各种复杂的缩放效果,但相对来说实现起来可能会稍微复杂一些。

PixelOffsetMode像素偏移模式

原型:

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

作用:获取或设置渲染图形时像素如何偏移

说明
Default使用默认的像素偏移模式。在绘制过程中,GDI+ 会自动选择合适的像素偏移模式,以保证绘制效果良好。
HighSpeed采用高速模式进行像素偏移。这种模式下,GDI+ 不会进行像素的微调,而是采用更快的绘制方式。适用于速度要求较高的场景,但可能会影响绘制质量。
HighQuality采用高质量模式进行像素偏移。这种模式下,GDI+ 会对像素进行微调,以提高绘制的质量和精度。适用于需要更高绘制质量的场景,但可能会影响绘制速度。
Half采用半像素偏移模式。在此模式下,GDI+ 会将绘制的图形偏移半个像素,以获得更加平滑的图形边缘效果。
None不偏移

肉眼没看出多大的区别。
PixelOffsetMode

RenderingOrigin绘制原点

原型:

public System.Drawing.Point RenderingOrigin { get; set; }

作用:用于抖动或填充画笔的渲染原点。
测试过程中,没有生效,不知哪里方法不对。

SmoothingMode平滑方式

原型:

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

作用:获取或设置渲染质量。
SmoothingMode枚举
Default、None和HighSpeed是等效的,不启用抗锯齿。
AntiAlias和HighQuality是等效的,启用抗锯齿。
SmoothingMode对文本渲染无效。文本渲染需要设置TextRenderingHint。

// 设置背景颜色
e.Graphics.Clear(Color.White);
var pt1 = new Point(100, 100);
var pt2 = new Point(600, 550);
var values = Enum.GetValues(typeof(SmoothingMode)) as SmoothingMode[];
values = values.Where(z => z != SmoothingMode.Invalid).ToArray();

for (int i = 0; i < values.Length; i++)
{
    var val = values[i];
    e.Graphics.SmoothingMode = val;
    e.Graphics.DrawLine(Pens.Red, pt1, pt2);
    e.Graphics.DrawString($"{val}", Font, Brushes.Red, pt1);
    e.Graphics.TranslateTransform(30,15);
}

绘制不同的平滑模式的线段。
SmoothingMode

TextContrast 文本Gamma校正值 和 TextRenderingHint文本渲染方式

原型:

public int TextContrast { get; set; }
public System.Drawing.Text.TextRenderingHint TextRenderingHint { get; set; }

TextContrast 作用:获取或设置渲染文本的Gamma校正值。值的范围0到12,默认值为4。
TextRenderingHint 作用:获取或设置渲染文本的方式。

  1. TextRenderingHint.SystemDefault

    说明:使用系统默认的文本渲染设置。这通常是一个折中的选择,基于操作系统的当前设置。
    用途:适用于大多数情况下,使用操作系统提供的默认设置。

  2. TextRenderingHint.SingleBitPerPixelGridFit

    说明:使用单色(每像素1位)的文本渲染,并且文本像素对齐到字符网格。这提供了清晰的文本但没有抗锯齿。
    用途:适用于需要非常清晰和锐利文本的环境,例如某些嵌入式系统或低分辨率显示器。

  3. TextRenderingHint.SingleBitPerPixel

    说明:使用单色(每像素1位)的文本渲染,不进行字符网格对齐。文本渲染相对较快,但质量较低。
    用途:当性能优先于文本质量时,例如绘制大量文本或在资源受限的环境中。

  4. TextRenderingHint.AntiAliasGridFit

    说明:使用抗锯齿和字符网格对齐。这提供了高质量的文本渲染,但可能会牺牲一些性能。
    用途:适用于需要高质量文本显示的场景,例如桌面应用程序的用户界面。

  5. TextRenderingHint.AntiAlias

    说明:使用抗锯齿,但不进行字符网格对齐。比 AntiAliasGridFit 提供稍低的文本质量,但性能更好。
    用途:当需要较好的文本质量,但对字符网格对齐要求不高时。

  6. TextRenderingHint.ClearTypeGridFit

    说明:使用 ClearType 技术进行文本渲染,并进行字符网格对齐。ClearType 提供了最高的文本清晰度,特别是在 LCD 显示器上。
    用途:适用于高分辨率和 LCD 显示器,提供最佳的文本渲染质量。

e.Graphics.Clear(Color.White);
e.Graphics.ScaleTransform(4.5f,4.5f);
Font myFont = new Font(FontFamily.GenericSansSerif, 10,
    FontStyle.Regular);
var pt1 = new Point(5, 5);
var values = Enum.GetValues(typeof(TextRenderingHint)) as TextRenderingHint[];

for (int i = 0; i < values.Length; i++)
{
    var val = values[i];
    e.Graphics.TextRenderingHint = val;
    e.Graphics.TextContrast = i * 2;
    e.Graphics.DrawString($"{e.Graphics.TextContrast},{val}", myFont, Brushes.Red, pt1);
    e.Graphics.TranslateTransform(0, 20);
}

TextRenderingHint

Transform变换矩阵

原型:

public System.Drawing.Drawing2D.Matrix Transform { get; set; }

作用:设置或获取Graphics的世界坐标系统的变换矩阵副本。用于将世界坐标映射到页面坐标。获取属性后需要调用Dispose()方法。

VisibleClipBounds可见裁切外接矩形

原型:

public System.Drawing.RectangleF VisibleClipBounds { get; }

作用:获取可见的裁切区域外接矩形。

e.Graphics.Clear(Color.White);
var rect = new Rectangle(50, 50, 200, 100);

var matrix = e.Graphics.Transform;
matrix.Translate(50, 60, MatrixOrder.Append);//这里是副本,进行的平移对原Transform无效
e.Graphics.DrawRectangle(Pens.Red, rect);
var vRect = e.Graphics.VisibleClipBounds;
int offset = 20;
//这里VisiableClipBounds左上角是(0,0)
DrawString(e,$"VisibleClipBounds:({vRect.X},{vRect.Y},{vRect.Width},{vRect.Height})",ref offset);

e.Graphics.Transform = matrix;//重新设置后生效
e.Graphics.DrawRectangle(Pens.Green, rect);
vRect = e.Graphics.VisibleClipBounds;
//因平移了(50,60),这里VisibleClipBounds的左上角是(-50,-60),★
DrawString(e, $"VisibleClipBounds:({vRect.X},{vRect.Y},{vRect.Width},{vRect.Height})", ref offset);

e.Graphics.ScaleTransform(2, 2);

vRect = e.Graphics.VisibleClipBounds;
//因平移了(50,60),这里VisibleClipBounds的左上角是(-50,-60),★
DrawString(e, $"VisibleClipBounds:({vRect.X},{vRect.Y},{vRect.Width},{vRect.Height})", ref offset);

var newRect = new Rectangle(-20, -20, 200, 100);
e.Graphics.DrawRectangle(Pens.LightSkyBlue, newRect);

matrix.Dispose();//需Dispose()释放

注意矩阵变换后的VisiableClipBounds
变换后的VisibleClipBounds

https://learn.microsoft.com/en-us/dotnet/api/system.drawing.graphics?view=netframework-4.8.1

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

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

相关文章

2024年5月31日 (周五) 叶子游戏新闻

《Granblue Fantasy: Relink》版本更新 新增可操控角色及功能世嘉股份有限公司现已公开《Granblue Fantasy: Relink》&#xff08;以下简称 Relink&#xff09;免费版本更新ver.1.3.1于5月31日&#xff08;周五&#xff09;上线的消息。该作是由Cygames Inc.&#xff08;下称Cy…

SpringSecurity6从入门到实战之Filter过滤器回顾

SpringSecurity6从入门到实战之Filter过滤器回顾 如果没有SpringSecurity这个框架,我们应该通过什么去实现客户端向服务端发送请求时,先检查用户是否登录,登录了才能访问.否则重定向到登录页面 流程图如下 官方文档&#xff1a;https://docs.spring.io/spring-security/referen…

实际测试stm32中断优先级

HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);第一个函数 HAL_NVIC_SetPriority 是用来设置单个优先级的抢占优先级和响应优先级的值。第二个…

改进YOLOv8系列:构建新型单头transformer模块,加入到骨干尾部

改进YOLOv8系列:构建新型单头transformer模块,加入到骨干尾部 需要修改的代码self attention代码创建yaml文件测试是否创建成功本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者…

服务器迁徙大作战:从虚拟到物理的服务迁移全攻略

时光匆匆&#xff0c;发现自己已经很久没有动笔写博客了。瞥了一眼掘金&#xff0c;上一篇博客居然还停留在22年。五年间&#xff0c;似乎自己变得越发慵懒&#xff0c;或许是因为一旦进入舒适区&#xff0c;就不太愿意再去挑战自己&#xff0c;不管是在技术上还是生活中。刚毕…

【Linux】磁盘结构文件系统软硬链接动静态库

目录 一.磁盘结构 1、磁盘的物理结构 2、磁盘的存储结构 3、磁盘的逻辑结构 二.文件系统 1、对IO单位的优化 2、磁盘分区与分组 3、对分组的具体管理方法 4、文件操作 三.软硬链接 1、理解硬链接 2、理解软连接 3、理解.和.. 四、动静态库 1、什么是动静态库 2、…

Threejs(WebGL)绘制线段优化:Shader修改gl.LINES模式为gl.LINE_STRIP

目录 背景 思路 Threejs实现 记录每条线的点数 封装原始裁剪索引数据 封装合并几何体的缓冲数据&#xff1a;由裁剪索引组成的 IntArray 守住该有的线段&#xff01; 修改顶点着色器 修改片元着色器 完整代码 WebGL实现类似功能&#xff08;简易版&#xff0c;便于测…

线性代数|机器学习-P1课程简介

文章目录 1. 书籍下载2. 正文 1. 书籍下载 链接&#xff1a;https://pan.baidu.com/s/1QbK0enLh0x4nU1c4Tqwlkw 提取码&#xff1a;r7ft 本课程回顾线性代数在概率论、统计学、优化和深度学习中的应用。是GILBERT STRANG教授的有一个经典的课程。课程将线性代数分为如下部分&a…

Android Studio启动第一个项目的报错——笔记

零基础第一次使用Android Studio开发遇到的问题 1 新建项目下载gradle慢的问题 直接叉掉打开gradle官网手动下载自己想要的版本 gradle官网 然后在刚刚建好的项目里找到gradle-wrapper.properties&#xff0c;修改distributionUrl&#xff0c;并把自己从官网下载的包放到和gr…

SQLRecon:一款针对MSSQL的网络侦查与后渗透测试工具

关于SQLRecon SQLRecon是一款针对Microsoft SQL Server的安全研究工具&#xff0c;该工具专为红队研究人员设计&#xff0c;可以帮助广大研究人员针对MSSQL执行网络侦查和后渗透利用测试。 工具安装 广大研究人员可以直接访问该项目的【Releases页面】下载预编译的最新版本SQ…

WHAT - 用户登录系列(二)- 单点登录 SSO

目录 一、认证机制1.1 基于会话的认证&#xff08;Session-based Authentication&#xff09;1. 介绍2. 基本流程 1.2 JSON Web Tokens (JWT)1. 介绍2. jwt 组成3. 基本流程4. 阻止列表5. 刷新令牌 二、单点登录&#xff1a;SSO2.1 单系统登录2.2 SSO 介绍2.3 SSO 登录2.4 SSO …

从零开始学习Slam-旋转矩阵旋转向量四元组(二)

本文参考&#xff1a;计算机视觉life 仅作笔记用 书接上回&#xff0c;上回不清不楚的介绍了旋转矩阵&旋转向量和四元组 现在回顾一下重点&#xff1a; 本着绕谁谁不变的变则 假设绕z轴旋转θ&#xff0c;旋转矩阵为&#xff1a; 再回顾一下旋转向量的表示以及这个基本记不…

【课程总结】Day4:信息论和决策树算法

前言 本章内容主要是学习机器学习中的一个重要模型&#xff1a;决策树&#xff0c;围绕决策树的应用&#xff0c;我们展开了解到&#xff1a;熵的定义、熵的计算、决策树的构建过程(基于快速降熵)、基尼系数等&#xff0c;从而使得我们对决策树有了直观认识。 熵的介绍 因为…

discuz论坛怎么修改备案信息

大家好&#xff0c;今天给大家分享下discuz如何填写备案信息并且展示在网站首页。大家都知道国内网站都需要备案&#xff0c;不通过备案的网站上是没办法通过域名打开的。大家也可以通过搜索网创有方&#xff0c;或者直接点击网创有方 查看悬挂备案号后的效果。 首先大家可以看…

AntV F2 极坐标堆叠柱状图:可视化数据分布

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 AntV F2 极坐标堆叠柱状图&#xff1a;可视化数据分布 应用场景 极坐标堆叠柱状图适用于展示不同分类数据在某个维度上的分布情况&#xff0c;例如不同电影的票房占比、不同商品的销售额占比等。通过这种方式…

闽盾杯 2021 DNS协议分析

今年CISCN的Tough DNS 的前戏就是DNS协议分析 直接可以查找到flag的base64形式Zmxh 发现就是请求的dnslog 携带的数据 过滤器就是 dns tshark -r dns.pcapng -T json -Y "dns" >1.json 字段选择 dns.qry.name tshark -r dns.pcapng -T json -Y "dns"…

C# try catch异常捕获

异常捕获 执行过程&#xff1a;try中的代码没有出现异常&#xff0c;则catch里面不会自行&#xff0c;如果try中代码出现异常&#xff0c;则后面的代码都不执行&#xff0c;直接跳到catch中的代码执行。 // try catch 可以捕获多个错误&#xff0c; try...catch...catch.... …

【ETAS CP AUTOSAR基础软件】EcuM模块详解

文章包含了AUTOSAR基础软件&#xff08;BSW&#xff09;中EcuM模块相关的内容详解。本文从AUTOSAR规范解析&#xff0c;ISOLAR-AB配置以及模块相关代码分析三个维度来帮读者清晰的认识和了解EcuM。文中涉及的SOLAR-AB配置以及模块相关代码都是依托于ETAS提供的工具链来配置与生…

桃金娘T2T基因组-文献精读17

Gap-free genome assembly and comparative analysis reveal the evolution and anthocyanin accumulation mechanism of Rhodomyrtus tomentosa 无缺口基因组组装及比较分析揭示了桃金娘的进化和花青素积累机制 摘要 桃金娘&#xff08;Rhodomyrtus tomentosa&#xff09;是…

鸿蒙工程目录介绍

鸿蒙构建完毕生成hhvp文件。 项目结构&#xff1a; .hvigor : 是存储构建配置文件的 .idea : 是开发工具拥有的目录 AppScope : 是全局的公共资源存放位置 hvigor &#xff1a;存放前端构建配置信息 oh_modules : 存放项目用到的第三方包 build-profile.json5 : 应用级别的构…