当前位置: 首页 > news >正文

【SkiaSharp绘图14】SKCanvas方法详解(三)URL注释、按顶点绘制、 是否裁切区域之外、旋转、缩放、倾斜、平移、保存/恢复画布

文章目录

  • SKCanvas方法
    • DrawUrlAnnotation 绘制URL注释
    • DrawVertices 按顶点绘制
    • Flush 立即绘制
    • QuickReject 判断区域是否在裁切区域之外
    • ResetMatrix重置矩阵
    • Restore、RestoreToCount
    • RotateDegrees按角度旋转画布
    • RotateRadians按弧度旋转画布
    • SaveLayer保存并新建图层
    • Scale 缩放画布
    • SetMatrix 设置矩阵
    • Skew 倾斜
    • Translate 平移

SKCanvas方法

DrawUrlAnnotation 绘制URL注释

public void DrawUrlAnnotation (SkiaSharp.SKRect rect, SkiaSharp.SKData value);
public SkiaSharp.SKData DrawUrlAnnotation (SkiaSharp.SKRect rect, string value);

创建一个矩形区域为为可点击的URL注释。(在不支持的后端,此语句将被忽略)

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var stream = File.OpenWrite(@"Images\test.pdf"))
using (var doc = SKDocument.CreatePdf(stream, 72))
using (var pdfCanvas = doc.BeginPage(600, 600))
using (var paint = new SKPaint())
{paint.TextSize = 18;paint.Color = SKColors.LightGreen;paint.IsStroke = true;var text = $"https://www.csdn.net/";pdfCanvas.DrawText(text, 20, 200, paint);var bbox = new SKRect();paint.MeasureText(text, ref bbox);pdfCanvas.Translate(20, 200);pdfCanvas.DrawRect(bbox,paint);pdfCanvas.DrawUrlAnnotation(bbox, text);doc.EndPage();doc.Close();
}
  1. 绘制文本网址
  2. 测量文本的区域
  3. 绘制区域矩形,并生成URL注释
    DrawUrlAnnotation

DrawVertices 按顶点绘制

public void DrawVertices (SkiaSharp.SKVertexMode vmode, SkiaSharp.SKPoint[] vertices, SkiaSharp.SKPoint[] texs, SkiaSharp.SKColor[] colors, ushort[] indices, SkiaSharp.SKPaint paint);
public void DrawVertices (SkiaSharp.SKVertexMode vmode, SkiaSharp.SKPoint[] vertices, SkiaSharp.SKPoint[] texs, SkiaSharp.SKColor[] colors, SkiaSharp.SKBlendMode mode, ushort[] indices, SkiaSharp.SKPaint paint);
public void DrawVertices (SkiaSharp.SKVertexMode vmode, SkiaSharp.SKPoint[] vertices, SkiaSharp.SKPoint[] texs, SkiaSharp.SKColor[] colors, SkiaSharp.SKPaint paint);
public void DrawVertices (SkiaSharp.SKVertexMode vmode, SkiaSharp.SKPoint[] vertices, SkiaSharp.SKColor[] colors, SkiaSharp.SKPaint paint);

通过顶点来定义几何形状,可以控制每个顶点的颜色和纹理坐标。

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);// 定义顶点位置
var vertices = new SKPoint[]
{new SKPoint(100, 100),new SKPoint(200, 80),new SKPoint(150, 200),new SKPoint(300, 100),new SKPoint(400, 60),new SKPoint(350, 200)
};// 定义每个顶点的颜色
var colors = new SKColor[]
{new SKColor(255,0,0,128),new SKColor(255,255,0,128),new SKColor(255,255,255,128),new SKColor(0,255,0,128),new SKColor(0,255,255,128),new SKColor(0,0,255,128)
};// 创建 SKPaint 对象
using (var paint = new SKPaint())
{var modes=Enum.GetValues(typeof(SKVertexMode)) as SKVertexMode[];paint.TextSize = 18;paint.IsAntialias = true;foreach (var per  in modes){paint.StrokeWidth = 1;canvas.DrawVertices(per, vertices, colors, paint);canvas.DrawText($"SKVertexMode:{per}", 450, 150, paint);paint.StrokeWidth = 5;paint.StrokeCap = SKStrokeCap.Round;canvas.DrawPoints(SKPointMode.Points, vertices, paint);for(int i = 0; i < vertices.Length; i++){var pt=vertices[i];canvas.DrawText($"{i}", pt, paint);}canvas.Translate(0, 200);}
}

定义6个顶点、6个颜色,分别用三种方式绘制。
DrawVertices

  1. Triangles: 将每三个顶点作为一个独立的三角形来绘制。
  2. TriangleStrip: 将顶点组合作为一个三角形条带绘制,每相邻的三个顶点组成一个三角形。
  3. TriangleFan: 将顶点组合作为一个三角形扇绘制,第一个顶点作为扇的中心点,后续顶点与这个中心点以及前一个顶点一起构成一个三角形。

Flush 立即绘制

public void Flush ();

用于将所有挂起的绘制命令立即提交到目标设备。

  1. 确保绘制完成:在复杂的绘制操作之后调用 Flush 可以确保所有操作都已提交并完成。
  2. 减少延迟:在需要即时反馈或减少绘制延迟的情况下,调用 Flush 可以让绘制结果立即生效。
  3. 同步绘制:在与其他绘制或图形系统交互时,Flush 可以确保 SkiaSharp 的绘制操作已完成,以便其他系统可以访问最新的绘制结果。

QuickReject 判断区域是否在裁切区域之外

public bool QuickReject (SkiaSharp.SKPath path);
public bool QuickReject (SkiaSharp.SKRect rect);

快速判断指定的路径或矩形,在当前矩阵变换后是否完全位于当前裁切区域之外。

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var paint = new SKPaint())
{var rectA = new SKRect(50, 50, 250, 150);var rectB = new SKRect(450, 50, 650, 150);paint.IsStroke = true;paint.StrokeWidth = 10;if (!canvas.QuickReject(rectA)){canvas.DrawRect(rectA, paint);}if (!canvas.QuickReject(rectB)){canvas.DrawRect(rectB, paint);}canvas.ClipRect(new SKRect(400, 0, 800, 800));   paint.StrokeWidth = 1;paint.Color = SKColors.Red;if (!canvas.QuickReject(rectA)){canvas.DrawRect(rectA, paint);}if (!canvas.QuickReject(rectB)){canvas.DrawRect(rectB, paint);}
}

1.定义两个矩形,判断是否在裁切区域之外,可能在区域之内,则绘制
2.重新定义裁切区域,判断原来的两个矩形是否在裁切区域之外,绘制在裁切区域之内的矩形。
QuickReject

ResetMatrix重置矩阵

public void ResetMatrix ();

重置矩阵。

Restore、RestoreToCount

public void Restore ();
public void RestoreToCount (int count);

恢复画布到上一或指定状态。
示例见下图。

RotateDegrees按角度旋转画布

public void RotateDegrees (float degrees);
public void RotateDegrees (float degrees, float px, float py);

绕原点或指定点旋转一个角度(正:顺时针,负:逆时针)

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var paint = new SKPaint())
{var index = 1;paint.TextSize = 18;paint.Color = SKColors.Red;paint.IsAntialias = true;paint.IsStroke = true;var dstX = 300;var dstY = 100;canvas.DrawLine(0, 0, dstX, dstY, paint);canvas.DrawText($"{index} Before RotateDegrees", dstX, dstY, paint);canvas.Save();paint.Color = SKColors.Blue;canvas.RotateDegrees(30);index++;canvas.DrawLine(0, 0, dstX, dstY, paint);canvas.DrawText($"{index} After RotateDegrees(30)", dstX, dstY, paint);canvas.Restore();paint.Color = SKColors.Red;var centerPt = new SKPoint(300, 400);var rect = new SKRect(centerPt.X - 100, centerPt.Y - 50, centerPt.X + 100, centerPt.Y + 50);canvas.DrawRect(rect, paint);index++;canvas.DrawText($"Rect{index} Before RotateDegrees", centerPt,paint);var saveCount = canvas.SaveCount;canvas.Save();paint.Color = SKColors.Blue;canvas.RotateDegrees(-30, centerPt.X, centerPt.Y);canvas.DrawRect(rect, paint);index++;canvas.DrawText($"Rect{index} Before RotateDegrees(-30,{centerPt.X},{centerPt.Y})", centerPt, paint);index++;canvas.DrawText($"{index} SaveCount:{canvas.SaveCount}", 400, 500, paint);canvas.RestoreToCount(saveCount);paint.Color = SKColors.Red;index++;canvas.DrawText($"{index} SaveCount:{canvas.SaveCount}", 400, 500, paint);
}

1.从原点画一条线段
2.旋转画布后,再画一条相同的线段
3.恢复画布状态
4.在指定点绘制一个矩形
5.画布线指定点旋转后,再绘制一个矩形
RotateDegrees

RotateRadians按弧度旋转画布

public void RotateRadians (float radians, float px, float py);
public void RotateRadians (float radians);

绕原点或指定,按弧度旋转。(是不是有点多余了,弧度和角度提供一个就可以了吧?)

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var paint = new SKPaint())
{var index = 1;paint.TextSize = 18;paint.Color = SKColors.Red;paint.IsAntialias = true;paint.IsStroke = true;var dstX = 300;var dstY = 100;canvas.DrawLine(0, 0, dstX, dstY, paint);canvas.DrawText($"{index} Before RotateRadians", dstX, dstY, paint);canvas.Save();paint.Color = SKColors.Blue;canvas.RotateRadians((float)(Math.PI/6));index++;canvas.DrawLine(0, 0, dstX, dstY, paint);canvas.DrawText($"{index} After RotateRadians(Math.PI/6)", dstX, dstY, paint);canvas.Restore();paint.Color = SKColors.Red;var centerPt = new SKPoint(300, 400);var rect = new SKRect(centerPt.X - 100, centerPt.Y - 50, centerPt.X + 100, centerPt.Y + 50);canvas.DrawRect(rect, paint);index++;canvas.DrawText($"Rect{index} Before RotateRadians", centerPt, paint);var saveCount = canvas.SaveCount;canvas.Save();paint.Color = SKColors.Blue;canvas.RotateRadians(-(float)(Math.PI / 6), centerPt.X, centerPt.Y);canvas.DrawRect(rect, paint);index++;canvas.DrawText($"Rect{index} After RotateRadians(-(Math.PI / 6),{centerPt.X},{centerPt.Y})", centerPt, paint);
}

RotateRadians

SaveLayer保存并新建图层

public int SaveLayer ();
public int SaveLayer (SkiaSharp.SKPaint paint);
public int SaveLayer (SkiaSharp.SKRect limit, SkiaSharp.SKPaint paint);

用于将当前的绘图状态保存到栈中,并创建一个新的图层(layer)。在新的图层上进行的所有绘制操作都会被暂时保存在这个图层上,而不是直接绘制在画布上。

  1. 临时绘制:在图层上进行临时绘制操作,然后再将图层合并回主画布。这对于需要多次更新和合成的复杂绘制操作非常有用。
  2. 混合模式:使用特定的混合模式或透明度进行绘制。图层上的所有绘制操作都可以以特定的混合模式或透明度应用到主画布上。
  3. 效果应用:在图层上应用滤镜或效果,然后将图层合并回主画布。这样可以避免在主画布上直接应用效果,保留原始绘图的灵活性。
var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var paint = new SKPaint())
{paint.Color = SKColors.Red.WithAlpha(128);canvas.DrawCircle(200, 200, 100, paint);using(var paintB=new SKPaint()){paintB.Color = SKColors.Blue.WithAlpha(128);canvas.SaveLayer(new SKRect(280,120,470,280),paintB);canvas.DrawCircle(375,200,100, paintB);canvas.Restore();canvas.DrawCircle(288, 300, 100, paint);}
}

SaveLayer

Scale 缩放画布

public void Scale (SkiaSharp.SKPoint size);
public void Scale (float s);
public void Scale (float sx, float sy);
public void Scale (float sx, float sy, float px, float py);

指定水平、垂直和缩放点后对画布进行缩放。

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var paint = new SKPaint())
{paint.IsStroke = true;paint.StrokeWidth = 5;paint.Color = SKColors.Red.WithAlpha(128);canvas.DrawCircle(100, 100, 50, paint);canvas.Save();canvas.Scale(3F);paint.Color = SKColors.Blue.WithAlpha(128);canvas.DrawCircle(100, 100, 50, paint);canvas.Restore();canvas.Save();canvas.Scale(2F, 2F, 100, 100);paint.Color = SKColors.Green.WithAlpha(128);canvas.DrawCircle(100, 100, 50, paint);
}
  1. 绘制一个圆
  2. 将画布按原点放大3倍后,再次绘制圆
  3. 将画布按原始圆心放大2倍后,再次绘制圆。

Scale

SetMatrix 设置矩阵

public void SetMatrix (SkiaSharp.SKMatrix matrix);

设置画布矩阵。

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);
using (var paint = new SKPaint())
{paint.IsStroke = true;paint.StrokeWidth = 2;paint.TextSize = 18;paint.Color = SKColors.Red;paint.Typeface = SKTypeface.FromFamilyName("宋体");paint.TextAlign = SKTextAlign.Center;for (int degree = 0; degree <= 330; degree += 30){//绕中心旋转30var matrix = SKMatrix.CreateRotationDegrees(degree, info.Width / 2F, info.Height / 2F);canvas.SetMatrix(matrix);var centerPt = new SKPoint(info.Width / 2F + 200, info.Height / 2F);canvas.DrawCircle(centerPt, 50, paint);canvas.DrawText($"{degree}°", centerPt, paint);}}

1.通过设置画布的矩阵,绕中心点,每30度画一个圆

SetMatrix

Skew 倾斜

public void Skew (SkiaSharp.SKPoint skew);
public void Skew (float sx, float sy);

设置水平与垂直倾斜。

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);
using (var paint = new SKPaint())
{paint.IsStroke = true;paint.IsAntialias = true;paint.StrokeWidth = 1;paint.TextSize = 36;var centerPt = new SKPoint(info.Width / 2F, info.Height / 2F);var lineLen = 200F;paint.Color = SKColors.Red;var degree = 30F;//canvas.DrawArc(new SKRect(centerPt.X - lineLen, centerPt.Y - lineLen, centerPt.X + lineLen, centerPt.Y + lineLen), 270 - degree, degree, true, paint);canvas.DrawArc(new SKRect(centerPt.X - 50, centerPt.Y - 50, centerPt.X + 50, centerPt.Y + 50), 270 - degree, degree, true, paint);var radian = degree * Math.PI / 180;float sin = (float)Math.Sin(radian);float cos = (float)Math.Cos(radian);float dstX = centerPt.X + lineLen * cos;float dstY = centerPt.Y + lineLen * sin;//注意原点移至中心canvas.Translate(centerPt.X, centerPt.Y);// 应用倾斜变换 (例如,X 轴倾斜 30 度,Y 轴倾斜 0 度)float skewX = (float)Math.Tan(degree * Math.PI / 180); // 将角度转换为弧度float skewY = 0;canvas.Skew(skewX, skewY);paint.Color = SKColors.Blue;canvas.DrawRect(SKRect.Create(200, 200), paint);canvas.DrawText($"SkewX = {degree}°", 0, 0, paint);//倾斜后的坐标//x'=x+y*skewX//y'=y+x*skewY
}

1.在画布中心绘制一个倾斜30度的文本

Skew
注意倾斜角度的不同,文本的倾斜方向不同。
正:文本向左倾斜。
负:文本向右倾斜。

Translate 平移

public void Translate (SkiaSharp.SKPoint point);
public void Translate (float dx, float dy);

将画布原点进行水平和垂直平移。

[System.ComponentModel.Description("SKCanvas.Translate平移")]
public void OnPaintSurface14_10(object sender, SkiaSharp.Views.Desktop.SKPaintGLSurfaceEventArgs e)
{var canvas = e.Surface.Canvas;var info = e.Info;infoWidth= info.Width;infoHeight= info.Height;canvas.Clear(SKColors.White);using (var paint = new SKPaint()){paint.IsStroke = true;paint.IsAntialias = true;paint.StrokeWidth = 1;paint.Color = SKColors.Green;var radius = 50;if (timer == null){timer = new System.Windows.Forms.Timer();timer.Interval = 1000 / 24;timer.Tick += (o, t) =>{TranslateX += xStep;if (TranslateX >= infoWidth - radius){xStep = -xStep;TranslateX = infoWidth - radius;}else if (TranslateX <= radius){xStep = -xStep;TranslateX = radius;}TranslateY += yStep;if (TranslateY >= infoHeight - radius){yStep = -yStep;TranslateY = infoHeight - radius;}else if (TranslateY <= radius){yStep = -yStep;TranslateY = radius;}this.TNTechImageBox.Invalidate();};timer.Start();}canvas.Translate(TranslateX, TranslateY);canvas.DrawCircle(0,0, radius, paint);}
}
float infoWidth = 0;
float infoHeight = 0;
float TranslateX = 100;
float TranslateY = 100;
float xStep = 5;
float yStep = 5;

使用平移,绘制一个圆,看上去遇到画布四周时,进行反弹。
Translate

相关文章:

【SkiaSharp绘图14】SKCanvas方法详解(三)URL注释、按顶点绘制、 是否裁切区域之外、旋转、缩放、倾斜、平移、保存/恢复画布

文章目录 SKCanvas方法DrawUrlAnnotation 绘制URL注释DrawVertices 按顶点绘制Flush 立即绘制QuickReject 判断区域是否在裁切区域之外ResetMatrix重置矩阵Restore、RestoreToCountRotateDegrees按角度旋转画布RotateRadians按弧度旋转画布SaveLayer保存并新建图层Scale 缩放画…...

WebDriver API (2)

本文将继续上文对WebDriver API的功能使用进行介绍。 一、浏览器操作 1. 浏览器前进forward与后退back 浏览器前进操作是指导航到前一个页面&#xff0c;在浏览器的历史记录中向前移动一页。 浏览器后退操作是指导航到前一个页面&#xff0c;在浏览器的历史记录中向后移动一…...

GCP FrontendConfig 详解:优化您的云负载均衡

目录 1. 什么是GCP FrontendConfig? 2. FrontendConfig的主要功能 2.1 协议选择 2.2 SSL/TLS配置 2.3 重定向配置 2.4 自定义响应头 3. 配置FrontendConfig 4. FrontendConfig的高级特性 4.1 智能路由 4.2 流量控制 4.3 日志和监控 5. FrontendConfig最佳实践 5.…...

TensorFlow代码逻辑 vs PyTorch代码逻辑

文章目录 一、TensorFlow&#xff08;一&#xff09;导入必要的库&#xff08;二&#xff09;加载MNIST数据集&#xff08;三&#xff09;数据预处理&#xff08;四&#xff09;构建神经网络模型&#xff08;五&#xff09;编译模型&#xff08;六&#xff09;训练模型&#xf…...

boost asio异步服务器(4)处理粘包

粘包的产生 当客户端发送多个数据包给服务器时&#xff0c;服务器底层的tcp接收缓冲区收到的数据为粘连在一起的。这种情况的产生通常是服务器端处理数据的速率不如客户端的发送速率的情况。比如&#xff1a;客户端1s内连续发送了两个hello world&#xff01;,服务器过了2s才接…...

【QT】常用控件|widget|QPushButton|RadioButton|核心属性

目录 ​编辑 概念 信号与槽机制 控件的多样性和定制性 核心属性 enabled geometry ​编辑 windowTiltle windowIcon toolTip styleSheet PushButton RadioButton 概念 QT 控件是构成图形用户界面&#xff08;GUI&#xff09;的基础组件&#xff0c;它们是实现与…...

【C++ Primer Plus学习记录】函数参数和按值传递

函数可以有多个参数。在调用函数时&#xff0c;只需使用都逗号将这些参数分开即可&#xff1a; n_chars(R,25); 上述函数调用将两个参数传递给函数n_chars()&#xff0c;我们将稍后定义该函数。 同样&#xff0c;在定义函数时&#xff0c;也在函数头中使用由逗号分隔的参数声…...

MySQL:设计数据库与操作

设计数据库 1. 数据建模1.1 概念模型1.2 逻辑模型1.3 实体模型主键外键外键约束 2. 标准化2.1 第一范式2.2 链接表2.3 第二范式2.4 第三范式 3. 数据库模型修改3.1 模型的正向工程3.2 同步数据库模型3.3 模型的逆向工程3.4 实际应用建议 4. 数据库实体模型4.1 创建和删除数据库…...

OBS 免费的录屏软件

一、下载 obs 【OBS】OBS Studio 的安装、参数设置和录屏、摄像头使用教程-CSDN博客 二、使用 obs & 输出无黑屏 【OBS任意指定区域录屏的方法-哔哩哔哩】 https://b23.tv/aM0hj8A OBS任意指定区域录屏的方法_哔哩哔哩_bilibili 步骤&#xff1a; 1&#xff09;获取区域…...

uniapp微信小程序使用xr加载模型

1.在根目录与pages同级创建如下目录结构和文件&#xff1a; // index.js Component({properties: {modelPath: { // vue页面传过来的模型type: String,value: }},data: {},methods: {} }) { // index.json"component": true,"renderer": "xr-frame&q…...

机器人运动范围检测 c++

地上有一个m行n列的方格&#xff0c;一个机器人从坐标&#xff08;0&#xff0c;0&#xff09;的格子开始移动&#xff0c;它每次可以向上下左右移动一个格子&#xff0c;但不能进入行坐标和列坐标的位数之和大于k的格子&#xff0c;请问机器人能够到达多少个格子 #include &l…...

kettle从入门到精通 第七十四课 ETL之kettle kettle调用https接口教程,忽略SSL校验

场景&#xff1a;kettle调用https接口&#xff0c;跳过校验SSL。&#xff08;有些公司内部系统之间的https的接口是没有SSL校验这一说&#xff0c;无需使用用证书的&#xff09; 解决方案&#xff1a;自定义插件或者自定义jar包通过javascript调用https接口。 1、http post 步…...

C++轻量级 线程间异步消息架构(向曾经工作的ROSA-RB以及共事的DOPRA的老兄弟们致敬)

1 啰嗦一番背景 这么多年&#xff0c;换着槽位做牛做马&#xff0c;没有什么钱途 手艺仍然很潮&#xff0c;唯有对于第一线的码农工作&#xff0c;孜孜不倦&#xff0c;其实没有啥进步&#xff0c;就是在不断地重复&#xff0c;刷熟练度&#xff0c;和同期的老兄弟们&#xf…...

Kotlin中的类

类初始化顺序 constructor 里的参数列表是首先被执行的&#xff0c;紧接着是 init 块和属性初始化器&#xff0c;最后是次构造函数的函数体。 主构造函数参数列表firstProperty 初始化第一个 init 块secondProperty 初始化第二个 init 块次构造函数函数体 class Example const…...

VSCode中常用的快捷键

通用操作快捷键 显示命令面板&#xff1a;Ctrl Shift P or F1&#xff0c;用于快速访问VSCode的各种命令。 快速打开&#xff1a;Ctrl P&#xff0c;可以快速打开文件、跳转到某个行号或搜索项目内容。 新建窗口/实例&#xff1a;Ctrl Shift N&#xff0c;用于打开一个新的…...

代码随想录-Day45

198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…...

Rust Eq 和 PartialEq

Eq 和 PartialEq 在 Rust 中&#xff0c;想要重载操作符&#xff0c;你就需要实现对应的特征。 例如 <、<、> 和 > 需要实现 PartialOrd 特征: use std::fmt::Display;struct Pair<T> {x: T,y: T, }impl<T> Pair<T> {fn new(x: T, y: T) ->…...

思考如何学习一门编程语言?

一、什么是编程语言 编程语言是一种用于编写计算机程序的人工语言。通过编程语言&#xff0c;程序员可以向计算机发出指令&#xff0c;控制计算机执行各种任务和操作。编程语言由一组语法规则和语义规则组成&#xff0c;这些规则定义了如何编写代码以及代码的含义。 编程语言…...

顺序串算法库构建

学习贺利坚老师顺序串算法库 数据结构之自建算法库——顺序串_创建顺序串s1,创建顺序串s2-CSDN博客 本人详细解析博客 串的概念及操作_串的基本操作-CSDN博客 版本更新日志 V1.0: 在贺利坚老师算法库指导下, 结合本人详细解析博客思路基础上,进行测试, 加入异常弹出信息 v1.0补…...

[论文阅读笔记33] Matching Anything by Segmenting Anything (CVPR2024 highlight)

这篇文章借助SAM模型强大的泛化性&#xff0c;在任意域上进行任意的多目标跟踪&#xff0c;而无需任何额外的标注。 其核心思想就是在训练的过程中&#xff0c;利用strong augmentation对一张图片进行变换&#xff0c;然后用SAM分割出其中的对象&#xff0c;因此可以找到一组图…...

阿里Nacos下载、安装(保姆篇)

文章目录 Nacos下载版本选择Nacos安装Windows常见问题解决 更多相关内容可查看 Nacos下载 Nacos官方下载地址&#xff1a;https://github.com/alibaba/nacos/releases 码云拉取&#xff08;如果国外较慢或者拉取超时可以试一下国内地址&#xff09; //国外 git clone https:…...

四、golang基础之defer

文章目录 一、定义二、作用三、结果四、recover错误拦截 一、定义 defer语句被用于预定对一个函数的调用。可以把这类被defer语句调用的函数称为延迟函数。 二、作用 释放占用的资源捕捉处理异常输出日志 三、结果 如果一个函数中有多个defer语句&#xff0c;它们会以LIFO…...

机器人----四元素

四元素 四元素的大小 [-1,1] 欧拉角转四元素...

IBM Spectrum LSF Application Center 提供单一界面来管理应用程序、用户、资源和数据

IBM Spectrum LSF Application Center 提供单一界面来管理应用程序、用户、资源和数据 亮点 ● 简化应用程序管理 ● 提高您的工作效率 ● 降低资源管理的复杂性 ● 深入了解流程 IBM Spectrum LSF Application Center 为集群用户和管理员提供了一个灵活的、以应用为中心的界…...

如何选择品牌推广公司?哪家好?收费标准及评价!

不管是什么品牌&#xff0c;推广对公司的成败起了很关键的作用。然而&#xff0c;面对市面上琳琅满目的品牌推广公司&#xff0c;如何选择一家既熟悉又靠谱的公司&#xff0c;成为许多企业主面临的难题。 作为一家手工酸奶品牌的创始人&#xff0c;目前全国也复制了100多家门店…...

JDeveloper 12C 官网下载教程

首先、我们要登录Oracle官网 Oracle 甲骨文中国 | 云应用和云平台 登录进去如果不是中文可以点击右上角带有国旗的图标就行更改&#xff0c;选择一个你能看懂的文字。 然后&#xff0c;点击“资源”—点击“开发人员下载” 然后&#xff0c;点击“开发工具” 这里有很多工具可…...

中英双语介绍美国的州:印第安纳州(Indiana)

中文版 印第安纳州简介 印第安纳州位于美国中西部地区&#xff0c;是一个以其农业、制造业和体育文化而著称的州。以下是对印第安纳州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 印第安纳州东临俄亥俄州&#xff0c;北接密歇根州…...

Flink实现准确和高效流处理的关键问题

时间相关: Watermark 水位线 水位线是插入到数据流中的一个标记,可以认为是一个特殊的数据。水位线主要的内容是一个时间戳,用来表示当前事件时间的进展。水位线是基于数据的时间戳生成的。水位线的时间戳必须单调递增,以确保任务的事件时间时钟一直向前推进,进展。水位线…...

isidentifier()方法——判断字符串是否为合法的Python标识符或变量名

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isidentifier()方法用于判断字符串是否是有效的Python标识符&#xff0c;还可以用来判断变量名是否合法。isidentifier()方法的语法格式如…...

天猫商品列表数据接口(Tmall.item_search)

天猫平台商品列表数据接口&#xff08;taobao.item_search&#xff09;是天猫开放平台提供的一个API接口&#xff0c;用于获取天猫平台上的商品列表数据。通过该接口&#xff0c;用户可以获取到商品的名称、价格、销量、评价等信息。下面将具体介绍这个接口的各个方面&#xff…...

React+TS前台项目实战(二十一)-- Search业务组件封装实现全局搜索

文章目录 前言一、Search组件封装1. 效果展示2. 功能分析3. 代码详细注释4. 使用方式 二、搜索结果展示组件封装1. 功能分析2. 代码详细注释 三、引用到文件&#xff0c;自行取用总结 前言 今天&#xff0c;我们来封装一个业务灵巧的组件&#xff0c;它集成了全局搜索和展示搜…...

SEO与AI的结合:如何用ChatGPT生成符合搜索引擎优化的内容

在当今数字时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为每个网站和内容创作者都必须掌握的一项技能。SEO的主要目标是通过优化内容&#xff0c;使其在搜索引擎结果页面&#xff08;SERP&#xff09;中排名更高&#xff0c;从而吸引更多的流量。然而&#xf…...

【信息系统项目管理师知识点速记】组织通用管理:知识管理

23.3 知识管理 23.3.1 知识管理基础 知识管理是通过利用各种知识和技术手段,帮助组织和个人生产、分享、应用和创新知识,以形成知识优势并在个人、组织、业务目标、经济绩效和社会效益方面产生价值的过程。它能为组织带来知识增值,创造新的价值,提升决策效能和水平,是提…...

CM-UNet: Hybrid CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation

论文&#xff1a;CM-UNet: Hybrid &#xff1a;CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation 代码&#xff1a;https://github.com/XiaoBuL/CM-UNet Abstrcat: 由于大规模图像尺寸和对象变化&#xff0c;当前基于 CNN 和 Transformer 的遥感图像语义分割方…...

DP:子序列问题

文章目录 什么是子序列子序列的特点举例说明常见问题 关于子序列问题的几个例题1.最长递增子序列2.摆动序列3.最长递增子序列的个数4.最长数对链5.最长定差子序列 总结 什么是子序列 在计算机科学和数学中&#xff0c;子序列&#xff08;Subsequence&#xff09;是指从一个序列…...

Spring Data与多数据源配置

Spring Data与多数据源配置 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨如何在Spring Data中配置和使用多个数据源。 在现代应用程序中&…...

【前端vue3】TypeScrip-类型推论和类型别名

类型推论 TypeScript里&#xff0c;在有些没有明确指出类型的地方&#xff0c;类型推论会帮助提供类型。 例如&#xff1a; 变量xiaoc被推断类型为string 如重新给xiaoc赋值数字会报错 let xiaoc "xiaoc"xiaoc 1111111111111如没有给变量指定类型和赋值&#xf…...

javaEE——Servlet

1.web开发概述 所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行交互 2.java后端开发环境搭建 web后端(javaEE)程序需要运行在服务器中的&#xff0c;这样前端才可以访问得到 3.服务器是什么&#xff1f; ①服务器就是一款软件&#xff0c;可以向其发送请求&#…...

Kotlin扩展函数(also apply run let)和with函数

also apply run let with的使用例子 private fun testOperator() {/*** also*/val person Person("ZhangSan", 18)person.also {// 通常仅仅打印使用, 也可以通过it修改it.name "ZhangSan1"println("also inner name: " it.name)}println(&qu…...

C语言笔记27 •单链表介绍•

1.链表的概念及结构 链表是⼀种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 2. 顺序表带来的问题 (1)中间/头部的插⼊删除&#xff0c;时间复杂度为O(N) (2)增容需要申请新空间&#xff0c;拷⻉数据&#xff…...

C++编程(五)单例模式 友元

文章目录 一、单例模式&#xff08;一&#xff09;概念&#xff08;二&#xff09;实现方式1. 饿汉式2. 懒汉式 二、友元&#xff08;一&#xff09;概念&#xff08;二&#xff09;友元函数1.概念2.语法格式3. 使用示例访问静态成员变量访问非静态成员变量 &#xff08;三&…...

012-GeoGebra基础篇-构造圆的切线

前边文章对于基础内容已经悉数覆盖了&#xff0c;这一篇我就不放具体的细节&#xff0c;若有需要可以复刻一下 目录 一、成品展示二、算式内容三、正确性检查五、文章最后 一、成品展示 二、算式内容 A(0,0) B(3,0) c: Circle(A,B) C(5,4) sSegment(A,C) DMidpoint(s) d: Circ…...

数据结构速成--查找

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 …...

SpringMVC的基本使用

SpringMVC简介 SpringMVC是Spring提供的一套建立在Servlet基础上&#xff0c;基于MVC模式的web解决方案 SpringMVC核心组件 DispatcherServlet&#xff1a;前置控制器&#xff0c;来自客户端的所有请求都经由DispatcherServlet进行处理和分发Handler&#xff1a;处理器&…...

【PYG】Cora数据集分类任务计算损失,cross_entropy为什么不能直接替换成mse_loss

cross_entropy计算误差方式&#xff0c;输入向量z为[1,2,3]&#xff0c;预测y为[1]&#xff0c;选择数为2&#xff0c;计算出一大坨e的式子为3.405&#xff0c;再用-23.405计算得到1.405MSE计算误差方式&#xff0c;输入z为[1,2,3]&#xff0c;预测向量应该是[1,0,0]&#xff0…...

MyBatis-plus这么好用,不允许还有人不会

你好呀&#xff0c;我是 javapub. 做 Java 的同学都会用到的三件套&#xff0c;Spring、SpringMV、MyBatis。但是由于使用起来配置较多&#xff0c;依赖冲突频发。所有&#xff0c;各路大佬又在这上边做了包装&#xff0c;像我们常用的 SpringBoot、MyBatisPlus。 基于当前要…...

Linux驱动开发实战宝典:设备模型、模块编程、I2C/SPI/USB外设精讲

摘要: 本文将带你走进 Linux 驱动开发的世界,从设备驱动模型、内核模块开发基础开始,逐步深入 I2C、SPI、USB 等常用外设的驱动编写,结合实际案例,助你掌握 Linux 驱动开发技能。 关键词: Linux 驱动,设备驱动模型,内核模块,I2C,SPI,USB 一、Linux 设备驱动模型 Li…...

安全技术和防火墙

1、安全技术 1.1入侵检测系统 特点是不阻断网络访问&#xff0c;主要提供报警和事后监督。不主动介入&#xff0c;默默的看着你&#xff08;类似于监控&#xff09; 1.2入侵防御系统 透明模式工作&#xff0c; 数据包&#xff0c;网络监控&#xff0c;服务攻击&#xff0c;…...

Webpack: 开发 PWA、Node、Electron 应用

概述 毋庸置疑&#xff0c;对前端开发者而言&#xff0c;当下正是一个日升月恒的美好时代&#xff01;在久远的过去&#xff0c;Web 页面的开发技术链条非常原始而粗糙&#xff0c;那时候的 JavaScript 更多用来点缀 Web 页面交互而不是用来构建一个完整的应用。直到 2009年5月…...

python处理txt文件, 如果第一列和第二列的值在连续的行中重复,则只保留一行

处理txt文件, 如果第一列和第二列的值在连续的行中重复,则只保留一个实例,使用Python的内置函数来读取文件,并逐行检查和处理数据。 一个txt文件,里面的数据是893.554382324,-119.955825806,0.0299997832626,-0.133618548512,28.1155740884,112.876833236,46.7922,19.62582…...

【云原生】Kubernetes资源配额+HPA+节点选择器+亲和性+污点

Kubernetes高级功能 文章目录 Kubernetes高级功能一、资源配额1.1、什么是资源配额1.2、资源配额应用1.2.1、针对Namespace设置资源配额1.2.2、针对Pod设置资源配额 二、HorizontalPodAutoscaler&#xff08;HPA&#xff09;2.1、什么是HorizontalPodAutoscaler2.2、Horizontal…...

联合概率密度函数

目录 1. 什么是概率密度由联合概率密度求概率参考链接 1. 什么是概率密度 概率密度到底在表达什么&#xff1f; 外卖在20-40分钟内送达的概率 随机变量落在[20,40]之间的概率。下图中&#xff0c;对总面积做规范化处理&#xff0c;令总面积1&#xff0c; f ( x ) f(x) f(x)则成…...

MySQL的Docker部署方式

说明:Docker部署MySQL主要是简单快速&#xff0c;不会对电脑系统造成污染。假如你的本地没有Docker&#xff0c;或者你不会使用Docker&#xff0c;则使用PyCharm去启动MySQL&#xff0c;或者直接在本机安装MySQL都是可以的。最重要的是&#xff0c;你要有一个MySQL环境&#xf…...

ChatGPT:AOP配置中的切入点定义

ChatGPT&#xff1a;AOP配置中的切入点定义 <aop:pointcut id“addTime” expression“execution(* com.xrq.aop.HelloWorld.print*(…))” /> 这是什么 这是一个AOP&#xff08;面向方面编程&#xff09;配置中的切入点定义。AOP是一种编程范式&#xff0c;用于将跨越多…...

BASH and SH in SHELL scripts

一、执行脚本的现象 为了测试一个小的功能&#xff0c;写了一个小脚本&#xff0c;类似的内容如下&#xff1a; #!/bin/shecho "start api test ......"for((i1;i<10;i)); do echo "cur id :" $i; done echo "end."执行一下&#xff0c;“…...

必须掌握的Linux的九大命令

ifconfig 命令用于配置和查看网络接口的参数。 ping 命令用于测试主机之间的网络连通性。 telnet用于通过Telnet协议连接到远程主机。 telnet 127.0.0.1 8000 telnet example.com telnet example.com 8080 iostat 命令用于报告 CPU 统计信息和 I/O 设备负载。 iostat&…...

20万级技术点满智己L6真不错但更多人会选“34C”

智己L6上市了,权益价19.99万元起步,这个价格标配激光雷达、英伟达的芯片、四轮转向、8295P,就不只是卷了,甚至可能是在赔本卖车。看起来没有不买它的理由了,但事实情况是,大部分人会选择再加5万,买传统豪华品牌。智己L6是真不错在智己公布预售价的时候,我们认为它应该还…...

富格林:借助正规技巧实现出金

富格林悉知&#xff0c;现货黄金近年来的表现相当出众&#xff0c;相信上车交易现货黄金的投资者&#xff0c;或多或少都在市场中分得一块蛋糕。不过也并不代表所有人都可以轻松在现货黄金中获利&#xff0c;尤其是投资新手。如果没有正规的投资经验观念&#xff0c;就很难实现…...

new CCDIKSolver( OOI.kira, iks ); // 创建逆运动学求解器

demo案例 new CCDIKSolver(OOI.kira, iks); 在使用某个特定的库或框架来创建一个逆运动学&#xff08;Inverse Kinematics, IK&#xff09;求解器实例。逆运动学在机器人学、动画和计算机图形学等领域中非常重要&#xff0c;它用于根据期望的末端执行器&#xff08;如机器人的…...

dockerfile关键字

参考&#xff1a;59_Dockerfile保留字简介_哔哩哔哩_bilibili FROM 作用&#xff1a;指定基础镜像&#xff0c;即在这个基础镜像上构建新镜像&#xff0c;如下所示&#xff0c;表示在ubuntu20.04镜像的基础上构建新镜像 FROM ubuntu:20.04 MAINTAINER 作用&#xff1a;镜像…...

【Python Cookbook】S01E03 找到最大最小的N个元素

目录 问题解决方案讨论 问题 如何在一个集合中找到最大或最小的 N 个元素&#xff1f; 解决方案 使用 heapq 模块。 pip install heapqheapq 模块中&#xff0c;有 nlargest() 以及 nsmallest() 两个函数&#xff1a; import heapqnums [1, 8, 23, 2, 7, -4, 8, 18, 42, …...

pelican,一个超强的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - pelican。 Github地址&#xff1a;https://github.com/getpelican/pelican 在当今数字化时代&#xff0c;博客已经成为个人和企业分享信息、展示成果的重要途径。静态网站…...