【Godot4.2】太极八卦图绘制

概述

作为中国传统文化符号之一,太极八卦图,无论是哲学还是玄学,都不可能避开。

之前在ShapePoints函数库实现了太极的点求取函数。当时采用的时圆弧拼接的方式,但是存在某些尺寸下多边形无法三角化的问题。

于是就有了今天的内容。就是采取一种完全不同的思路来绘制太极。并在此基础上补足八卦的绘制。

太极图绘制的另一种思路

采用圆以及半圆逐层盖印的方式。可以避免原来的圆弧线无法三角化的问题。
在这里插入图片描述

基本上任何尺寸都不会有太大问题:

image.png

修改后的太极绘制函数:

# 太极 最后修改:202442102:31:57
static func draw_taiji(canvas:CanvasItem,         # 画布项position:Vector2,          # 位置r:float,c1:= Color.BLACK,c2:= Color.WHITE,
) -> void:var T:= Transform2D().translated(position)var pan =  T * ShapePoints.circle(r * 1.01 + 2)# 底部圆盘canvas.draw_colored_polygon(pan,c1)var r1 = ShapePoints.sector(r,90,270)  # 左半大圆弧var r2 = ShapePoints.sector(r/2.0,90,270)  # 左半小圆弧#print(right)canvas.draw_colored_polygon(T * r1,c2)canvas.draw_colored_polygon(T.translated(Vector2(0,r/2.0)) * r2,c1)canvas.draw_colored_polygon(Transform2D.FLIP_X.translated(position + Vector2(0,-r/2.0)) * r2,c2)var eye = ShapePoints.circle(r/10.0)canvas.draw_colored_polygon(T.translated(Vector2(0,r/2.0)) * eye,c2)canvas.draw_colored_polygon(T.translated(Vector2(0,-r/2.0)) * eye,c1)

八卦绘制

基础思路

  • 只需要在太极周围围绕一圈卦就行。
  • 其中阴阳爻,可以分别用01代替,用类似[1,1,0]代表巽卦
  • 用一个数组存储从-90°270°顺序的卦象。
  • 然后根据这个数据进行绘制和变换。

实现

首先是定义卦象常数:

const QIAN = Vector3(1,1,1) # 乾
const XUN  = Vector3(1,1,0) # 巽
const KAN  = Vector3(0,1,0) # 坎
const GEN  = Vector3(1,0,0) # 艮
const KUN  = Vector3(0,0,0) # 坤
const ZHEN = Vector3(0,0,1) # 震
const LI   = Vector3(1,0,1) # 离
const DUI  = Vector3(0,1,1) # 兑

然后是卦象形状求取函数:

# 返回单独的卦的图形(多个矩形集合)
static func gua_shape(gua:Vector3,size:Vector2,         # 卦的矩形尺寸
) -> Array[PackedVector2Array]:var shape:Array[PackedVector2Array] = []var rect = ShapePoints.rect(size)  # 整个卦的矩形# 一爻占1/5高度,阴爻中间有1/5间隔var w = size.x      # 爻的宽度var h = size.y/5.0  # 爻的高度var pos1 = Vector2(0 * w,2 * h)  # 上爻位置var yang = ShapePoints.rect(Vector2(w,h))             # 阳爻var yin_harf =  ShapePoints.rect(Vector2(w * 2/5,h))  # 阴爻的一半var yin = [Transform2D().translated(Vector2(-w * 0.3,0)) * yin_harf,Transform2D().translated(Vector2(w * 0.3,0)) * yin_harf]for i in range(3):var move := Transform2D().translated(pos1 - 2 * i * Vector2(0,h))if gua[i] == 0:shape.append_array([move * yin[0],move * yin[1]])else:shape.append(move * yang)return shape

这里采用的是在一个限定尺寸的矩形中通过位移来实现上中下三爻的定位。

  • 因为ShapePointsrect()函数已经变成了从单位圆与变换求得的形式,所以ShapePoints.rect(size),就是整个卦象图形所在的矩形。
  • 我将整个矩形划分为了5×5的网格,则上中下爻的高度和间隔都是1/5的矩形高度,阴爻的两个矩形宽度是2/5的矩形宽度,中间间隔为1/5的矩形宽度

image.png

  • 通过变换获取卦象在以原点为中心的图形集合后,就可以便利然后绘制。

最后是完整八卦绘制函数:

# 太极 最后修改:202442113:03:25
static func draw_bagua(canvas:CanvasItem,         # 画布项position:Vector2,          # 位置size:Vector2,              # 卦的矩形尺寸r:float,color:= Color.BLACK,bagua = [QIAN,XUN,KAN,GEN,KUN,ZHEN,LI,DUI]
) -> void:var ang = 360.0/8.0 # 间隔角度for i in range(bagua.size()):var t:= Transform2D().translated(Vector2(0,r)).rotated(deg_to_rad(ang * i -180))var shape = gua_shape(bagua[i],size)  for sp in shape:canvas.draw_colored_polygon(Transform2D().translated(position) * t * sp,color)

八卦绘制,就是顺着一个圆的位置,顺序排布和旋转相应的卦象。

extends Node2Dvar pos = Vector2(200,200)func _draw() -> void:draw_set_transform(pos)# 绘制太极myCanvas.draw_taiji(self,pos,100)# 绘制八卦myCanvas.draw_bagua(self,pos,Vector2(40,40),140)

结合太极绘制函数,便可以绘制完整的太极八卦图了:

image.png

而且由于卦、八卦和太极三者对应三个函数,所以都可以分开来单独绘制。

总结

  • 本节介绍了对复杂图形——太极八卦图的求图形顶点和绘制思路
  • 可以看到,灵活的利用绘图顺序,进行“盖印”操作,是一种聪明的图形绘制方式
  • 另外,也可以看到,有些复杂图形的求解需要使用多重线性变换。将原始的图形限定在一个中心点在原点的矩形或圆范围内,你将可以更好的创建由多个图形组成的复杂图形。再在此图形基础上进行其他变换获取更复杂图形。本文的八卦部分就是如此。

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

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

相关文章

Windows使用freeSSHd搭建sftp服务器

一、安装 1、运行freeSSHd.exe(最好以管理员方式运行) 2、选择安装位置 3、选择全部安装 4、是否创建开始启动栏快捷入口 5、是否创建桌面快捷方式 6、安装 7、安装完成,点击close 8、安装私钥 9、是否要安装为服务 10、全部安装完成 二、配…

不同条件累加(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;float result1 0;float result2 0;float result…

3、MATLAB中矩阵和多维矩阵介绍

文章目录 一、矩阵二、矩阵举例三、定义变量四、定义矩阵五、获取变量值 一、矩阵 MATLAB中数据的基本格式是矩阵&#xff1b; 二维矩阵是一个带有以行和列排列的元素的矩阵表&#xff1b;如果右m行、n列&#xff0c;这个矩阵的大小就是m x n&#xff1b;多维矩阵的维数大于2…

加速产能!推荐五款制造业项目管理软件

随着技术的不断发展&#xff0c;许多制造企业开始意识到使用制造业项目管理软件的重要性。在本文中&#xff0c;我们将探讨适用于制造业的项目管理软件&#xff0c;制造业项目管理软件推荐&#xff0c;以帮助项目团队更加高效管理资源。 制造业项目管理难题 怎样正确利用工作资…

JAVA学习笔记28(常用类)

1.常用类 1.1 包装类 1.包装类的分类 ​ 1.针对八中基本数据类型相应的引用类型–包装类 ​ 2.有了类的特点&#xff0c;就可以调用类中的方法 2.包装类和基本数据类型的转换 ​ *装箱&#xff1a;基本类型 --> 包装类型 //手动装箱 int n1 100; Integer integer ne…

如何在3dMax中快速打包mzp 文件?

如何在3dMax中创建mzp 文件&#xff1f; 我喜欢将我的Maxscript脚本发布为mzp文件。这是一个为3dMax构建的自解压zip文件。在mzp文件中&#xff0c;您可以捆绑Maxscript脚本文件、图片、预设或其他文件&#xff0c;并链接安装时执行的特殊操作。 在3dMax中使用大型脚本时&…

数据结构练习-数据结构概述

----------------------------------------------------------------------------------------------------------------------------- 1. 在数据结构中&#xff0c;从逻辑上可以把数据结构分成( )。 A. 动态结构和静态结构 B. 紧凑结构和非紧凑结构 C. 线性结…

【C++】双指针算法:盛最多水的容器

1.题目 2.算法思路 有两种方法&#xff1a; 第一种&#xff1a; 暴力穷举法&#xff0c;就是用两次循环将所有的可能性算出来&#xff0c;然后求出最大值。 这种方法最容易想到&#xff0c;但时间复杂度是O(n^2)&#xff0c;一定会超时的&#xff01; 第二种&#xff1a; …

【已解决简单好用】notepad++怎么设置中文

打开Notepad软件。点击软件界面顶部菜单栏中的“Settings”选项。在下拉菜单中选择“Preferences”进行语言设置。在打开的设置窗口中&#xff0c;找到“General”选项。在“General”选项中&#xff0c;找到“Localization”&#xff08;界面语言&#xff09;项。在下拉菜单中…

【001_IoT/物联网通信协议基础: HTTP、Websocket、MQTT、AMQP、COAP、LWM2M一文搞懂】

001_IoT/物联网通信协议基础: HTTP、Websocket、MQTT、AMQP、COAP、LWM2M一文搞懂 文章目录 001_IoT/物联网通信协议基础: HTTP、Websocket、MQTT、AMQP、COAP、LWM2M一文搞懂创作背景通信模型ISO/OSI七层模型 和 TCP/IP四层模型网络通信数据包格式&#xff08;Ethernet II&…

html2Canvas截图包含滚动条解决思路

概况描述 在项目中使用html2Canvas进行截图时发现无法截取滚动条部分,前端是使用vue2的版本,网上找了很多方式都没效果,冷静思考后,给出解决办法。 解决思路 当我们截取的div容器的宽和高与内部的子容器div的宽和高不一样时,内部div就会出现滚动条,因为我们截取的div与…

【公司UI自动化学习】

公司课程链接&#xff1a;https://l.jd.com/student/project/project.du?project_id697509403 公司的课程&#xff0c;是给一个学习方向。 一、 PC自动化 1&#xff09;什么项目适合 2&#xff09;PC自动化介入时间点 3&#xff09;自动化率&#xff1a; 频繁改动的&…