【Godot4.3】点数据简易表示法和Points2D

概述

在构造多点路径时我们会用到PackedVector2Array,并使用Vector2()来构造点。在手动创建多点数据时,这种写法其实很难看,有大量重复的Vector2(),比如下面这样:

var points = [Vector2(100,100),Vector2(200,200),Vector2(300,300)]

如果有办法省去重复的Vector2()就好了。代码会显得简洁不少。

这也就是本篇文章探讨和实现的内容,用更简单的方式去表示点集(PackedVector2Array)。

点数据简易表示法

多点坐标字符串

我们可以用字符串形式,表示多个点的数据。比如:

var points = "100,100 200,200 300,300"

每对坐标用空格间隔。转化函数如下:

# 字符串形式的点数据转化为PackedVector2Array
func PotsStr2Vec2Arr(pots_str:String) -> PackedVector2Array:var arr:PackedVector2Arrayfor cord_str in pots_str.split(" "):var cord = cord_str.split(",")arr.append(Vector2(float(cord[0]),float(cord[1])))return arr

转化结果:

[(100, 100), (200, 200), (300, 300)]

坐标对顺序数组

也可以用坐标元素组成的数组表示多个点。

var points = [[100,100],[200,200],[300,300]]

转化函数:

# Array[Array]形式的点数据转化为PackedVector2Array
func PotsArr2Vec2Arr(pots:Array) -> PackedVector2Array:var arr:PackedVector2Arrayfor cord in pots:arr.append(Vector2(cord[0],cord[1]))return arr

坐标紧凑排列数组

更极端的表示方法是,将顺序的点坐标按顺序紧密的排列。

var points = [100,100,200,200,300,300]

转化函数:

# Array形式的点数据转化为PackedVector2Array
func Pots2Vec2Arr(pots:Array) -> PackedVector2Array:var arr:PackedVector2Array = []if pots.size() % 2 == 0:for i in range(pots.size()):if i % 2 == 0:arr.append(Vector2(pots[i],pots[i+1]))return arr

三合一解析

# 点数据转化为PackedVector2Array
func Vec2Arr(pots) -> PackedVector2Array:var arr:PackedVector2Array = []if pots is String: # 字符串形式for cord_str in pots.split(" "):var cord = cord_str.split(",")arr.append(Vector2(float(cord[0]),float(cord[1])))else: # 数组形式if pots[0] is Array:   # Array[Array] 形式for cord in pots:arr.append(Vector2(cord[0],cord[1]))else:if pots.size() % 2 == 0:for i in range(pots.size()):if i % 2 == 0:arr.append(Vector2(pots[i],pots[i+1]))return arr

则以下三种形式都可以被正确解析:

var points = Vec2Arr("100,100 200,200 300,300")
var points = Vec2Arr([[100,100],[200,200],[300,300]])
var points = Vec2Arr([100,100,200,200,300,300])

Points2D

紧缩二维向量数组PackedVector2Array,通常被用来表示2D折线或多边形的顺序点集,通常用于CanvasItem绘图等。

在求解复杂图形时,对于2D点集,通常我们会进行大量的变换、逆序等操作,而且会对其点、线进行遍历等操作。PackedVector2Array虽然也可以实现这些操作,但是每次都需要重新编写,二且作为数据类型,是无法拓展子类的。所以单独写一个类就很有必要了。

  • 通过将PackedVector2Array封装为Point2D类型,便可以将变换和翻转操作直接写成方法,并直接返回操作后的顶点数据。
  • 简易点数据转化函数可以写成该类的静态方法,既方便类实例使用,也方便其他地方使用。

在这里插入图片描述

class_name Points2Dvar points:PackedVector2Array# ==================== 实例化 ==================== 
func _init(pots) -> void:if pots is PackedVector2Array:self.points = potselse:self.points = Vec2Arr(pots)# ==================== 变换 ==================== 
# 水平翻转
func flip_x() -> PackedVector2Array:return Transform2D.FLIP_X * points
# 垂直翻转
func flip_y() -> PackedVector2Array:return Transform2D.FLIP_Y * points
# 旋转
func rotated(degree:float) -> PackedVector2Array:return Transform2D().rotated(deg_to_rad(degree)) * points
# 平移
func translated(offset:Vector2) -> PackedVector2Array:return Transform2D().translated(offset) * points# ==================== 逆序 ==================== 
func reverse() -> PackedVector2Array:var pots = points.duplicate()pots.reverse()return pots# ==================== 简易点数据转化函数 ==================== 
# 点简易数据转化为 PackedVector2Array
static func Vec2Arr(pots) -> PackedVector2Array:var arr:PackedVector2Array = []if pots is String: # 字符串形式for cord_str in pots.split(" "):var cord = cord_str.split(",")arr.append(Vector2(float(cord[0]),float(cord[1])))else: # 数组形式if pots[0] is Array:   # Array[Array] 形式for cord in pots:arr.append(Vector2(cord[0],cord[1]))else:if pots.size() % 2 == 0:for i in range(pots.size()):if i % 2 == 0:arr.append(Vector2(pots[i],pots[i+1]))return arr

使用测试

extends Node2Dvar points = Points2D.Vec2Arr("100,100 200,200 300,200")func _draw() -> void:draw_polyline(points,Color.AQUAMARINE,1)

可以看到:

  • 通过将Vec2Arr作为Points2D的静态方法,我们可以很方便的使用简易点表示表示法。
extends Node2Dvar points = Points2D.new("100,100 200,200 300,200")func _draw() -> void:draw_polyline(points.points,Color.AQUAMARINE,1)

同样的,我们可在用new()实例化一个Points2D对象时,传入简易点数据表示形式。

使用镜像变换

extends Node2Dvar points = Points2D.new("100,100 200,200 300,200")func _draw() -> void:draw_polyline(points.points,Color.AQUAMARINE,1)draw_polyline(points.flip_x(),Color.ORANGE,1)draw_polyline(points.flip_y(),Color.YELLOW_GREEN,1)

使用旋转变换

extends Node2Dvar points = Points2D.new("100,100 200,200 300,200")func _draw() -> void:draw_polyline(points.points,Color.AQUAMARINE,1)for i in range(1,10):draw_polyline(points.rotated(15 * i),Color.ORANGE,1)

使用逆序+平移变换

extends Node2Dvar points = Points2D.new("100,100 200,200 300,200")func _ready() -> void:var ps2 = Points2D.new(points.reverse())  # 逆序点points.points.append_array(ps2.translated(Vector2(100,-100)))func _draw() -> void:draw_polyline(points.points,Color.AQUAMARINE,1)

可以看到:

  • 通过添加平移了一段距离的折线的逆序点,可以构造一个多边形。上面的点集用draw_polygon()可以直接绘制出多边形。

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

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

相关文章

项目扩展二:消息拉取功能的实现

项目扩展二:消息拉取功能的实现 一、回顾一下消息推送功能是如何实现的二、设计消息拉取功能1.服务器如何处理2.定义Request和Response1.定义Request2.proto文件 三、服务器实现消息拉取1.业务模块的实现:信道模块2.消费者管理模块实现O(1)获取消费者1.目…

C++迭代器 iterator详解

目录 什么是迭代器 迭代器的类型 迭代器的用法 三种迭代器 范围for 什么是迭代器 它提供了一种访问容器(如列表、集合等)中元素的方法,而无需暴露容器的内部表示。迭代器使得程序员能够以统一的方式遍历不同的数据结构,而无需…

JVM的基本概念

目录 一、JVM的内存划分 二、JVM的类加载过程 三、JVM的垃圾回收机制(GC) 四、分代回收 一、JVM的内存划分 一个运行起来的Java进程,就是一个Java虚拟机,就需要从操作系统中申请一大块内存。申请的内存会划分为不同的区域&…

5.工欲善其事,必先利其器!收集金融数据你必须先做这个!

在正式从网络上获取数据并存储到我们的数据库之前,我们还需要做一些准备工作。其中最重要的无疑是把Python环境配置好。 你可以不好好学习Python,毕竟我后边会一步步教大家,也会提供现成的Python脚本。但是你必须得在你的电脑上把Python安装…

基于51单片机无线蓝牙智能家居控制系统设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图![请添加图片描述](https://i-blog.csdnimg.cn/direct/c25dac9c3044416385d22a655dee5c3d.jpeg)设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff…

LLM安全风险及应对

LLM安全风险主要从四个维度分析:用户输入、训练数据、模型本身以及工具和插件。 风险类别具体风险风险解释应对措施具体举例用户输入相关风险提示注入(Prompt Injection)攻击者通过设计特定输入,使模型生成恶意或不安全的输出。- …

FLStudio21Mac版flstudio v21.2.1.3430简体中文版下载(含Win/Mac)

给大家介绍了许多FL21版本,今天给大家介绍一款FL Studio21Mac版本,如果是Mac电脑的朋友请千万不要错过,当然我也不会忽略掉Win系统的FL,链接我会放在文章,供大家下载与分享,如果有其他问题,欢迎…

【成神之路】Ambari实战-011-代码生命周期-metainfo加载原理深度剖析

在 Ambari 中,metainfo.xml 是定义服务和组件的关键配置文件。Ambari 通过解析它来加载和管理服务的整个生命周期。今天,我们将深入探索 metainfo.xml 是如何被解析的,并以 Redis 集群服务为例,逐步解读 Ambari 的处理过程。&…

cv中每个patch的关联

在计算机视觉任务中,当图像被划分为多个小块(patches)时,每个 patch 的关联性可以通过不同的方法来计算。具体取决于使用的模型和任务,以下是一些常见的计算 patch 关联性的方法: 1. Vision Transformer (…

Java : 图书管理系统

图书管理系统的作用: 高效的图书管理 图书管理系统通过自动化管理,实现了图书的采编、编目、流通管理等操作的自动化处理,大大提高了图书管理的效率和准确性。 工作人员可以通过系统快速查找图书信息,实时掌握图书的借还情况&…

【comfyUI工作流】一键生成专属欧美漫画!

现在你不需要在webui上手动设置一堆的参数 来将自己的照片转绘成欧美漫画插画 可以通过我制作的工作流一键完成转绘,更加效率便捷, 而且不需要你懂什么专业的AI绘画知识,会打开工作流,上传图片就可以 工作流特点 真实照片一键…

程序员的AI时代:拥抱变革,塑造未来

你们有没有想过,如果有一天,你的编程工作被一个AI助手取代了,你会怎么办?这不是危言耸听,随着AIGC技术的飞速发展,这样的场景可能真的会出现。但是,别担心,今天我们就来聊聊&#xf…

XSS—xss-labs靶场通关

level 1 JS弹窗函数alert() <script>alert()</script> level 2 闭合绕过 "> <script>alert()</script> <" level 3 onfocus事件在元素获得焦点时触发&#xff0c;最常与 <input>、<select> 和 <a> 标签一起使用…

[Excel VBA办公]如何使用VBA批量删除空行

在处理Excel数据时&#xff0c;空行可能会干扰数据分析和展示。以下是一个VBA代码示例&#xff0c;帮助你批量删除工作表中的空行。 1. 代码说明 此代码将遍历指定工作表&#xff0c;删除所有空行&#xff0c;确保数据整洁。 2. VBA代码 删除sheet1的空行 Sub DeleteEmptyRow…

re题(39)BUUCTF-[FlareOn3]Challenge1

BUUCTF在线评测 (buuoj.cn) 查壳是32位&#xff0c;ida打开&#xff0c;进入main函数&#xff0c;进入sub_401260看看 查看byte_413000存的字符串 _BYTE *__cdecl sub_401260(int a1, unsigned int a2) {int v3; // [espCh] [ebp-24h]int v4; // [esp10h] [ebp-20h]int v5; //…

19 基于51单片机的倒计时音乐播放系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 五个按键&#xff0c;分别为启动按键&#xff0c;则LCD1602显示倒计时&#xff0c;音乐播放 设置按键&#xff0c;可以设置倒计时的分秒&#xff0c;然后加减按键&#xff0c;还有最后一个暂停音乐…

项目集成sharding-jdbc

目录 项目集成sharding-jdbc 1.业务分析 2.数据库构建 3.分库分表策略 项目配置默认数据源 一&#xff1a;导入sharding-jdbc依赖 二&#xff1a;在application文件中编写配置 三&#xff1a;注释掉主配置文件中配置的数据源 注意&#xff1a;这里添加了spring.main.allow…

芝士AI论文写作|开题报告、论文生成、降重、降AI、答辩PPT

芝士AI&#xff0c;免费论文查重软件,为毕业生提供专业的AI论文生成、强力降重、AIGC降低、论文重复率检测、论文降重、学术查重、学术检测、PPT生成、学术论文观点剽窃检测等一站式服务。免费论文查重_芝士AI&#xff08;PaperZZ&#xff09;论文检测__PaperZZ论文查重 是不是…

Snap 发布新一代 AR 眼镜,有什么特别之处?

Snap 发布新一代 AR 眼镜&#xff0c;有什么特别之处&#xff1f; Snap 简介 新一代的 AR 眼镜特点 Snap 简介 Snap 公司成立于 2010 年&#xff0c;2017 年美国东部时间 3 月 2 日上午 11 时许&#xff0c;在纽交所正式挂牌交易&#xff0c;股票代码为 “SNAP”。其旗下的核…

QT 信号和槽函数

信号和槽函数介绍 conncet(sender, signal, receiver, slot) /* * 1. 信号发出者&#xff1b; * 2. 信号&#xff1b; * 3. 信号接收者&#xff1b; * 4. 接受到信号执行任务&#xff1b; 槽函数 */自定义信号和槽函数 场景 &#xff1a;老师饿了&#xff0c;学生请客&#xf…