【SkiaSharp绘图15】SKPath属性详解:边界、填充、凹凸、类型判断、坐标、路径类型

文章目录

  • SKPath 构造函数
  • SKPath 属性
    • Bounds 边界(宽边界)
    • TightBounds紧边界
    • FillType填充方式
    • IsConcave 是否凹/ IsConvex 是否凸
    • IsEmpty是否为空
    • IsLine是否为线段
    • IsRect是否为矩形
    • IsOval是否为椭圆或圆
    • IsRoundRect是否为圆角矩形
    • Item[] 获取路径的坐标
    • LastPoint最后点的坐标
    • PointCount总共坐标点的个数
    • Points获取所有坐标点
    • SegmentMasks 路径包含的类型
    • VerbCount动词个数
    • 示例

SKPath 构造函数

public class SKPath : SkiaSharp.SKObject

复合的几何路径,封装由直线段、二次曲线、三次组成的复合(多轮廓)几何路径

public SKPath ();//构造一个空路径
public SKPath (SkiaSharp.SKPath path);//深拷贝一个已存在的路径。

可构造一个空路径或深拷贝一个已存在的路径。

var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);
using (var paint = new SKPaint())
using (var txtPaint = new SKPaint())
{paint.Color = SKColors.Red;paint.IsStroke = true;paint.IsAntialias = true;txtPaint.TextSize = 18;txtPaint.IsAntialias = true;txtPaint.Typeface = SKTypeface.FromFamilyName("宋体");var pathA=new SKPath();pathA.AddCircle(100, 100, 50);var pathB=new SKPath(pathA);//深拷贝pathA.AddRect(new SKRect(50, 200, 150, 300));canvas.DrawPath(pathA, paint);canvas.DrawText($"测试构造一个已存在路径时,深拷贝,还是浅拷贝。", 50, 400, txtPaint);canvas.Translate(300, 0);paint.Color = SKColors.Green;pathB.AddCircle(100,250,50);canvas.DrawPath(pathB, paint);}
  1. 创建一个空路径pathA,并添加一个圆.
  2. 创建另一个复制路径pathB
  3. 在pathA中再加入一个矩形。
  4. 在pathB中加入另一个圆。
  5. pathA与pathB互不影响。
    SKPath构造函数
    克隆源路径有问题时,会抛出异常。

SKPath 属性

Bounds 边界(宽边界)

public SkiaSharp.SKRect Bounds { get; }

获取路径的边界矩形。如果路径为空,则返回空矩形。
注意些边界不是路径的真实边路,可能比实际边界大,因为其包含的是控制点或独立点(MoveTo)。

var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);
using (var paint = new SKPaint())
using (var txtPaint = new SKPaint())
{paint.Color = SKColors.Red;paint.IsStroke = true;paint.IsAntialias = true;paint.TextSize = 36;var path = new SKPath();var pts = new SKPoint[]{new SKPoint(100,100),new SKPoint(200,200),new SKPoint(300,50),new SKPoint(400,250),new SKPoint(500,150)};//绘制一段贝赛尔曲线path.MoveTo(pts[0]);path.CubicTo(pts[1], pts[2], pts[3]);//构造一个独立点path.MoveTo(pts[4]);canvas.DrawPath(path, paint);var bounds = path.Bounds;if (bounds != SKRect.Empty){paint.StrokeWidth = 5;paint.Color = SKColors.Green;canvas.DrawRect(bounds, paint);canvas.DrawText($"Bounds",bounds.Right,bounds.Top, paint);}var tightBounds = path.TightBounds;if (tightBounds != SKRect.Empty){paint.StrokeWidth = 3;paint.Color = SKColors.Purple;canvas.DrawRect(tightBounds, paint);canvas.DrawText($"TightBounds", tightBounds.Right, tightBounds.Bottom, paint);}paint.StrokeWidth = 10;paint.StrokeCap = SKStrokeCap.Round;paint.Color = SKColors.Blue;canvas.DrawPoints(SKPointMode.Points, pts, paint);
}
  1. 通过四个点构造一段贝赛尔曲线,并构造一个独立点
  2. 验证Bounds的边界情况。
  3. 验证TightBounds的边界情况
  4. 红色为曲线,绿色为Bounds,紫色为TightBounds,蓝色为控制点。
    在这里插入图片描述

TightBounds紧边界

public SkiaSharp.SKRect TightBounds { get; }

路径的实际边界。

FillType填充方式

public SkiaSharp.SKPathFillType FillType { get; set; }//默认是Winding

获取和设置路径的填充类型。
各枚举值的意义

  1. Winding(默认值)

    • 基于“非零缠绕数”规则来确定填充区域。
    • 当路径穿过点的次数(方向考虑在内)不为零时,点在填充区域内。
  2. EvenOdd

    • 基于“奇偶规则”来确定填充区域。
    • 当路径穿过点的次数为奇数时,点在填充区域内;为偶数时,点在填充区域外。
  3. InverseWinding

    • Winding 类似,但填充区域是 Winding 填充区域的反向。
    • 当路径穿过点的次数(方向考虑在内)不为零时,点在填充区域外。
  4. InverseEvenOdd

    • EvenOdd 类似,但填充区域是 EvenOdd 填充区域的反向。
    • 当路径穿过点的次数为奇数时,点在填充区域外;为偶数时,点在填充区域内。
/// <summary>
/// 获取五星路径
/// </summary>
/// <returns></returns>
private SKPath GetStarPath(SKPoint center,float outerRadius)
{// 计算五角星的角度float angleStep = (float)(2 * Math.PI / 5);// 设置五角星的尺寸和位置//float outerRadius = 100;//SKPoint center = new SKPoint(150, 150); // 五角星中心点的位置// 计算五个顶点的坐标SKPoint[] starPoints = new SKPoint[5];for (int i = 0; i < 5; i++){float angle = angleStep * i;// 外部顶点float x = center.X + outerRadius * (float)Math.Sin(angle);float y = center.Y - outerRadius * (float)Math.Cos(angle); // 减号确保顶点在中心上方starPoints[i] = new SKPoint(x, y);}var starPath=new SKPath();// 开始定义路径starPath.MoveTo(starPoints[0]); // 从第一个顶点开始int index2 = 0;// 连接相隔的两个顶点for (int i = 2; i <= 5; i ++){index2 = (index2 + 2) % 5;starPath.LineTo(starPoints[index2]);}// 关闭路径starPath.Close();return starPath;
}
var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);
var info = e.Info;
using (var paint = new SKPaint())
using (var txtPaint = new SKPaint())
{paint.IsAntialias = true;paint.TextAlign = SKTextAlign.Center;paint.StrokeWidth = 3;paint.TextSize = 24;var path = GetStarPath(new SKPoint(150, 150),100F);var fillTypes = Enum.GetValues(typeof(SKPathFillType)) as SKPathFillType[];float dx = info.Width / 2;float dy = info.Height / 2; ;var index = 0;//foreach (var fillType in fillTypes){path.FillType = fillType;canvas.Save();canvas.Translate(dx * (index % 2), dy * (index / 2));canvas.ClipRect(SKRect.Create(dx, dy));paint.Color = SKColors.Red;canvas.DrawPath(path, paint);paint.Color = SKColors.Green;canvas.DrawText($"FillType:{fillType}", 150, 280, paint);               canvas.Restore();index++;}
}
  1. 定义一个生成五角星的函数
  2. 将画布分成四块,在每一块用不同的填充方式绘制五角星。

FillType

IsConcave 是否凹/ IsConvex 是否凸

public bool IsConcave { get; }
public bool IsConvex { get; }

判断一个路径的凹凸性。

  • 凹点(Convex Point):如果轮廓上的每个点都在其相邻两个点所形成的线段的同侧(包括线段上的端点),那么这个点就是凸的。
  • 凹点(Concave Point):如果轮廓上的某个点不满足凸点的定义,则称其为凹点。
var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);
var info = e.Info;
using (var paint = new SKPaint())
{paint.IsAntialias = true;paint.StrokeWidth = 3;paint.TextSize = 24;paint.Color = SKColors.Red;paint.Typeface = SKTypeface.FromFamilyName("宋体");var pathA = GetStarPath(new SKPoint(150, 150), 100);var pathB = new SKPath();pathB.AddRect(new SKRect(300, 50, 500, 200));canvas.DrawPath(pathA, paint);canvas.DrawText($"IsConcave凹:{pathA.IsConcave}", 20, 280, paint);canvas.DrawText($"IsConvex 凸:{pathA.IsConvex}", 20, 320, paint);canvas.DrawPath(pathB, paint);canvas.DrawText($"IsConcave凹:{pathB.IsConcave}", 320, 280, paint);canvas.DrawText($"IsConvex 凸:{pathB.IsConvex}", 320, 320, paint);
}

绘制一个五角星和一个矩形,判断其凹凸性。
IsConcave/IsConvex

IsEmpty是否为空

public bool IsEmpty { get; }

判断一个路径是否不包含任何线段或曲线。

IsLine是否为线段

public bool IsLine { get; }

判断一个路径是否为一条线段。

IsRect是否为矩形

public bool IsRect { get; }

判断路径是否为矩形。
注意,不是水平、垂直相交相连的线组成的矩形,这里返回的结果还是false。(是Skia的Bug吗?)

IsOval是否为椭圆或圆

public bool IsOval { get; }

判断路径是否为椭圆或圆。
注意四段贝赛尔曲线构成的圆,这里返回的结果还是false。

IsRoundRect是否为圆角矩形

public bool IsRoundRect { get; }

判断路径是否为圆角矩形。

** 相关示例 **

var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);
var info = e.Info;
using (var paint = new SKPaint())
{paint.IsAntialias = true;paint.StrokeWidth = 3;paint.TextSize = 24;paint.Color = SKColors.Red;paint.Typeface = SKTypeface.FromFamilyName("宋体");var pathA = new SKPath();var offsetY = 30F;var offsetX = 150F;canvas.DrawText($"1.new SKPath() IsEmpty:{pathA.IsEmpty}", offsetX, offsetY, paint);                offsetY += paint.FontSpacing;pathA.MoveTo(50, 50);canvas.DrawText($"2.1 MoveTo(50, 50) IsEmpty:{pathA.IsEmpty}", offsetX, offsetY, paint);offsetY += paint.FontSpacing;canvas.DrawText($"2.1 MoveTo(50, 50) IsLine: {pathA.IsLine}", offsetX, offsetY, paint);offsetY += paint.FontSpacing;pathA.LineTo(100, 50);canvas.DrawText($"3 LineTo(100, 50 IsLine: {pathA.IsLine}", offsetX, offsetY, paint);offsetY += paint.FontSpacing;pathA.LineTo(100, 100);pathA.LineTo(50, 100);pathA.Close();canvas.DrawText($"4 LineTo(100, 100),LineTo(50, 100),Close() IsRect: {pathA.IsRect}", offsetX, offsetY, paint);canvas.DrawPath(pathA, paint);var pathB=new SKPath();pathB.MoveTo(100, 150);pathB.LineTo(150, 200);pathB.LineTo(100, 250);pathB.LineTo(50, 200);pathB.Close();paint.IsStroke = true;canvas.DrawPath(pathB, paint);var width = (float)(Math.Sqrt(2) * 50);offsetY += 100;canvas.DrawText($"pathB IsRect: {pathB.IsRect}", offsetX, offsetY, paint);offsetY += paint.FontSpacing;var pathC=new SKPath();var rect = new SKRect(0, 0, width, width);paint.IsStroke = false;pathC.AddRect(rect);paint.Color = SKColors.LightGreen.WithAlpha(128);canvas.DrawText($"与pathB相同大小的pathC IsRect: {pathC.IsRect}", offsetX, offsetY, paint);canvas.Save();canvas.Translate(100, 150);canvas.RotateDegrees(45F);canvas.DrawPath(pathC, paint);canvas.Restore();var pathD=new SKPath();pathD.AddCircle(100, 350, 50);paint.IsStroke = true;canvas.DrawPath(pathD, paint);offsetY += 100;canvas.DrawText($"pathD IsOval: {pathD.IsOval}", offsetX, offsetY, paint);offsetY += paint.FontSpacing;var pathE = CreateCircleWithBeziers(100, 350, 50);paint.Color = SKColors.LightBlue.WithAlpha(128);paint.IsStroke = false;canvas.DrawPath(pathE, paint);canvas.DrawText($"贝赛尔曲线构成的圆 pathE IsOval: {pathE.IsOval}", offsetX, offsetY, paint);offsetY += 100;paint.Color = SKColors.LightBlue;canvas.DrawText($"pathC IsRoundRect: {pathE.IsRoundRect}", offsetX, offsetY, paint);offsetY += paint.FontSpacing;var pathF = new SKPath();pathF.AddRoundRect(new SKRect(30, 450, 150, 500), 10, 20);canvas.DrawPath(pathF, paint);canvas.DrawText($"pathF IsRoundRect: {pathF.IsRoundRect}", offsetX, offsetY, paint);
}

四条贝赛尔构成的圆

/// <summary>
/// 四条贝赛尔曲线构成的圆
/// </summary>
/// <param name="centerX"></param>
/// <param name="centerY"></param>
/// <param name="radius"></param>
/// <returns></returns>
public SKPath CreateCircleWithBeziers(float centerX, float centerY, float radius)
{// 定义路径var path = new SKPath();// 贝塞尔曲线控制点的系数float c = (float)(radius * (4.0f / 3.0f) * (Math.Sqrt(2) - 1));// 定义起点path.MoveTo(centerX + radius, centerY);// 第一段贝塞尔曲线path.CubicTo(centerX + radius, centerY + c, centerX + c, centerY + radius, centerX, centerY + radius);// 第二段贝塞尔曲线path.CubicTo(centerX - c, centerY + radius, centerX - radius, centerY + c, centerX - radius, centerY);// 第三段贝塞尔曲线path.CubicTo(centerX - radius, centerY - c, centerX - c, centerY - radius, centerX, centerY - radius);// 第四段贝塞尔曲线path.CubicTo(centerX + c, centerY - radius, centerX + radius, centerY - c, centerX + radius, centerY);// 闭合路径path.Close();return path;
}

路径形状判断

Item[] 获取路径的坐标

public SkiaSharp.SKPoint this[int index] { get; }

获取路径上指定序号的点的坐标。如果序号超出小于0或大于等于PointCount,则返回(0,0)。

LastPoint最后点的坐标

public SkiaSharp.SKPoint LastPoint { get; }

获取路径的最后一个点的坐标。如果路径为空,返回(0,0)。

PointCount总共坐标点的个数

public int PointCount { get; }

获取路径所有坐标点的个数。

Points获取所有坐标点

public SkiaSharp.SKPoint[] Points { get; }

获取路径所有坐标点。注意,这些点包含控制点,即不一定在路径轮廓上。

SegmentMasks 路径包含的类型

public SkiaSharp.SKPathSegmentMask SegmentMasks { get; }

获取一组标志,指示路径是否包含该类型的一个或多个段。

说明
Line =1线段(2个点)
Quad=2二次贝赛尔曲线(3个点)
Cubic=8三次贝赛尔曲线(4个点)
Conic=4圆锥曲线(3个点+权重)

VerbCount动词个数

public int VerbCount { get; }

获取路径中动词的数量(即SKPathVerb,有Move、Line、Quad、Conic、Cubic、Close、Done)
用SKPath对象的CreateRawIterator可获取相关SKPathVerb。

示例

  1. 在路径中添加圆、矩形、椭圆、圆角矩形、画线段、二次/三次贝赛尔曲线
  2. 通过路径动词和坐标集来复制一个路径。
var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);
var info = e.Info;
using (var paint = new SKPaint())
{paint.IsAntialias = true;paint.StrokeWidth = 7;paint.IsStroke = true;paint.TextSize = 24;paint.Color = SKColors.Red;paint.Typeface = SKTypeface.FromFamilyName("宋体");var path=new SKPath();path.AddCircle(200, 200, 100);path.AddRect(new SKRect(350, 100, 550, 200));path.AddOval(new SKRect(100, 350, 300, 450));path.AddRoundRect(new SKRoundRect(new SKRect(400,350,700,500),30));path.LineTo(300, 600);canvas.DrawPath(path, paint);var pts = path.Points;var verbCount = path.VerbCount;paint.Color = SKColors.Blue;canvas.DrawPoints(SKPointMode.Points, pts, paint);paint.StrokeWidth = 2;var drawPtList=new List<SKPoint>();for (int i = 0; i < pts.Length; i++){var pt = pts[i];var count = drawPtList.Count(z => z.Equals(pt));if (count > 0){var color = paint.Color;paint.Color = SKColors.Green;canvas.DrawText($"{i}", new SKPoint(pt.X - paint.TextSize * count, pt.Y), paint);paint.Color = color;}else{canvas.DrawText($"{i}", pts[i], paint);}drawPtList.Add(pt);}paint.Color = SKColors.Green;var newPath = ClonePathByVerb(path);paint.StrokeWidth = 1;canvas.DrawPath(newPath, paint);var offsetX = 20F;var offsetY = 500F;canvas.DrawText($"Path.PointCount:{path.PointCount}", offsetX, offsetY, paint);offsetY += paint.FontSpacing;canvas.DrawText($"Path.SegmentMasks:{path.SegmentMasks}", offsetX, offsetY, paint);offsetY += paint.FontSpacing;canvas.DrawText($"Path.VerbCount:{path.VerbCount}", offsetX, offsetY, paint);offsetY += paint.FontSpacing;canvas.DrawText($"Path.LastPoint:{path.LastPoint}", offsetX, offsetY, paint);offsetY += paint.FontSpacing;
}

SKPath属性

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024最全软件测试面试八股文(答案+文档+视频讲解)

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

OrangePi AIpro开发板测评 —— 相机图像获取

&#x1f482; 个人主页: 同学来啦&#x1f91f; 版权: 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏和订阅专栏哦 文章目录 &#x1f31f; 一、引言&#x1f31f; 二、OrangePi AIpro 简要介绍…

力扣206

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输…

基于Transformer的端到端的目标检测 | 读论文

本文正在参加 人工智能创作者扶持计划 提及到计算机视觉的目标检测&#xff0c;我们一般会最先想到卷积神经网络&#xff08;CNN&#xff09;&#xff0c;因为这算是目标检测领域的开山之作了&#xff0c;在很长的一段时间里人们都折服于卷积神经网络在图像处理领域的优势&…

【数据库】E-R图、E-R模型到关系模式的转换、关系代数表达式、范式

一、E-R图 1、基本概念 2、实体集之间的联系 3、E-R图要点 &#xff08;1&#xff09;实体&#xff08;型&#xff09;的表示 &#xff08;2&#xff09;E-R图属性的表示 &#xff08;3&#xff09;联系的表示 4、E-R模型的例题 二、E-R模型到关系模式的转换 1、实体型的转换…

使用getline()从文件中读取一行字符串

我们知道&#xff0c;getline() 方法定义在 istream 类中&#xff0c;而 fstream 和 ifstream 类继承自 istream 类&#xff0c;因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。 当文件流对象调用 getline() 方法时&#xff0c;该方法的功能就变成了从指定文件…

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用 一、功能描述: 上位机通过CAN总线实现对电机的运动控制,主要包含三种模式:位置模式、速度模式以及力矩模式。驱动器硬件核心为STM32F103C8T6,带相电压采集电路以及母线电压采集电路。其中供电电压12V。 PWM中心对…

【单片机毕业设计选题24047】-基于阿里云的工地环境监测系统

系统功能: 基于STM32完成 主机&#xff08;阿里云以及oled屏显示位置一&#xff09;&#xff1a;烟雾检测&#xff0c;温湿度检测&#xff0c;噪声检测&#xff0c;且用OLED屏显示&#xff0c;设置阈值&#xff0c;超过报警&#xff08;蜂鸣器&#xff09;。 从机&#xff0…

LeetCode题练习与总结:对链表进行插入排序--147

一、题目描述 给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&#xff0c;直到所有元素可以形成一个有序的输出列表。每次迭代中&#xff0c;…

Element中的日期时间选择器DateTimePicker和级联选择器Cascader

简述&#xff1a;在Element UI框架中&#xff0c;Cascader&#xff08;级联选择器&#xff09;和DateTimePicker&#xff08;日期时间选择器&#xff09;是两个非常实用且常用的组件&#xff0c;它们分别用于日期选择和多层级选择&#xff0c;提供了丰富的交互体验和便捷的数据…

【server】nacos 安装

1、本地安装 1.1 nacos官网 Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网 git 下载地址&#xff1a;https://github.com/alibaba/nacos/releases 1.2 解压并修改配置 1.2.1 通过properties 修改配置&#xff0c;添加数据库配置 1.2.2 创建数据库&…

字节码编程ASM之生成变量并sout

写在前面 本文看下如何通过asm生成变量并sout。 1&#xff1a;代码 直接看代码吧&#xff0c;注释很详细&#xff0c;有不懂的&#xff0c;留言告诉我&#xff1a; package com.dahuyuo.asmtest;import org.objectweb.asm.*; import org.objectweb.asm.commons.AdviceAdapt…

VCS+Vivado联合仿真BUG

场景&#xff1a; 在vcsvivado联合仿真过程中&#xff0c;对vivado导出的shell脚本修改&#xff0c;修改某些source文件路径&#xff0c;vcs编译时会报Permission Denied。 问题描述 对shell脚本修改如下&#xff1a; 修改仅为注释掉某一行&#xff0c;下面变为source文件新…

Linux shell编程学习笔记62: top命令 linux下的任务管理器

0 前言 top命令是Unix 和 Linux下常用的性能分析工具&#xff0c;提供了一个动态的、交互式的实时视图&#xff0c;显示系统的整体性能信息&#xff0c;以及正在运行的进程的相关信息&#xff0c;包括各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。 1 top命令…

数据特征采样在 MySQL 同步一致性校验中的实践

作者&#xff1a;vivo 互联网存储研发团队 - Shang Yongxing 本文介绍了当前DTS应用中&#xff0c;MySQL数据同步使用到的数据一致性校验工具&#xff0c;并对它的实现思路进行分享。 一、背景 在 MySQL 的使用过程中&#xff0c;经常会因为如集群拆分、数据传输、数据聚合等…

【堆 优先队列】23. 合并 K 个升序链表

本文涉及知识点 堆 优先队列 LeetCode23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#…

基流科技:超算界的新星,Pre-A轮融资大获成功

基流科技:超算界的新星,Pre-A轮融资大获成功! 在科技的浪潮中,一颗新星正在冉冉升起——基流科技,一家开放算力网络提供商,以其革命性的技术在超算界引起了轰动。今年年初,基流科技完成了 Pre-A 轮融资,由光速光合领投,此前已获得奇绩创坛、微梦传媒等知名投资方的青…

mysql定时备份数据库

文章目录 核心目标思路具体方法一、编写脚本二、修改文件属性三、找一个mysqldump文件四、把.sh放到定时器里 其它&#xff1a;windows的脚本 核心目标 解决数据库定时备份的工作。centos环境。 思路 用centos的crontab定时执行脚本。 具体方法 一、编写脚本 编写backup_…

Kafka集群部署(手把手部署图文详细版)

1.1.1 部署zookpeer 在node02下载并解压zookeeper软件包 cd /usr/local wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 或者&#xff1a;scp cat192.168.28.100:/home/cat/zookeeper-3.4.6.tar.gz /tmp&#xff08;注意目录&#xf…

鸿蒙小案例-首选项工具类

一个简单的首选项工具类 主要提供方法 初始化 init()方法建议在EntryAbility-》onWindowStageCreate 方法中使用 没多少东西&#xff0c;放一下测试代码 import { PrefUtil } from ./PrefUtil; import { promptAction } from kit.ArkUI;Entry Component struct PrefIndex {St…