【Godot4.3】三角形类

概述

在GDSCript中你想要表示一个平面三角形,只需要设定3个点的位置,也就是3个Vector2就行了,或者一个size()==3PackedVector2Array

但是想要进一步处理三角形,获得它的一些几何特征,比如:某个内角的角度值,角平分线、垂直平分线、中线、高线,还有对应的内接圆、外接圆圆心与半径等,就会变得比较困难。

本篇就讲述如何在Godot4.3中,用类来表示三角形,并获取它的几何特征。

类设计

  • Triangle类用于表示一个二维平面的三角形,可以获取内接圆、外接圆圆心与半径
  • Angle类用来表示一个角,可以获取角平分线、中线和高线
  • Segment类用来表示线段,比如三角形的边,可以获取垂直平分线

目前的设计只是一个初步实现,进一步可能会修改或添加一些方法。

三角形

# 三角形
class Triangle:var point_a:Vector2var point_b:Vector2var point_c:Vector2func _init(point_a:Vector2,point_b:Vector2,point_c:Vector2) -> void:self.point_a = point_aself.point_b = point_bself.point_c = point_c# 获取三角形的点集func get_points() -> PackedVector2Array:var points:PackedVector2Arraypoints.append_array([point_a,point_b,point_c,point_a])return points# 获取角Afunc get_angle_a() -> Angle:return Angle.new(point_a,point_b,point_c)# 获取角Bfunc get_angle_b() -> Angle:return Angle.new(point_b,point_a,point_c)# 获取角Cfunc get_angle_c() -> Angle:return Angle.new(point_c,point_a,point_b)# 重心 - 任意两条中线的交点func gravity_center():var s1 = get_angle_a().get_mid_line()var s2 = get_angle_b().get_mid_line()return Geometry2D.line_intersects_line(s1.start,s1.vec().normalized(),s2.start,s2.vec().normalized())# 垂心 - 任意两条垂线的交点func high_center():var s1 = get_angle_a().get_high_line()var s2 = get_angle_b().get_high_line()return Geometry2D.line_intersects_line(s1.start,s1.vec().normalized(),s2.start,s2.vec().normalized())# 外心 - 任意两条垂直平分线的交点func out_center():var s1 = get_angle_a().seg_ab().mid_vertical_line()var s2 = get_angle_a().seg_bc().mid_vertical_line()return Geometry2D.line_intersects_line(s1.start,s1.vec().normalized(),s2.start,s2.vec().normalized())# 外接圆半径 - 外心与三个顶点距离中最长的一个func out_radius():var c:Vector2 = out_center()# 外心与各顶点的距离var m:float = minf(c.distance_to(point_a),c.distance_to(point_b))m = minf(m,c.distance_to(point_c))return m# 内心(内接圆圆心) - 任意两条角平分线的交点func inner_center() :var s1 = get_angle_a().get_half_angle_line()var s2 = get_angle_b().get_half_angle_line()return Geometry2D.line_intersects_line(s1.start,s1.vec().normalized(),s2.start,s2.vec().normalized())# 内接圆半径 - 内心在三条角平分线上短的那段的长度中最短的一个func inner_radius():var c:Vector2 = inner_center()# 内心与各边的垂直相交点var p1:Vector2 = Geometry2D.get_closest_point_to_segment(c,point_a,point_b)var p2:Vector2 = Geometry2D.get_closest_point_to_segment(c,point_a,point_c)var p3:Vector2 = Geometry2D.get_closest_point_to_segment(c,point_b,point_c)var m:float = minf(c.distance_to(p1),c.distance_to(p2))m = minf(m,c.distance_to(p3))return m

# 内角
class Angle:# 点var point_a:Vector2var point_b:Vector2var point_c:Vector2# 永远以point_a作为角的顶点func _init(point_a:Vector2,point_b:Vector2,point_c:Vector2) -> void:self.point_a = point_aself.point_b = point_bself.point_c = point_c# 线段abfunc seg_ab() -> Segment:return Segment.new(point_a,point_b)# 线段abfunc seg_ac() -> Segment:return Segment.new(point_a,point_c)# 线段abfunc seg_bc() -> Segment:return Segment.new(point_b,point_c)# 获取夹角(弧度)func angle() -> float:return abs(seg_ab().vec().angle_to(seg_ac().vec()))# 获取角平分线func get_half_angle_line() -> Segment:var ang = seg_ab().vec().angle_to(seg_ac().vec())var len = maxf(seg_ab().vec().length(),seg_ac().vec().length()) # 取较长边长度var p = point_a + seg_ab().vec().normalized().rotated(ang/2.0) * lenvar p1 = Geometry2D.line_intersects_line(point_b,seg_bc().vec(),point_a,point_a.direction_to(p))return Segment.new(point_a,p1)# 获取中线func get_mid_line() -> Segment:return Segment.new(point_a,seg_bc().mid_point())# 获取高线func get_high_line() -> Segment:var p = Geometry2D.get_closest_point_to_segment_uncapped(point_a,point_b,point_c)return Segment.new(point_a,p)

线段

# 线段
class Segment:var start:Vector2var end:Vector2func _init(p1:Vector2,p2:Vector2) -> void:start = p1end = p2# 返回向量func vec() -> Vector2:return end - start# 获取点集func points() -> PackedVector2Array:var arr:PackedVector2Arrayarr.append_array([start,end])return arr# 获取中点func mid_point() -> Vector2:return start.lerp(end,0.5)# 垂直平分线func mid_vertical_line() -> Segment:var half_normal = vec().rotated(deg_to_rad(90))/2.0var p1 = mid_point() + half_normalvar p2 = mid_point() - half_normalreturn Segment.new(p1,p2)

测试

创建和绘制三角形

extends Node2Dvar t1:Triangle = Triangle.new(Vector2(100,100),Vector2(200,100),Vector2(150,200))func _process(delta: float) -> void:t1.point_c = get_global_mouse_position()queue_redraw()func _draw() -> void:draw_polyline(t1.get_points(),Color.WHITE,1)

中线和重心

func _draw() -> void:draw_polyline(t1.get_points(),Color.WHITE,1)# 三条中线var l1 = t1.get_angle_a().get_mid_line().points()var l2 = t1.get_angle_b().get_mid_line().points()var l3 = t1.get_angle_c().get_mid_line().points()draw_polyline(l1,Color.AQUAMARINE,1)draw_polyline(l2,Color.AQUAMARINE,1)draw_polyline(l3,Color.AQUAMARINE,1)# 重心draw_circle(t1.gravity_center(),3,Color.BROWN)

在这里插入图片描述

角平分线和内心

func _draw() -> void:draw_polyline(t1.get_points(),Color.WHITE,1)# 三条角平分线var l4 = t1.get_angle_a().get_half_angle_line().points()var l5 = t1.get_angle_b().get_half_angle_line().points()var l6 = t1.get_angle_c().get_half_angle_line().points()draw_polyline(l4,Color.AQUAMARINE,1)draw_polyline(l5,Color.AQUAMARINE,1)draw_polyline(l6,Color.AQUAMARINE,1)# 重心draw_circle(t1.inner_center(),3,Color.BROWN)draw_circle(t1.inner_center(),t1.inner_radius(),Color.YELLOW,false,1)

在这里插入图片描述

垂直平分线和外心

func _draw() -> void:draw_polyline(t1.get_points(),Color.WHITE,1)# 三条边的垂直平分线var l4 = t1.get_angle_a().seg_ab().mid_vertical_line().points()var l5 = t1.get_angle_a().seg_bc().mid_vertical_line().points()var l6 = t1.get_angle_a().seg_ac().mid_vertical_line().points()draw_polyline(l4,Color.AQUAMARINE,1)draw_polyline(l5,Color.AQUAMARINE,1)draw_polyline(l6,Color.AQUAMARINE,1)# 外心draw_circle(t1.out_center(),3,Color.BROWN)draw_circle(t1.out_center(),t1.out_radius(),Color.YELLOW,false,1)

在这里插入图片描述

高线和垂心

func _draw() -> void:draw_polyline(t1.get_points(),Color.WHITE,1)# 三条边的垂直平分线var l4 = t1.get_angle_a().get_high_line().points()var l5 = t1.get_angle_b().get_high_line().points()var l6 = t1.get_angle_c().get_high_line().points()draw_polyline(l4,Color.AQUAMARINE,1)draw_polyline(l5,Color.AQUAMARINE,1)draw_polyline(l6,Color.AQUAMARINE,1)# 垂心if t1.high_center():draw_circle(t1.high_center(),3,Color.BROWN)

在这里插入图片描述

总结

本文所述,是三角形几何特性获得的初步,API肯定会大改,只是作为初步试验成功的结果。

三角形是一种特殊的多边形,一些几何特性值得深入研究。

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

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

相关文章

HOJ网站开启https访问 申请免费SSL证书 部署证书详细操作指南

https://console.cloud.tencent.com/ 腾讯云用户 登录控制台 右上角搜SSL 点击 SSL证书 进入链接 点申请 免费证书 有效期3个月 (以后每三个月申请一次证书 上传) 如果是腾讯云申请的域名 选 自动DNS验证 自动添加验证记录 如果是其他平台申请域…

【WPF】03 动态生成控件

说明 今天记录一篇关于动态生成控件的方法,也是反复查了一些资料,逐步完善成自己需要的方法,感觉还是比较好用的。通过这个需求,在网上也找了一些资料,发现了一个开源图形UI组件HandyControl,觉得比较好&a…

【C++ 11多线程加速计算实操教程】

【C 11多线程加速计算实操教程】 1. 了解线程的基本概念2. 创建线程2.1 启动线程的基本示例:2.2 运行结果 3. 线程加速计算3.1 演示如何使用多个线程计算数组的和:3.2 运行结果3.3 结果分析3.4 拓展学习 4. 互斥量(Mutex)4.1 演示…

【GUI设计】基于图像边缘提取的GUI系统(5),matlab实现

博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于图像边缘提取的GUI系统(5),用matlab实现。 本…

HTML、CSS

初识web前端 web标准 Web标准也称为网页标准,由一系列的标准组成,大部分由W3C (World Wide Web Consortium,万维网联盟) 负责制定。三个组成部分: HTML: 负责网页的结构(页面元素和内容)。CSS: 负责网页的表现(页面元素的外观、位置等页面样…

荣耀手机AI搜索革新体验:一键总结归纳,让信息获取更高效

在信息爆炸的时代,我们每天都被海量的数据包围,如何快速、准确地获取所需信息成为了现代人的一大挑战。 近日,荣耀手机宣布其AI搜索功能正式上线,这一创新举措不仅为使用者带来了前所未有的便捷体验,更在智能手机领域…

博图软件项目创建

目录 一、新建项目 二、IP设置具体的版本号查看方法 ​三、电脑IP设置如下 一、新建项目 1、双击打开软件 2、创建新项目,路径可以自己选择,填写相关信息,点击创建 3、选择组态设备 4、选择对应的的设备型号,点击添加 5、密…

【刷题2—滑动窗口】最大连续1的个数lll、将x减到0的最小操作数

目录 一、最大连续1的个数lll二、将x减到0的最小操作数 一、最大连续1的个数lll 题目: 思路: 问题转换为:找到一个最长子数组,这个数组里面0的个数不能超过k个 定义一个变量count,来记录0的个数,进窗口、…

Minio上传url资源文件,文件内容不全的问题

遇到问题 使用minio-client时候上传文件为url链接时候&#xff0c;上传inputstream流出现了文件上传成功&#xff0c;但是文件内容缺失&#xff0c;无法正常打开&#xff01; 先看看基本的依赖和配置代码&#xff1a; pom.xml依赖 <!-- tika MIME检测机制 --><depen…

JVM(HotSpot):程序计数器(Program Counter Register)

文章目录 一、内存结构图二、案例解读三、工作流程四、特点 一、内存结构图 二、案例解读 我们使用javap对字节码进行反编译&#xff0c;来看下程序计数器怎么体现的。 IDEA写一个简单的Java代码 反编译命令 javap -verbose InitTest.class $ javap -verbose InitTest.clas…

【AIGC】ChatGPT RAG提取文档内容,高效制作PPT、论文

目录 一、理解 RAG 技术 二、利用 ChatGPT 的 RAG 技术提取文档内容 三、高效制作 PPT 四、高效撰写论文 五、最佳实践与建议 六、工具推荐 随着人工智能生成内容&#xff08;AIGC&#xff09;的快速发展&#xff0c;利用先进的技术工具如 ChatGPT 的 RAG&#xff08;Ret…

R包安装教程,如何安装rjags和infercnv

一.介绍 在数据分析过程中&#xff0c;R语言因其强大的统计分析能力和丰富的包生态系统&#xff0c;成为众多研究人员和数据科学家的首选工具。本文将详细介绍如何在R环境中安装两个重要的R包——rjags和infercnv。rjags用于与JAGS&#xff08;Just Another Gibbs Sampler&…

基于 Amazon Bedrock +lambda函数调用大模型构建你的智能网页助手

​ 文章目录 1. 前言2. 使用到的关键产品2.1 Amazon Bedrock2.2 Amazon lambda2.3 Amazon API Gateway 3. 注册亚马逊云科技账号4. 构建大模型API4.1 调用 Amazon Bedrock4.2 使用 Amazon lambda函数4.3 调Amazon API Gateway 5. 构建应用调用API6. 总结 1. 前言 传统的大模型…

LabVIEW界面输入值设为默认值

在LabVIEW中&#xff0c;将前面板上所有控件的当前输入值设为默认值&#xff0c;可以通过以下步骤实现&#xff1a; 使用控件属性节点&#xff1a;你可以创建一个属性节点来获取所有控件的引用。 右键点击控件&#xff0c;选择“创建” > “属性节点”。 设置属性节点为“D…

怎么用gitee做一个图片仓库,在md文档中用这个图片网络地址,然后显示图片

痛因&#xff1a;我为什么要这样做&#xff0c;呃&#xff0c;我一开始图片都是存本地地址的&#xff0c;放在和这个md文档同级的assets文件夹下面&#xff0c;这样子确实当时很方便&#xff0c;复制粘贴什么也不用管&#xff0c;但是想把这个文档分享给别的人的时候&#xff0…

【有啥问啥】多臂老虎机(Multi-Armed Bandit,MAB)算法详解

多臂老虎机&#xff08;Multi-Armed Bandit&#xff0c;MAB&#xff09;算法详解 1. 引言 多臂老虎机&#xff08;Multi-Armed Bandit&#xff0c;MAB&#xff09;问题源自概率论和决策论&#xff0c;是一个经典的决策优化问题。最早提出的形式是赌场中的老虎机问题&#xff…

在线秘密基地--性能测试

根据之前的测试报告中的测试用例使用jmeter进行性能测试&#xff08;在性能测试之前&#xff0c;应先进行功能测试&#xff09;。 测试报告----功能测试_功能测试报告-CSDN博客https://blog.csdn.net/m0_74876421/article/details/141307905一、使用jmeter进行功能测试 可查看…

HDFS分布式文件系统01-HDFS架构与SHELL操作

HDFS分布式文件系统 学习目标第一课时知识点1-文件系统的分类单机文件系统网络文件系统分布式文件系统 知识点2-HDFS架构知识点3-HDFS的特点知识点4-HDFS的文件读写流程知识点5-HDFS的健壮性 第二课时知识点1-HDFS的Shell介绍HDFS Shell的语法格式如下。HDFS Shell客户端命令中…

STM32 软件触发ADC采集

0.91寸OLED屏幕大小的音频频谱&#xff0c;炫酷&#xff01; STM32另一个很少人知道的的功能——时钟监测 晶振与软件的关系&#xff08;深度理解&#xff09; STM32单片机一种另类的IO初始化方法 ADC是一个十分重要的功能&#xff0c;几乎任何一款单片机都会包含这个功能&a…

信息安全工程师(13)网络攻击一般过程

前言 网络攻击的一般过程是一个复杂且系统化的行为&#xff0c;其目标往往在于未经授权地访问、破坏或窃取目标系统的信息。 一、侦查与信息收集阶段 开放源情报收集&#xff1a;攻击者首先会通过搜索引擎、社交媒体、论坛等公开渠道获取目标的基本信息&#xff0c;如姓名、地址…