当前位置: 首页 > article >正文

【Godot4.2】任意多边形或折线围绕任意点旋转

概述

在很多绘图软件中,都会有对于任意图形围绕给定的旋转中心旋转的基本操作。本节就基于Godot实现任意多边形(Polygon)折线(Polyline)绕任意旋转中心(在图形内或外都可以)进行旋转。

基本原理分析

其基本原理如下:
image.png
可以看到,多边形中任意一点的坐标,始终等于旋转中心Z点坐标加上由Z指向该点的向量。
所以对于一个多边形(Polygon)折线(Polyline),它们的顶点数据依次存储在PackedVector2Array中。对于整个**多边形(Polygon)折线(Polyline)**的旋转,其实就是对其各个顶点的旋转,也就是依次执行:原来的点 = 旋转中心 + (原来的点 - 旋转中心)旋转(θ)

测试

创建如下测试场景:
image.png
添加如下代码:

extends Control

var polygon:PackedVector2Array = [Vector2(200,-200),Vector2(200,-300),Vector2(10,-100)] # 多边形
var z_point:Vector2 = Vector2()          # 旋转中心


@export var polygon_border_color:Color = Color.WHITE
@export var polygon_fill_color:Color = Color.WHITE
@export var z_point_color:Color = Color.WHITE

@onready var h_slider = $HSlider

func _input(event):
	var window_rect:Rect2 = get_rect()             # 控件矩形
	var center:Vector2 = window_rect.get_center()  # 矩形中心
	# 右键点击修改旋转中心
	if event is InputEventMouseButton:
		if event.button_index == MOUSE_BUTTON_RIGHT:
			if event.is_pressed():
				z_point = event.position - center
				queue_redraw()


func _draw():
	var window_rect:Rect2 = get_rect()             # 控件矩形
	var center:Vector2 = window_rect.get_center()  # 矩形中心
	
	# 在控件中心绘制坐标轴
	draw_line(Vector2(center.x,0),Vector2(center.x,size.y),Color.WHITE,2)
	draw_line(Vector2(0,center.y),Vector2(size.x,center.y),Color.WHITE,2)
	
	var new_points:PackedVector2Array
	# 进行旋转
	for i in range(polygon.size()):
		var new_point:Vector2 = (polygon[i] - z_point).rotated(deg_to_rad(h_slider.value))
		new_points.append(new_point + center + z_point)
	# 绘制多边形
	draw_polygon(new_points,[polygon_fill_color])

	
	# 绘制旋转中心
	draw_circle(z_point + center,5,z_point_color)
	
func _on_h_slider_value_changed(value):
	queue_redraw()

运行后:

  • 右键点击屏幕任意位置,可以修改旋转中心
  • 拖动底部滑动条,可以让多边形围绕旋转中心,进行360°的旋转。

以下是设定不同旋转中心后旋转的效果:
默认坐标系原点为中心:
围绕任意旋转中心旋转1.gif
以一个多边形外部的点为旋转中心:
围绕任意旋转中心旋转2.gif
以一个多边形内部的点为旋转中心:
围绕任意旋转中心旋转3.gif


http://www.kler.cn/a/273033.html

相关文章:

  • Python基于TensorFlow实现双向循环神经网络GRU加注意力机制分类模型(BiGRU-Attention分类算法)项目实战
  • PowerCat反弹Shell
  • ONLYOFFICE 文档8.2更新评测:PDF 协作编辑、性能优化及更多新功能体验
  • 【测试工具】Fastbot 客户端稳定性测试
  • 提交linux kernel patch流程
  • 密码学知识点整理一:密码学概论
  • 【LAMMPS学习】二、LAMMPS安装(3)通过Conda/tarball/git安装LAMMPS
  • Git 仓库瘦身与 LFS 大文件存储
  • 面试 Java 并发编程八股文十问十答第十期
  • leetcode116填充每个节点的下一个右侧节点指针
  • 证书转换 .cer .pfx 证书转换成 .pem证书
  • mysql笔记:15. 事务和锁
  • IT系统可观测性
  • Java单例模式
  • 2024年发布jar到国外maven中央仓库最新教程
  • 后端工程师快速使用axios
  • C语言简单题(7)从主函数中输入10个等长字符串,用一个函数对他们排序,然后在主函数输出这10个已排好序的字符串
  • 旅游管理系统|基于SpringBoot+ Mysql+Java+Tomcat技术的旅游管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)
  • 数据的响应式:实现动态数据驱动的技巧
  • 弗洛伊德-华沙算法求任意两点之间的最短路径算法
  • 【配置虚拟机网络ping通开发板,以及网络转发工作环境】
  • 【嵌入式学习收徒,高薪offer等你来!!!】
  • Windows11安装Msql8.0版本详细安装步骤!
  • 在浏览器中使用websocket协议
  • 2313: 砸金蛋
  • 类与对象题目