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

news2024/10/7 10:23:40

文章目录

  • 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)
    {
        //绕中心旋转30
        var 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

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

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

相关文章

二叉树(2)

二叉树的销毁 分为三个部分的销毁&#xff1a;根节点&#xff0c;左子树和右子树 void TreeDestory(BTNode* root) {if(rootNULL)return;TreeDestory(root->left);TreeDestory(root->right);free(root);rootNULL; }层序遍历&#xff08;上一层带下一层&#xff09; ty…

nginx如何解决惊群效应

什么是惊群效应 惊群效应&#xff08;thundering herd&#xff09;是指多进程&#xff08;多线程&#xff09;在同时阻塞等待同一个事件的时候&#xff08;休眠状态&#xff09;&#xff0c;如果等待的这个事件发生&#xff0c;那么他就会唤醒等待的所有进程&#xff08;或者线…

web权限到系统权限 内网学习第一天 权限提升 使用手工还是cs???msf可以不??

现在开始学习内网的相关的知识了&#xff0c;我们在拿下web权限过后&#xff0c;我们要看自己拿下的是什么权限&#xff0c;可能是普通的用户权限&#xff0c;这个连添加用户都不可以&#xff0c;这个时候我们就要进行权限提升操作了。 权限提升这点与我们后门进行内网渗透是乘…

用AI,每天创作200+优质内容,2分钟教会你操作!

前段时间发布了这篇“寻找爆款文案及标题的9大渠道&#xff0c;直接搬运都能搞流量&#xff01;”&#xff0c;里面我讲到如何寻找爆款标题。最近不少朋友问我&#xff0c;如何创作这个标题相关的内容。 多数平台都有风控规则&#xff0c;有些平台内容也会有字数要求。为了让大…

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(三)

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形 ✔️ 第一部分第二部分【第三部分】✔️ 1.2.3 Canvas 与 WebGL&#xff08;精译中 ⏳&#xff09;1.2.4 C…

10.8K star!史上最强Web应用防火墙雷池WAF

长亭雷池SafeLine是长亭科技耗时近 10 年倾情打造的WAF(Web Application Firewall)&#xff0c; 一款敢打出口号 “不让黑客越雷池一步” 的 WAF&#xff0c;愿称之为史上最强的一款Web应用防火墙&#xff0c;足够简单、足够好用、足够强的免费且开源的 WAF&#xff0c;基于业…

全球首款商用,AI为视频自动配音配乐产品上线

近日&#xff0c;海外推出了一款名为Resona V2A的产品&#xff0c;这是全球首款商用视频转音频 (V2A) 技术产品。这项突破性技术利用AI&#xff0c;仅凭视频数据即可自动生成高质量、与上下文相关的音频&#xff0c;包括声音设计、音效、拟音和环境音&#xff0c;为电影制作人、…

单向链表结构

链表结构简介 链表结构是一种用比较特殊的数据结构类型&#xff0c;它也是线性数据结构中的一种&#xff0c;但是与栈结构等线性数据结构不同&#xff0c;它的内部结构并不是一个简单的存储空间&#xff0c;而是一个带有指向性质的单元。要理解链表结构要弄清楚两个问题&#x…

react_后台管理_项目

目录 1.运行项目 2. 项目结构 ①项目顶部导航栏 ②项目左侧导航栏 ③主页面-路由切换区 本项目使用的是 reacttsscss 技术栈。 1.运行项目 在当前页面顶部下载本项目&#xff0c;解压后使用编辑器打开&#xff0c;然后再终端输入命令&#xff1a; npm i 下载依赖后&am…

使用Python绘制动态螺旋线:旋转动画效果

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame绘制螺旋线函数主循环 完整代码 引言 螺旋线是一个具有美学和数学魅力的图形。通过编程&#xff0c;我们可以轻松创建动态旋转的螺旋线动画。在这篇博客中&#xff0c;我们将使用Python和Pygame库来实现…

【python脚本】批量检测sql延时注入

文章目录 前言批量检测sql延时注入工作原理脚本演示 前言 SQL延时注入是一种在Web应用程序中利用SQL注入漏洞的技术&#xff0c;当传统的基于错误信息或数据回显的注入方法不可行时&#xff0c;例如当Web应用进行了安全配置&#xff0c;不显示任何错误信息或敏感数据时&#x…

解决卡顿发热,超帧技术焕发中重载游戏动力

近几年&#xff0c;中国手游市场规模不断扩大&#xff0c;开发者通过在画面、玩法等方面的持续创新和打磨&#xff0c;推出更加精品化的产品。然而愈发精美的画质和复杂的玩法&#xff0c;也给硬件带来超高的负载&#xff0c;导致玩家在游戏过程中&#xff0c;频繁出现掉帧卡顿…

动态规划算法,完全零基础小白教程!不是计算机的都能学会!万字吐血详解。

目录 一、动态规划算法概念 题一 1、算法解析 1&#xff09;确定状态&#xff1a; ​2&#xff09;状态转移方程&#xff1a; ​3&#xff09;初始化&#xff1a; 4&#xff09;填表顺序&#xff1a; 5&#xff09;返回值&#xff1a; 2、代码 题二 1、算法解析 1、确…

你喜欢波段交易吗?

波段交易的核心在于精准捕捉市场中的长期趋势波动&#xff0c;以实现更为稳健的收益。与剥头皮和日内交易不同&#xff0c;波段交易者更倾向于持有交易头寸数日乃至数周&#xff0c;以更宽广的视角把握市场动态。 这种交易方式的优势在于&#xff0c;它降低了对即时市场反应的…

C - Popcorn(abs358)

题意&#xff1a;有n个摊子&#xff0c;m个爆米花&#xff0c;想花费最少去的店铺买到所有的口味的爆米花&#xff0c;找到每一列都为‘o’的最少行数。 分析&#xff1a;用dfs寻找最少路径 #include<bits/stdc.h> using namespace std; typedef long long ll; char x;…

【面试系列】AI研究员高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

内网渗透第四天!!!冲冲冲!!怎么绕过uac以及你会all劫持???不安全的服务路径以及服务权限,你会吗???

在第三天我们简单的说了一下绕过uac&#xff0c;但是我们使用的msf模块ask要对方管理员跟我们一起来进行操作&#xff0c;才可以进行提权的操作&#xff0c;这点就限制住了我们。我们今天来讲一下不用钓鱼的绕过的操作。 绕过uac&#xff1a; 使用uacme项目和msf联动来进行绕过…

和小红书一起参会! 了解大模型与大数据融合的技术趋势

在过去的两年中&#xff0c;“大模型”无疑成为互联网行业的焦点话题&#xff0c;曾经炙手可热的大数据架构似乎淡出公众视野。然而&#xff0c;大数据领域并未停滞不前&#xff0c;反而快速演进&#xff0c;传统依赖众多开源组件的大数据平台正逐步过渡到以融合与简化为核心特…

Xorbits inference操作实战

1.操作环境 序号软件版本备注1Windows1.版本&#xff1a;Windows 10 专业版2.版本号&#xff1a;21H23.操作系统内部版本&#xff1a;19044.18892Docker Desktop4.24.2 (124339)3WSLUbuntu 22.04 LTS4Python3.105CUDA12.16Dify0.6.6 Xorbits inference 是一个强大且通用的分布…

那些好用的 Vue3 的工具搭子!!【送源码】

2020 年 9 月 18 日 Vue3 的正式发布已经过去了大约 3 年 9 个月左右&#xff01;&#xff01;&#xff01; 随着 Vue3 版本的逐渐成熟&#xff0c;我们的前端世界也迎来了一系列令人振奋的更新和工具。Vue 生态圈的持续扩大&#xff0c;无疑为前端开发人员带来了前所未有的便…