首页 > 其他分享 >6 圆弧结构

6 圆弧结构

时间:2024-11-19 22:14:35浏览次数:3  
标签:self Aabb AABB Self 圆弧 into aabb 结构

个人感觉,弧度开始角度与结束角度应该用角度结构封装。等阅读完成主要代码后修改。代码如下

use parry2d_f64::bounding_volume::BoundingVolume as _;
use parry3d_f64::bounding_volume::BoundingVolume as _;

use super::{Point, Vector};

/// 轴对齐的边界框 An axis-aligned bounding box (AABB)
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Hash, Ord, PartialOrd)]
#[repr(C)]
pub struct Aabb<const D: usize> {
    /// AABB的最小坐标
    pub min: Point<D>,

    /// AABB的最大坐标
    pub max: Point<D>,
}

impl<const D: usize> Aabb<D> {
    /// 确定AABB是否包含给定点
    pub fn contains(&self, point: impl Into<Point<D>>) -> bool {
        let point = point.into();

        let min = self
            .min
            .coords
            .components
            .into_iter()
            .zip(point.coords.components);
        for (min, p) in min {
            if min > p {
                return false;
            }
        }

        let max = self
            .max
            .coords
            .components
            .into_iter()
            .zip(point.coords.components);
        for (max, p) in max {
            if max < p {
                return false;
            }
        }

        true
    }
}

impl Aabb<2> {
    /// 从点列表构建二维AABB
    ///
    /// The resulting AABB will contain all the points.
    pub fn from_points(
        points: impl IntoIterator<Item = impl Into<Point<2>>>,
    ) -> Self {
        let points: Vec<_> = points
            .into_iter()
            .map(|point| point.into().to_na())
            .collect();
        parry2d_f64::bounding_volume::Aabb::from_points(&points).into()
    }

    ///从Parry AABB构建二维AABB
    pub fn from_parry(aabb: parry2d_f64::bounding_volume::Aabb) -> Self {
        Self {
            min: aabb.mins.into(),
            max: aabb.maxs.into(),
        }
    }

    ///将AABB转换为Parry AABB
    pub fn to_parry(self) -> parry2d_f64::bounding_volume::Aabb {
        parry2d_f64::bounding_volume::Aabb {
            mins: self.min.to_na(),
            maxs: self.max.to_na(),
        }
    }

    /// 将此AABB与另一个合并
    pub fn merged(&self, other: &Self) -> Self {
        self.to_parry().merged(&other.to_parry()).into()
    }
}

impl Aabb<3> {
    /// 根据点列表构建三维AABB
    ///
    /// The resulting AABB will contain all the points.
    pub fn from_points(
        points: impl IntoIterator<Item = impl Into<Point<3>>>,
    ) -> Self {
        let points: Vec<_> = points
            .into_iter()
            .map(|point| point.into().to_na())
            .collect();
        parry3d_f64::bounding_volume::Aabb::from_points(&points).into()
    }

    /// Construct a 3-dimensional AABB from a Parry AABB
    pub fn from_parry(aabb: parry3d_f64::bounding_volume::Aabb) -> Self {
        Self {
            min: aabb.mins.into(),
            max: aabb.maxs.into(),
        }
    }

    /// Convert the AABB to a Parry AABB
    pub fn to_parry(self) -> parry3d_f64::bounding_volume::Aabb {
        parry3d_f64::bounding_volume::Aabb {
            mins: self.min.to_na(),
            maxs: self.max.to_na(),
        }
    }

    /// Access the vertices of the AABB
    pub fn vertices(&self) -> [Point<3>; 8] {
        self.to_parry().vertices().map(Into::into)
    }

    /// Compute the center point of the AABB
    pub fn center(&self) -> Point<3> {
        self.to_parry().center().into()
    }

    /// Compute the size of the AABB
    pub fn size(&self) -> Vector<3> {
        self.to_parry().extents().into()
    }

    /// Compute an AABB that includes an additional point
    pub fn include_point(self, point: &Point<3>) -> Self {
        let mut aabb = self.to_parry();
        aabb.take_point(point.to_na());

        Self::from_parry(aabb)
    }

    /// Merge this AABB with another
    pub fn merged(&self, other: &Self) -> Self {
        self.to_parry().merged(&other.to_parry()).into()
    }
}

impl From<parry2d_f64::bounding_volume::Aabb> for Aabb<2> {
    fn from(aabb: parry2d_f64::bounding_volume::Aabb) -> Self {
        Self::from_parry(aabb)
    }
}

impl From<parry3d_f64::bounding_volume::Aabb> for Aabb<3> {
    fn from(aabb: parry3d_f64::bounding_volume::Aabb) -> Self {
        Self::from_parry(aabb)
    }
}

#[cfg(test)]
mod tests {
    use super::Aabb;

    #[test]
    fn contains() {
        let aabb = Aabb::<2>::from_points([[1., 1.], [3., 3.]]);

        assert!(aabb.contains([2., 2.]));

        assert!(!aabb.contains([0., 0.]));
        assert!(!aabb.contains([4., 0.]));
        assert!(!aabb.contains([4., 4.]));
        assert!(!aabb.contains([0., 4.]));

        assert!(!aabb.contains([2., 0.]));
        assert!(!aabb.contains([2., 4.]));
        assert!(!aabb.contains([0., 2.]));
        assert!(!aabb.contains([4., 2.]));
    }
}

标签:self,Aabb,AABB,Self,圆弧,into,aabb,结构
From: https://blog.csdn.net/weixin_43219667/article/details/143897083

相关文章

  • 2024/11/19日 日志 数据结构实验(2)---栈实现表达式求值、队列应用(蓝桥杯)
    栈实现表达式求值问题:https://pintia.cn/problem-sets/1858366427985383424/exam/problems/type/7?problemSetProblemId=1858366732315615232解答:点击查看代码#include<bits/stdc++.h>usingnamespacestd;//运算符优先级intprecedence(charop){switch(op){......
  • 2024/11/18日 日志 数据结构实验(1)---链表逆置、线性表A,B顺序存储合并、双向循环链表应
    链表逆置题目:https://pintia.cn/problem-sets/1855808612225744896/exam/problems/type/6?problemSetProblemId=1855808768018968576解答:点击查看代码structListNode*reverse(structListNode*head){structListNode*prev=NULL;structListNode*current=head;......
  • 数据结构之堆栈的操作实现(实验报告版)
    一、堆栈是什么(原理)    在数据结构中,堆栈(Stack)是一种特殊的线性表,它遵循后进先出(LIFO,LastInFirstOut)的原则。堆栈的基本操作主要包括压栈(Push)、弹栈(Pop)、查看栈顶元素(Peek或Top)、检查栈是否为空(IsEmpty)以及获取栈的大小(Size)。以下是一个简单的堆栈操作实现,使用......
  • WasomCodeX试用-工程文件结构
    官方的Gitee提供了Tutorial程序供下载学习。打开后,可以看到程序结构。在这个程序里,可以看到从main主程序到各个FC都写在一个文件里。同时,通过终端查看下文件目录结构。/wasomeide_workspace/tutorials/projects/ch05-1$tree-l.├──ams_pack.log├──build│├......
  • 【高贵的数据结构】学了python你一定要知道的知识之deque双端队列
    deque是Python的collections模块提供的一种双端队列数据结构,支持从队列的两端快速添加和删除元素,时间复杂度为(O(1))。与列表相比,它在高效的双端操作中有明显优势。1.导入dequefromcollectionsimportdeque2.初始化deque创建空队列dq=deque()print(......
  • JAVA WEB 实现文件夹上传(保留目录结构)分享
    需求:大文件上传,批量上传,断点续传,文件夹上传,大文件下载,批量下载,断点下载,文件夹下载文件夹:上传下载需要支持层级结构,采用非压缩方式文件大小:100G前端:vue2,vue3,vue-cli,jquery,html,webuploader后端:JSP,springbootweb服务:tomcat数据库:mysql,oracle,达梦,国产化数据库服务......
  • 数据结构java:插入排序
    插入排序插入排序基本思想:直接插入排序希尔排序(缩小增量排序)插入排序基本思想:直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序中,直到所有的记录插入完为止,得到一个新的有序序列。实际......
  • 4 向量结构
    vector.rs文件定义了一个向量类,用常量泛型实现了1维、2维、3维向量。源码如下:usestd::{fmt,ops};usecrate::Bivector;usesuper::{coordinates::{Uv,Xyz,T},Scalar,};///n维向量//////向量的维数由常量泛型“D”参数定义。#[derive(Clone,Copy......
  • 数据结构——小小二叉树第一幕(树的认知以及顺序结构二叉树(堆)的实现)超详细!!!!
    文章目录前言一、树1.1树的概念与结构1.2数相关术语1.3树的表示1.4树形结构的实际运用场景二、二叉树2.1概念与结构2.2特殊的二叉树2.2.1满二叉树2.2.2完全二叉树2.3二叉树存储结构2.3.1顺序结构2.3.2链式结构三、实现顺序结构二叉树3.1堆的概念与结构3.......
  • c语言的循环结构
    循环结构在生活中我们常常遇到需要重复处理的问题,我们在编程时解决需要重复处理的问题需要使用循环语句循环语句主要有3种:while()循环;do-while()循环和for()循环while()循环用法:while(循环条件){循环体;……}说明:当程序遇到while()循环的时候,首先会判断while()的......