【Godot4.2】CanvasItem绘图函数全解析 - 8.绘制点索引

news2025/6/5 18:41:04

概述

在示意图绘制过程中或者测试过程中,可能需要标记点的索引。

最常见的形式就是用一个圆圈作为背景,用阿拉伯数字作为索引。
在这里插入图片描述

实现的重点是动态计算背景圆的半径。原理是,获取字符串的矩形,取对角线长度的一半作为外接圆的半径

系列目录

  • 0.概述
  • 1.绘制简单图形
  • 2.设定绘图变换
  • 3.绘制纹理
  • 4.绘制样式盒
  • 5.绘制字符和字符串
  • 6.TextLine和TextParagraph详解
  • 7.自定义节点TextBoard
  • 8.绘制点索引
  • 9.绘制表格

绘图函数实现

# 绘制带有编号的圆,用于标记几何图形顶点
func draw_point_idx(canvas:RID,pos:Vector2,index:int,bg_color:=Color.YELLOW,color:=Color.BLACK,font_size:=16,font:Font = ThemeDB.fallback_font):
	# 构造TextLine
	var text = TextLine.new()
	text.add_string(str(index),font,font_size) # 按设置的字体和字号添加编号
	
	var offset_pos = pos - text.get_size()/2.0  # 文本矩形中心对齐到pos
	# 文本的矩形区域
	var rect = Rect2(offset_pos,text.get_size())
	
	# 半径 = 对角线长度的一半
	var r = text.get_size().length()/2.0
	# 绘制外接圆
	draw_circle(rect.get_center(),r,bg_color)
	## 绘制文本矩形区域
	#draw_rect(rect,Color.DARK_GRAY)
	# 绘制字符串
	text.draw(canvas,offset_pos,color)

测试1

extends Node2D

var points:PackedVector2Array

func _ready() -> void:
	for i in range(6):
		points.append(Vector2(300,200) + Vector2.RIGHT.rotated(deg_to_rad(360.0/6 * i)) * 100)

func _draw() -> void:
	draw_colored_polygon(points,Color.YELLOW_GREEN)
	for i in range(points.size()):
		draw_point_idx(get_canvas_item(),points[i],i,Color.YELLOW,Color.BLACK,10)

效果:

image.png

测试2

extends Node2D

var points:PackedVector2Array

func _ready() -> void:
	for i in range(6):
		points.append(Vector2(300,200) + Vector2.RIGHT.rotated(deg_to_rad(360.0/6 * i)) * 100)
		points.append(Vector2(300,200) + Vector2.RIGHT.rotated(deg_to_rad(360.0/6 * i)) * 50)

func _draw() -> void:
	draw_colored_polygon(points,Color.YELLOW_GREEN)
	for i in range(points.size()):
		draw_point_idx(get_canvas_item(),points[i],i,Color.YELLOW,Color.BLACK,10)

image.png

测试3

extends Node2D

var points:PackedVector2Array

func _ready() -> void:
	var pos = Vector2(500,300)
	var right = Vector2.RIGHT
	var step = 30
	var r1 = 200
	var r2 = 160
	
	for i in range(step):
		var ag = deg_to_rad(360.0/step)
		points.append(pos + right.rotated(ag * i) * r1)
		points.append(pos + right.rotated(ag * i) * r2)

func _draw() -> void:
	draw_colored_polygon(points,Color.YELLOW_GREEN)
	for i in range(points.size()):
		draw_point_idx(get_canvas_item(),points[i],i,Color.YELLOW,Color.BLACK,10)

在这里插入图片描述

实现任意文本标记

修改一下函数的参数,就可以实现任意文本的绘制。

# 绘制带有文本的圆,用于标记几何图形顶点索引或显示坐标等
func draw_point_idx(canvas:RID,pos:Vector2,string:String,bg_color:=Color.YELLOW,color:=Color.BLACK,font_size:=16,font:Font = ThemeDB.fallback_font):
	# 构造TextLine
	var text = TextLine.new()
	text.add_string(string,font,font_size) # 按设置的字体和字号添加编号
	
	
	var offset_pos = pos - text.get_size()/2.0  # 文本矩形中心对齐到pos
	# 文本的矩形区域
	var rect = Rect2(offset_pos,text.get_size())
	
	# 半径 = 对角线长度的一半
	var r = text.get_size().length()/2.0
	# 绘制外接圆
	draw_circle(rect.get_center(),r,bg_color)
	## 绘制文本矩形区域
	#draw_rect(rect,Color.DARK_GRAY)
	# 绘制字符串
	text.draw(canvas,offset_pos,color)

测试代码:

extends Node2D

var points:PackedVector2Array

var pos = Vector2(500,300)
var right = Vector2.RIGHT
var step = 30
var r1 = 200
var r2 = 160

func _ready() -> void:
	for i in range(step):
		var ag = deg_to_rad(360.0/step)
		points.append(pos + right.rotated(ag * i) * r1)
		points.append(pos + right.rotated(ag * i) * r2)

func _draw() -> void:
	draw_colored_polygon(points,Color.YELLOW_GREEN)
	draw_point_idx(get_canvas_item(),pos,"C",Color(Color.YELLOW,0.5),Color.BLACK,10)
	for i in range(points.size()):
		draw_point_idx(get_canvas_item(),points[i],str(i),Color(Color.YELLOW,0.5),Color.BLACK,10)

绘制效果:
image.png

综合实例

extends Node2D

var points:PackedVector2Array

var pos = Vector2(500,300)
var right = Vector2.RIGHT
var step = 12
var r1 = 200

func _ready() -> void:
	for i in range(step):
		var ag = deg_to_rad(360.0/step)
		var p = pos + right.rotated(ag * i) * r1
		points.append(p)
		

func _draw() -> void:
	draw_arc(pos,r1,0,TAU,100,Color.AQUAMARINE,1)    # 外接圆
	
	draw_colored_polygon(points,Color.YELLOW_GREEN)  # 多边形
	
	# 按顺序标记多边形顶点
	for i in range(points.size()):
		draw_line(pos,points[i],Color.DARK_GREEN,1)  # 圆心到多边形顶点的连线
		draw_point_idx(get_canvas_item(),points[i],str(i),Color(Color.YELLOW,0.5),Color.BLACK,10)
	
	# 标记圆心
	draw_point_idx(get_canvas_item(),pos,"圆心",Color(Color.YELLOW,0.5),Color.BLACK,10)
	
	# 标记单个角度
	var ang = TAU/step
	draw_arc(pos,30,0,ang,100,Color.DARK_GREEN,1)
	draw_point_idx(get_canvas_item(),pos + right.rotated(ang/2.0) * 40, "%s°" % str(rad_to_deg(ang)),Color(Color.YELLOW,0.0),Color.BLACK,10)

绘制效果:
image.png

总结

  • 标记和绘制点索引是一种很常用且重要的效果
  • 本文只是涉及了点索引在几何图形上的使用,实际上可以将它使用在类似标记AStar路径点这样的功能上,让原本抽象的内容一下子变得清晰

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

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

相关文章

Servlet测试1

通过按钮提交get,post请求,并且后端响应数据,显示到前端 当点击get按钮时 是发起Get请求 后端接收到Get请求后,把数据写入到body内 当点击pst按钮时 是发起Post请求 后端接收到Post请求后,把数据写入到body内 之后前端就从bod…

【避坑/个人总结】CARLA仿真遇到问题总结1

问题描述 执行以下命令时: ./CarlaUE4.sh // 以及 ros2 launch carla_shenlan_bridge_ego_vis carla_bridge_ego_vehilce.launch.py 出现以下的问题: 解决方法: 更新numpy库到1.23的版本

Linux【实战篇】—— NFS服务搭建与配置

目录 一、介绍 1.1什么是NFS? 1.2客户端与服务端之间的NFS如何进行数据传输? 1.3RPC和NFS的启动顺序 1.4NFS服务 系统守护进程 二、安装NFS服务端 2.1安装NFS服务 2.2 创建共享目录 2.3创建共享目录首页文件 2.4关闭防火墙 2.5启动NFS服务 2.…

【蓝桥杯】2024年第15届真题题目

试题 A: 握手问题 本题总分: 5 分 【问题描述】 小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上, 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进 行一次握手(且仅有一次&a…

【数据恢复软件】:Magnet AXIOM V8.0

Magnet AXIOM V8.0重大更新 1、全新的UI设计 2、更快的相应速度 3、补全工件分析 4、支持亚马逊AWS云数据( 获取同一帐户或安全帐户上下文中的快照。 支持Windows实例、加密卷和超过1 TB的卷、具有多个卷的实例等等! ) 5、Bug修复 6、AI支持…

【QT+QGIS跨平台编译】099:【QGIS_CORE跨平台编译】—【错误处理:qgscoordinatereferencesystem.cpp编译不通过】

点击查看专栏目录 文章目录 一、错误信息二、原因分析三、错误处理3.1 qgscoordinatereferencesystem_legacy.h3.2 qgscoordinatereferencesystem.cpp一、错误信息 macOS操作系统中,Release环境下编译qgscoordinatereferencesystem.cpp,出现错误,详细信息如下: 二

【软件设计师】计算机软考下午题试题六,Java设计模式之简单工厂模式。

【软件设计师】计算机软考下午题试题六,Java设计模式之简单工厂模式。 代码如下: //简单工厂模式 public class SimpleFactory {public static void main(String[] args) {Product ProductAFactory.createProduct("A");ProductA.info();Produc…

LeetCode 2924.找到冠军 II:脑筋急转弯——只关心入度

【LetMeFly】2924.找到冠军 II:脑筋急转弯——只关心入度 力扣题目链接:https://leetcode.cn/problems/find-champion-ii/ 一场比赛中共有 n 支队伍,按从 0 到 n - 1 编号。每支队伍也是 有向无环图(DAG) 上的一个节…

Docker Image (镜像) 常见命令

Docker Image (镜像) 常用命令 docker images 功能:列出本地所有的镜像。如果镜像 ID 相同,但是 Tag 标签不同,也会被当作不同的条目被列出来。 语法: docker images [options] [REPOSITORY[:TAG]] 别名: docker ima…

使用Pandas实现股票交易数据可视化

一、折线图:展现股价走势 1.1、简单版-股价走势图 # 简洁版import pandas as pdimport matplotlib.pyplot as plt# 读取CSV文件df pd.read_csv(../数据集/格力电器.csv)data df[[high, close]].plot()plt.show() 首先通过df[[high,close]]从df中获取最高价和收盘…

本地PC安装eNSP Pro完成简单的WLAN实验

前言 上个月底华为更新一版eNSP Pro,新增了AC、AP、STA等设备,也就是说可以在eNSP中进行WLAN相关的实验了。之前写过一篇文章《将eNSP Pro部署在华为云是什么体验》介绍了怎么在华为云上部署eNSP Pro,这次使用本地PC机在虚拟机中安装eNSP Pr…

配置交换机端口安全

1、实验目的 通过本实验可以掌握: 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…

excel中能不能用substitute函数把文本中某个字符起始的数据全部替换?

希望将A2单元格中,以光交开始的字符全部替换,本以为可以用公式SUBSTITUTE(A2,"光交",""),好像*不起作用。 很可惜的是,不仅SUBSTITUTE函数不支持通配符,像LEFT、RIGHT、MID、REPLACE函数都不支持通…

2024年大唐杯官网模拟题

单选(出题角度很奇怪,不用太纠结) 5G NR系统中,基于SSB的NR同频测量在measconfig里最多可以配置( )个SMTC窗口。 A、3 B、4 C、1 D、2 答案:D 2个 5G 中从BBU到AAU需要保证( )Gbps…

DHCP服务器的高可靠、高可用+负载均衡配置

一、适用场景 1、DHCP地址池集中化的管理环境中(本例建立了200个C类网24位的地址池); 2、全网仅1台合法的DHCP服务器(要是它宕机全部断网,本例旨在提高服务器的可靠性、可用性,双DHCP服务器性能上负载均衡…

FastAPI - uvicorn设置 logger 日志格式

怎么将日志打印到文件 在main.py加入log_config“./uvicorn_config.json” import uvicornif __name__ "__main__":uvicorn.run("app:app", host"0.0.0.0", port8000, log_config"./uvicorn_config.json")uvicorn_config.json {&qu…

zookeeper和kafka消息队列

zookeeper zookeeper介绍 Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目 zookeeper特点 zookeeper是由一个领导者(leader),多个跟随者(follower)组成的集群 Zookeepe集群中只要有半数以上节点存活,Zookeeper集群…

数字乡村探索:引领农村未来发展新方向——科技创新赋能乡村现代化与农民生活品质提升之旅

目录 一、数字乡村的内涵与特点 二、数字乡村的探索进展 三、数字乡村面临的挑战与机遇 四、数字乡村的未来发展方向与路径 五、数字乡村助力农村产业升级 六、数字乡村促进城乡融合发展 七、数字乡村激发农民创新创业活力 八、数字乡村提升农民获得感和幸福感 九、展…

遥感卫星:探索地球的科技之旅

遥感卫星是人类探索地球、理解地球、保护地球的重要工具,其发展历程承载了人类对地球的探索与认知的历程。从最初的概念到如今的高科技应用,遥感卫星技术的发展见证了人类科技的不断进步与创新。 初心萌芽: 遥感卫星的发展始于20世纪中叶&…

Eureka-搭建Eureka步骤

简介: Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实…