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

概述

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

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

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

系列目录

  • 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):# 构造TextLinevar 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 Node2Dvar points:PackedVector2Arrayfunc _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 Node2Dvar points:PackedVector2Arrayfunc _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 Node2Dvar points:PackedVector2Arrayfunc _ready() -> void:var pos = Vector2(500,300)var right = Vector2.RIGHTvar step = 30var r1 = 200var r2 = 160for 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):# 构造TextLinevar 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 Node2Dvar points:PackedVector2Arrayvar pos = Vector2(500,300)
var right = Vector2.RIGHT
var step = 30
var r1 = 200
var r2 = 160func _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 Node2Dvar points:PackedVector2Arrayvar pos = Vector2(500,300)
var right = Vector2.RIGHT
var step = 12
var r1 = 200func _ready() -> void:for i in range(step):var ag = deg_to_rad(360.0/step)var p = pos + right.rotated(ag * i) * r1points.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/stepdraw_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.hqwc.cn/news/616398.html

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

相关文章

zookeeper和kafka消息队列

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

sql server2008触发器

sql server在Navicat工具不能插入数据 可以去写代码插入,代码连接sql server可以插入 或者使用sql server专门的工具 BEGINdeclare a int;declare s t_amount;select a baddebt_age_id,srate from aa_baddebt_age;INSERT INTO dade(id,name) VALUES(a,s) END

jenkins下载安装(mac)

下载官网 具体 直接命令安装 Sample commands: Install the latest LTS version: brew install jenkins-ltsStart the Jenkins service: brew services start jenkins-ltsRestart the Jenkins service: brew services restart jenkins-ltsUpdate the Jenkins version: brew u…

黏菌优化算法优化CNN-BiLSTM的时序预测

今天给大家分享黏菌优化算法优化CNN-BiLSTM的时序预测,主要从算法原理和代码实战展开。需要了解更多算法代码的,可以点击文章左下角的阅读全文,进行获取哦~需要了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦&#xff…

Django模型入门

Django模型入门 为了能够学会使用Django模型,本节通过构建一个实际的Django模型来帮助读者尽快入门。 3.2.1 定义模型 既然Django模型实现了ORM功能,那么它就是对数据库实例的描述和实现。下面,我们通过一个简单的实例进行讲解。 如果需…

苹果全力升级:用专注AI的M4芯片彻底改造Mac系列

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…

爱奇艺APP Android低端机性能优化

01 背景介绍 在智能手机市场上,高端机型经常备受瞩目,但低端机型亦占据了不可忽视的份额。众多厂商为满足低端市场的需求,不断推出低配系列手机。另外过去几年的中高端机型,随着系统硬件的快速迭代,现已经被归类为低端…

部署HDFS集群(完全分布式模式、hadoop用户控制集群、hadoop-3.3.4+安装包)

目录 前置 一、上传&解压 (一 )上传 (二)解压 二、修改配置文件 (一)配置workers文件 (二)配置hadoop-env.sh文件 (三)配置core-site.xml文件 &…

09-ARM开发板的HelloWorld

在ARM开发板上运行x86_64平台程序 前面在Ubuntu系统编译生成了X86_64平台的HelloWorld程序,通过NFS服务器,尝试在开发板上直接运行。 如图所示,程序无法正常运行,终端提示ARM开发板在执行x86架构(Intel或AMD&#xff…

人工智能|机器学习——基于机器学习的信用卡办卡意愿模型预测项目

一、背景介绍 在金融领域,了解客户的信用卡办卡意愿对于银行和金融机构至关重要。借助机器学习技术,我们可以根据客户的历史数据和行为模式预测其是否有办理信用卡的倾向。本项目通过Python中的机器学习库,构建了两个常用的分类模型&#xff…

ubuntu22下使用vscode调试redis7源码环境搭建

ubuntu22下使用vscode调试redis7源码环境搭建 ##vscode launch.json配置文件 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0&…