9 圆结构

圆的特征有圆心,没有问题。圆结构用2个长度相等、互相垂直的矢量代替变径,我有些看不明白有什么特殊意义。很像椭圆的定义方式。源码如下:

use approx::AbsDiffEq;use crate::{Aabb, Point, Scalar, Transform, Vector};/// n维圆
///
/// 圆的维度由常量泛型“D”参数定义。
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct Circle<const D: usize> {center: Point<D>,a: Vector<D>,b: Vector<D>,
}impl<const D: usize> Circle<D> {
///构建一个圆 
/// 
///#恐慌 
/// 
///如果不符合以下任何要求,则会出现恐慌: 
/// 
///-圆半径(由“a”和“b”的长度定义)不得为零。 
///-“a”和“b”的长度必须相等。 
///-“a”和“b”必须相互垂直。pub fn new(center: impl Into<Point<D>>,a: impl Into<Vector<D>>,b: impl Into<Vector<D>>,) -> Self {let center = center.into();let a = a.into();let b = b.into();assert_eq!(a.magnitude(),b.magnitude(),"`a` and `b` must be of equal length");assert_ne!(a.magnitude(),Scalar::ZERO,"circle radius must not be zero");// Requiring the vector to be *precisely* perpendicular is not// practical, because of numerical inaccuracy. This epsilon value seems// seems to work for now, but maybe it needs to become configurable.assert!(a.dot(&b) < Scalar::default_epsilon(),"`a` and `b` must be perpendicular to each other");Self { center, a, b }}/// Construct a `Circle` from a center point and a radiuspub fn from_center_and_radius(center: impl Into<Point<D>>,radius: impl Into<Scalar>,) -> Self {let radius = radius.into();let mut a = [Scalar::ZERO; D];let mut b = [Scalar::ZERO; D];a[0] = radius;b[1] = radius;Self::new(center, a, b)}/// Access the center point of the circlepub fn center(&self) -> Point<D> {self.center}/// Access the radius of the circlepub fn radius(&self) -> Scalar {self.a().magnitude()}/// Access the vector that defines the starting point of the circle////// The point where this vector points from the circle center, is the zero/// coordinate of the circle's coordinate system. The length of the vector/// defines the circle's radius.////// Please also refer to [`Self::b`].pub fn a(&self) -> Vector<D> {self.a}/// Access the vector that defines the plane of the circle////// Also defines the direction of the circle's coordinate system. The length/// is equal to the circle's radius, and this vector is perpendicular to/// [`Self::a`].pub fn b(&self) -> Vector<D> {self.b}/// Create a new instance that is reversed#[must_use]pub fn reverse(mut self) -> Self {self.b = -self.b;self}/// Convert a `D`-dimensional point to circle coordinates////// Converts the provided point into circle coordinates between `0.`/// (inclusive) and `PI * 2.` (exclusive).////// Projects the point onto the circle before computing circle coordinate,/// ignoring the radius. This is done to make this method robust against/// floating point accuracy issues.////// Callers are advised to be careful about the points they pass, as the/// point not being on the curve, intentional or not, will not result in an/// error.pub fn point_to_circle_coords(&self,point: impl Into<Point<D>>,) -> Point<1> {let vector = (point.into() - self.center).to_uv();let atan = Scalar::atan2(vector.v, vector.u);let coord = if atan >= Scalar::ZERO {atan} else {atan + Scalar::TAU};Point::from([coord])}/// Convert a point in circle coordinates into a `D`-dimensional pointpub fn point_from_circle_coords(&self,point: impl Into<Point<1>>,) -> Point<D> {self.center + self.vector_from_circle_coords(point.into().coords)}/// Convert a vector in circle coordinates into a `D`-dimensional pointpub fn vector_from_circle_coords(&self,vector: impl Into<Vector<1>>,) -> Vector<D> {let angle = vector.into().t;let (sin, cos) = angle.sin_cos();self.a * cos + self.b * sin}/// Calculate an AABB for the circlepub fn aabb(&self) -> Aabb<D> {let center_to_min_max = Vector::from_component(self.radius());Aabb {min: self.center() - center_to_min_max,max: self.center() + center_to_min_max,}}
}impl Circle<3> {/// # Transform the circlepub fn transform(&self, transform: &Transform) -> Self {Circle::new(transform.transform_point(&self.center()),transform.transform_vector(&self.a()),transform.transform_vector(&self.b()),)}
}#[cfg(test)]
mod tests {use std::f64::consts::{FRAC_PI_2, PI};use crate::{Circle, Point, Vector};#[test]fn point_to_circle_coords() {let circle = Circle {center: Point::from([1., 2., 3.]),a: Vector::from([1., 0., 0.]),b: Vector::from([0., 1., 0.]),};assert_eq!(circle.point_to_circle_coords([2., 2., 3.]),Point::from([0.]),);assert_eq!(circle.point_to_circle_coords([1., 3., 3.]),Point::from([FRAC_PI_2]),);assert_eq!(circle.point_to_circle_coords([0., 2., 3.]),Point::from([PI]),);assert_eq!(circle.point_to_circle_coords([1., 1., 3.]),Point::from([FRAC_PI_2 * 3.]),);}
}

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

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

相关文章

跨平台WPF框架Avalonia教程 十三

AutoCompleteBox 自动补全输入框 自动补全输入框提供了一个供用户输入的文本框和一个包含可能匹配项的下拉列表。下拉列表会在用户开始输入时显示&#xff0c;并且每输入一个字符&#xff0c;匹配项都会更新。用户可以从下拉列表中选择匹配项。 文本与可能项匹配的方式是可配…

开发中使用UML的流程_02 CIM-1:定义业务流程

CIM-1定义业务流程&#xff08;业务用例模型&#xff09;的生成&#xff0c;有下列两项&#xff1a; 1.业务用例图 2.业务用例简述 业务用例图的主要组成元素是业务用例和业务执行者。 图中的一个业务用例代表一条业务流程&#xff0c;业务执行者则代表位于业务组织外但会启动…

Streamlit + AI大模型API实现视频字幕提取

简介 在本文中&#xff0c;我将带你探讨如何使用Streamlit和AI大模型API来实现视频字幕提取的技术。Streamlit是一个开源的Python库&#xff0c;用于快速构建数据应用的Web界面&#xff0c;而AI大模型API&#xff0c;如OpenAI&#xff0c;提供了强大的语言处理能力&#xff0c…

c++--------《set 和 map》

c--------《set 和 map》 1 set系列的使⽤1.1 set类的介绍1.2 set的构造和迭代器1.3 set重要接口 2 实现样例2.1: insert和迭代器遍历使⽤样例&#xff1a;2.2: find和erase使⽤样例&#xff1a; 练习3.map系列的使用3.1 map类的介绍3.1.1 pair类型介绍 3.2 map的数据修改3.3mu…

计算机网络——路由选择算法

路由算法 路由的计算都是以子网为单位计算的——找到从原子网到目标子网的路径 链路状态算法 序号——&#xff08;源路由器&#xff0c;序号&#xff09;——如果发现这个序号重复或者老了——就不扩散 先测量——再泛洪获得路由 路由转发情况 若S——>W是21则不更改——…

同三维T80004EHU 高清HDMI/USB编码器

同三维T80004EHU 高清HDMI/USB编码器 1路HDMI或1路USB输入&#xff0c;带1路3.5音频输入&#xff0c;高清1080P60 同三维T80004EHU 高清HDMI/USB编码器 产品简介&#xff1a; 同三维T80004EHU高清HDMI/USB编码器是一款1路HDMI或1路USB高清编码器。可将 HDMI 或USB视频源编码…

RGB与YCbCr转换算法

目录 RGB与YCbCr转换算法RGB与YCbCr色域介绍RGB模型YCbCr色域简介YCbCr的应用YUV 和 YCbCr 的区别 色彩转换公式 RGB 转 YCbCr 实现RGB 转 YCbCr 的 Matlab 实现RGB 转 YCbCr 的 FPGA 实现 YCbCr 转 RGB 实现YCbCr 转 RGB 的 Matlab 实现YCbCr 转 RGB 的 FPGA 实现 RGB与YCbCr转…

子串【Lecode_HOT100】

1.和为K的子数组No.560 前缀和枚举 public int subarraySum(int[] nums, int k) {int count 0;//满足条件的个数//计算前缀和int[] preSum new int[nums.length1];for(int i 1 ; i<preSum.length;i){preSum[i]preSum[i-1]nums[i-1];}//查找满足kfor(int l 0;l<preSum…

13.C++内存管理2(C++ new和delete的使用和原理详解,内存泄漏问题)

⭐本篇重点&#xff1a;new, delete的使用和原理 ⭐本篇代码&#xff1a;c学习/04.c-动态内存管理 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. new和delete的使用 1.1 操作内置类型 1.2 操作自定义类型 二. new, delete与malloc, free的区别 2.1…

vue中动态渲染静态图片资源

不报错且f12查看元素的时候&#xff0c;显示的src说明已经渲染到html的src上&#xff0c;但是就是不显示在页面上 原因 在vue上&#xff0c;动态渲染静态图片资源&#xff08;比如从assets文件夹加载的图片&#xff09;需要注意打包工具对静态资源的解析方式 由于vue2的脚手…

uniapp 相关的swiper的一些注意事项

先推荐一个一个对标pc端swiper的uniapp版本 zebra-swiper 缺点是自定义分页器不是很好处理 不知道怎么弄 优点:可以进行高度自适应 &#xff08;这个uniapp原生swiper没有 只能动态修改 采用js 或者只有几种固定高度时采用变量修改&#xff09; <swiperref"lifeMiddle…

豆瓣书摘 | 爬虫 | Python

获取豆瓣书摘&#xff0c;存入MongoDB中。 import logging import timeimport requests from bs4 import BeautifulSoup from pymongo import MongoClientheaders {accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,…

(Linux)搭建静态网站——基于http/https协议的静态网站

简单了解nginx配置文件 1.下载并开启nginx服务 下载 [rootlocalhost ~]# dnf install nginx -y开启 [rootlocalhost ~]# systemctl restart nginx 1.(1)搭建静态网站——基于http协议的静态网站 实验1&#xff1a;搭建一个web服务器&#xff0c;访问该服务器时显示“hello w…

含有非期望产出的EBM模型及其改进模型

含有非期望产出的EBM模型及其改进模型 今天推出的是含有非期望产出的EBM模型及其两种改进模型。 **参考文献&#xff1a;《基于数字经济要素组合的绿色全要素生产率提升研究中的模型》**杜娟&#xff0c;张子承&#xff0c;王熠 本文构建了考虑非期望产出的改进EBM&#xff…

VScode学习前端-01

小问题合集&#xff1a; vscode按&#xff01;有时候没反应&#xff0c;有时候出来&#xff0c;是因为------>必须在英文状态下输入&#xff01; 把鼠标放在函数、变量等上面&#xff0c;会自动弹出提示&#xff0c;但挡住视线&#xff0c;有点不习惯。 打开file->pre…

使用 .NET 创建新的 WPF 应用

本教程介绍如何使用 Visual Studio 创建新的 Windows Presentation Foundation &#xff08;WPF&#xff09; 应用。 使用 Visual Studio&#xff0c;可以向窗口添加控件以设计应用的 UI&#xff0c;并处理这些控件中的输入事件以与用户交互。 在本教程结束时&#xff0c;你有一…

自存 sql常见语句和实际应用

关于连表 查询两个表 SELECT * FROM study_article JOIN study_article_review 查询的就是两个表相乘&#xff0c;结果为两个表的笛卡尔积 相这样 这种并不是我们想要的结果 通常会添加一些查询条件 SELECT * FROM study_articleJOIN study_article_review ON study_art…

嵌入式linux中QT信号与槽基本操作与实现

大家好,今天主要给大家分享一下,如何使用linux系统上的QT进行界面开发与实现。 第一:QT的信号与槽基本简介 在操作QT的时候,可以使用里面的信号与槽。所谓信号就是一个对象发出的信号,槽就是当这个对象发出这个信号时,对应连接的槽就发被执行或者触发。 进行信号与槽的连…

机器学习—学习曲线

学习曲线是帮助理解学习算法如何工作的一种方法&#xff0c;作为它所拥有的经验的函数。 绘制一个符合二阶模型的学习曲线&#xff0c;多项式或二次函数&#xff0c;画出交叉验证错误Jcv&#xff0c;以及Jtrain训练错误&#xff0c;所以在这个曲线中&#xff0c;横轴将是Mtrai…

【SpringBoot】什么是Maven,以及如何配置国内源实现自动获取jar包

前言 &#x1f31f;&#x1f31f;本期讲解关于Maven的了解和如何进行国内源的配置~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f3…