【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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巽星石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值