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

news2024/11/14 19:03:48

概述

在构造多点路径时我们会用到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:PackedVector2Array
	for 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:PackedVector2Array
	for 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 Points2D

var points:PackedVector2Array

# ==================== 实例化 ==================== 
func _init(pots) -> void:
	if pots is PackedVector2Array:
		self.points = pots
	else:
		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 Node2D

var points = Points2D.Vec2Arr("100,100 200,200 300,200")

func _draw() -> void:
	draw_polyline(points,Color.AQUAMARINE,1)

可以看到:

  • 通过将Vec2Arr作为Points2D的静态方法,我们可以很方便的使用简易点表示表示法。
extends Node2D

var points = Points2D.new("100,100 200,200 300,200")

func _draw() -> void:
	draw_polyline(points.points,Color.AQUAMARINE,1)

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

使用镜像变换

extends Node2D

var 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 Node2D


var 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 Node2D


var 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.coloradmin.cn/o/2155432.html

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

相关文章

240922-MacOS终端访问硬盘

A. 最终效果 B. 操作步骤 在macOS中,可以通过命令行使用Terminal访问硬盘的不同位置。你可以按照以下步骤操作: 打开终端(Terminal): 在应用程序中打开终端,或者使用 Spotlight 搜索“Terminal”来启动。 …

WebLogic 靶场攻略

后台弱⼝令GetShell 步骤一:环境部署 cd vulhub-master/weblogic/weak_password docker-compose up -d docker ps 步骤二:漏洞复现 默认账号密码:weblogic/Oracle123 步骤二:进行登录 http://192.168.10.190:7001/console/…

thinkphp8 从入门到放弃(后面会完善用到哪里写到哪)

thinkphp8 从入门到放弃 引言 thinkphp* 大道至简一、 thinkphp8 安装安装Composerthinkphp 安装命令(tp-项目名称)多应用安装(一个项目不会只有一个应用)安装完文件目录如下本地部署配置伪静态好了项目可以run 二、架构服务(Service&#xf…

【C++ Primer Plus习题】17.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <fstream> using namesp…

【树莓派】通过HTTP服务器实时传输视频流

前言一、树莓派端的代码二、网页端网址展示总结 前言 树莓派3B的通过HTTP服务器实时传输MJPEG视频流 一、树莓派端的代码 注意在先安装完库 pip install Flask picameraFlask 是一个用 Python 编写的轻量级 web 框架。它主要用于构建 web 应用和 web 服务。Flask 提供了许多…

【无标题】HG6201M路由的超级管理密码获取

这里写自定义目录标题 1、开启telnet http://192.168.1.1/cgi-bin/telnetenable.cgi?telnetenable1&keyXXXXX 注意&#xff1a;此处的XXXXX为路由背面标签的MAC地址&#xff0c;去掉“-”&#xff0c;且大写。 成功后会显示&#xff1a;telnet开启 2、登录telnet 此处采…

C++异常(基本知识)、C++模板类(基本知识)

什么是异常和异常处理&#xff1f; 异常就是程序运行过程中出现的问题。“异常”问题并不经常出现&#xff08;按道理来说我们写好的正常的程序是不应该频繁出现异常的&#xff09;&#xff1b;异常处理技术使得我们可以写程序解决出现的异常问题。很多情况下&#xff0c;处理异…

有女朋友后,怎么养成贤内助?为自己找个好伴侣,为孩子找个好妈妈,为母亲找个好儿媳

有女朋友后&#xff0c;怎么养成贤内助&#xff1f;为自己找个好伴侣&#xff0c;为孩子找个好妈妈&#xff0c;为母亲找个好儿媳 时代背景女生有点作怎么办&#xff1f;大商家族的爱情观 时代背景 一块钱的东西&#xff0c;赋予俩块钱的意义&#xff0c;三块钱卖出去。 用商…

【垃圾识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目选题+TensorFlow+图像识别

一、介绍 垃圾识别分类系统。本系统采用Python作为主要编程语言&#xff0c;通过收集了5种常见的垃圾数据集&#xff08;‘塑料’, ‘玻璃’, ‘纸张’, ‘纸板’, ‘金属’&#xff09;&#xff0c;然后基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对图像数据集进…

vscode -ssh免密登陆

1.生成ssh使用的公钥/密钥对 请从客户端上的 PowerShell 或 cmd 提示符运行以下命令&#xff0c;具体使用方法详细见&#xff1a;微软官方 ssh-keygen -t rsa 一路回车&#xff0c;秘钥会生成到C:\Users\name\.ssh 2.将私钥配置到vscode的ssh中&#xff1a; 3.将本地公钥配置…

【计算机网络篇】数据链路层 功能|组帧|流量控制与可靠传输机制

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 系列文章目录 【计算机网络篇】计算机网络概述 【计算机网络篇…

最新免费域名申请

在互联网时代&#xff0c;每个码农都想拥有一个免费的域名&#xff0c;方便开发调试&#xff0c;也可用作自己网站等。如何申请一个免费的域名&#xff0c;时间上先错过了freenom&#xff0c;后面又错过nic.eu.org申请(现在申请时间长且很难通过)&#xff0c;直到最近又有免费的…

[杂谈-黑神话:悟空] 中国3A游戏的崛起之路:挑战与机遇并存

[杂谈-黑神话:悟空] 中国3A游戏的崛起之路&#xff1a;挑战与机遇并存 《黑神话&#xff1a;悟空》的出现&#xff0c;让我们看到了中国3A游戏的希望和未来。对于中国游戏产业的从业者和爱好者来说&#xff0c;这是一个值得关注和期待的领域。 在游戏产业蓬勃发展的今天&#…

QT打包--windeployqt执行,运行程序提示缺少库

执行windeployqt.exe D:\Data\code\QtCode\Release\RegularExp\RegularExp.exe 生成相应的dll动态库 执行RegularExp.exe&#xff0c;出错&#xff1a;“由于找不到libgcc_s_seh-1.dll…” 找到安装的qt对应的libgcc_s_seh-1.dll拷贝到RegularExp.exe同级目录下&#xff0c; 执…

力扣题解2374

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;中等&#xff09;&#xff1a; 边积分最高的节点 给你一个有向图&#xff0c;图中有 n 个节点&#xff0c;节点编号从 0 到 n - 1 &#xff0c;其中每个节点都 恰有一条 出边。…

[大语言模型-论文精读] 以《黑神话:悟空》为研究案例探讨VLMs能否玩动作角色扮演游戏?

1. 论文简介 论文《Can VLMs Play Action Role-Playing Games? Take Black Myth Wukong as a Study Case》是阿里巴巴集团的Peng Chen、Pi Bu、Jun Song和Yuan Gao&#xff0c;在2024.09.19提交到arXiv上的研究论文。 论文: https://arxiv.org/abs/2409.12889代码和数据: h…

2024年9月19日

1.四个属性: 连接数据库 四个属性 操作数据库重要的对象 操作sql语句的对象 预编译 结果集 对象的属性和数据表的子弹 映射准备这条sql语句 文件:核心配置文件 2.创建 build success 做工具类 如果客户名不为空,否则客户名为空

Python中的IPython:交互式的Python shell

你是否曾经想要一个能让你与Python代码实时交互的环境&#xff1f;一个可以即时执行代码、查看结果&#xff0c;甚至可以在运行过程中修改变量的工具&#xff1f;如果是&#xff0c;那么IPython就是为你量身打造的利器&#xff01;在这篇文章中&#xff0c;我们将深入探讨IPyth…

CDVAE项目环境配置

CDVAE环境配置 1. 系统环境2. 设置环境变量3. 配置环境变量4. 安装CDVAE虚拟环境5. 资料下载 1. 系统环境 系统环境&#xff1a;Ubuntu22.04GeForce RTX 3090cuda12.6&#xff08;cuda版本11.1以上均适用&#xff09;。 2. 设置环境变量 先按照CDVAE中描述的设置环境变量。 …

金刚石切削工具学习笔记分享

CVD钻石-合成单晶钻石之一 金刚石具有极高的硬度和耐磨性、较低的摩擦系数、较高的弹性模量、较高的热导率、较低的热膨胀系数、与有色金属的亲和力较小等优点&#xff0c;是目前最硬的工具材料&#xff0c;主要分为单晶金刚石和聚晶金刚石两大类。单晶金刚石又分为天然单晶金…