当前位置: 首页 > news >正文

空间曲线的参数方程

空间曲线的参数方程

二维直线

经过一点 P ( x 0 , y 0 ) P(x_0,y_0) P(x0y0)的方向向量为 n ( c o s θ , s i n θ ) n(cos\theta,sin\theta) n(cosθsinθ)的直线参数方程为:
[ x y ] = [ x 0 y 0 ] + t [ c o s θ s i n θ ] t ∈ [ 0 , 2 π ) \begin{bmatrix} x\\ y \end{bmatrix} =\begin{bmatrix} x_0\\ y_0 \end{bmatrix} +t\begin{bmatrix} cos\theta\\ sin\theta \end{bmatrix} \hspace{2em} t\in [0,2\pi) [xy]=[x0y0]+t[cosθsinθ]t[02π)

三维直线

经过一点 P ( x 0 , y 0 , z 0 ) P(x_0,y_0,z_0) P(x0y0z0)的单位方向向量为 n ( i , j , k ) n(i,j,k) n(i,j,k)的直线参数方程为:
[ x y z ] = [ x 0 y 0 z 0 ] + t [ i j k ] t ∈ [ 0 , 2 π ) \begin{bmatrix} x\\ y\\ z \end{bmatrix} =\begin{bmatrix} x_0\\ y_0\\ z_0 \end{bmatrix} +t\begin{bmatrix} i\\ j\\ k \end{bmatrix} \hspace{2em} t\in [0,2\pi) xyz = x0y0z0 +t ijk t[02π)

二维圆

经过圆心 P ( x 0 , y 0 ) P(x_0,y_0) P(x0y0),半径为 r r r,的圆参数方程为:

[ x y ] = [ x 0 y 0 ] + r [ c o s θ s i n θ ] θ ∈ [ 0 , 2 π ) \begin{bmatrix} x\\ y \end{bmatrix} =\begin{bmatrix} x_0\\ y_0 \end{bmatrix} +r\begin{bmatrix} cos\theta\\ sin\theta \end{bmatrix} \hspace{2em} \theta\in [0,2\pi) [xy]=[x0y0]+r[cosθsinθ]θ[02π)

三维圆

经过圆心 P ( x 0 , y 0 , z 0 ) P(x_0,y_0,z_0) P(x0y0z0),半径为 r r r,且该圆所在的平面正交的两个单位向量 e 1 ⃗ ( a x , a y , a z ) , e 2 ⃗ ( b x , b y , b z ) \vec{e_1}(a_x,a_y,a_z),\vec{e_2}(b_x,b_y,b_z) e1 (ax,ay,az),e2 (bx,by,bz)的圆参数方程为:

[ x y z ] = [ x 0 y 0 z 0 ] + r c o s θ [ a x a y a z ] + r s i n θ [ b x b y b z ] θ ∈ [ 0 , 2 π ) \begin{bmatrix} x\\ y\\ z \end{bmatrix}= \begin{bmatrix} x_0\\ y_0\\ z_0 \end{bmatrix} +rcos\theta\begin{bmatrix} a_x\\ a_y\\ a_z \end{bmatrix} +rsin\theta\begin{bmatrix} b_x\\ b_y\\ b_z \end{bmatrix} \hspace{2em} \theta\in [0,2\pi) xyz = x0y0z0 +rcosθ axayaz +rsinθ bxbybz θ[02π)

特殊情况下,当 e 1 ⃗ ( a x , a y , a z ) , e 2 ⃗ ( b x , b y , b z ) \vec{e_1}(a_x,a_y,a_z),\vec{e_2}(b_x,b_y,b_z) e1 (ax,ay,az),e2 (bx,by,bz)分别为 e 1 ⃗ ( 1 , 0 , 0 ) , e 2 ⃗ ( 0 , 1 , 0 ) \vec{e_1}(1,0,0),\vec{e_2}(0,1,0) e1 (1,0,0),e2 (0,1,0)时,公式(4) 简化为:

[ x y z ] = [ x 0 y 0 z 0 ] + r [ c o s θ s i n θ 0 ] θ ∈ [ 0 , 2 π ) \begin{bmatrix} x\\ y\\ z \end{bmatrix} =\begin{bmatrix} x_0\\ y_0\\ z_0 \end{bmatrix} +r\begin{bmatrix} cos \theta \\ sin \theta \\ 0 \end{bmatrix} \hspace{2em} \theta \in [0,2 \pi) xyz = x0y0z0 +r cosθsinθ0 θ[02π)

任意平面内的圆,可以先计算基准坐标系中的圆然后通过坐标变换 ,将问题转化为,转换为所求平面内的圆。

图形化表示:

请添加图片描述

请添加图片描述

如何快速求解 e 1 ⃗ ( a x , a y , a z ) , e 2 ⃗ ( b x , b y , b z ) \vec{e_1}(a_x,a_y,a_z),\vec{e_2}(b_x,b_y,b_z) e1 (ax,ay,az),e2 (bx,by,bz)

  1. 求解 e 1 ⃗ \vec{e_1} e1 ,将圆所在平面的法向量与坐标向量 i ⃗ \vec{i} i 叉乘,然后单位化即可得到,如果叉乘结果为0 ,就叉乘 j ⃗ \vec{j} j ,再者就叉乘 k ⃗ \vec{k} k
  2. 求解 e 2 ⃗ \vec{e_2} e2 ,就将法向量与 e 1 ⃗ \vec{e_1} e1 叉乘即可。

对应的python代码:

\sum_{s}^{}  {\textstyle \sum_{}^{}} # 对应的版本matplotlib                3.7.1           py311h06a4308_1
from matplotlib import pyplot as plt
import numpy as npnormal_direction = np.array([1, 1, 1])
radius = 1
center = np.array([1, 1, 1])
pi = 3.1415926
theta = np.array([])for i in range(100):theta = np.append(theta, 2.0 * pi * i / 100)theta = np.array(theta)
e1 = np.cross(normal_direction, [0, 1, 0])
if np.linalg.norm(e1) < 1e-10:e1 = np.cross(normal_direction, [0, 1, 0])e2 = np.cross(normal_direction, e1)# 单位化
e1_norm = e1 / np.linalg.norm(e1)
e2_norm = e2 / np.linalg.norm(e2)
size = np.size(theta)x0 = center[0] * np.ones(size)
y0 = center[1] * np.ones(size)
z0 = center[2] * np.ones(size)x = x0 + radius * e1[0] * np.cos(theta) + radius * e2[0] * np.sin(theta)
y = y0 + radius * e1[1] * np.cos(theta) + radius * e2[1] * np.sin(theta)
z = z0 + radius * e1[2] * np.cos(theta) + radius * e2[2] * np.sin(theta)# 建立画布
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.set_xlim(-2, 6)
ax.set_ylim(-2, 6)
ax.set_zlim(-2, 6)ax.plot3D(x, y, z, 'r')
plt.show()print("YES PF!")

请添加图片描述

对应的MATLAB代码

Figure_1normal=[1 1 1]; %法向量n
radius=1; %圆的半径为1
center=[1 1 1]; %圆心的坐标
theta=(0:2*pi/100:2*pi)'; %theta角从0到2*pie1=cross(normal,[1 0 0]); %n与i叉乘,求取a向量
if ~any(e1) %如果a为零向量,将n与j叉乘e1=cross(normal,[0 1 0]);
ende2=cross(normal,e1); %求取b向量
e1=e1/norm(e1); %单位化a向量
e2=e2/norm(e2); %单位化b向量x0=center(1)*ones(size(theta,1),1);
y0=center(2)*ones(size(theta,1),1);
z0=center(3)*ones(size(theta,1),1);x=x0+radius*e1(1)*cos(theta)+radius*e2(1)*sin(theta);%圆上各点的x坐标
y=y0+radius*e1(2)*cos(theta)+radius*e2(2)*sin(theta);%圆上各点的y坐标
z=z0+radius*e1(3)*cos(theta)+radius*e2(3)*sin(theta);%圆上各点的z坐标plot3(x,y,z)
xlabel('x轴')
ylabel('y轴')
zlabel('z轴')

三维椭圆

在实际工程化的应用的时候,往往不是圆,而是退化成椭圆,甚至退化成一条直线。

工程中更多是使用椭圆模型,通过检测到的点来确定椭圆的参数,最后确定椭圆的中心点和方向向量。

三维椭圆的参数方程易知:
[ x y z ] = [ x 0 y 0 z 0 ] + a c o s θ [ a x a y a z ] + b s i n θ [ b x b y b z ] θ ∈ [ 0 , 2 π ) \begin{bmatrix} x\\ y\\ z \end{bmatrix} =\begin{bmatrix} x_0\\ y_0\\ z_0 \end{bmatrix} +acos\theta\begin{bmatrix} a_x\\ a_y\\ a_z \end{bmatrix} + bsin\theta\begin{bmatrix} b_x\\ b_y\\ b_z \end{bmatrix} \hspace{2em} \theta\in [0,2\pi) xyz = x0y0z0 +acosθ axayaz +bsinθ bxbybz θ[02π)
其中 a , b a,b ab分别表示为椭圆的长半轴长度,短半轴长度 。其余跟圆类似不作具体说明。

椭圆一般化方程为:
c 1 x 2 + c 2 x y + c 3 y 2 + c 4 x + c 5 y + c 6 = 0 c_1x^2+c_2xy+c_3y^2+c_4x+c_5y+c_6 = 0 c1x2+c2xy+c3y2+c4x+c5y+c6=0
可以看到至少使用五个不同点可以确定这六个参数。

一般情况是点的个数远超过5个,处理步骤为:

  1. 首先使用RANSAC筛选异常点

  2. 构建误差 d i = c 1 x 2 + c 2 x y + c 3 y 2 + c 4 x + c 5 y + c 6 d_i = c_1x^2+c_2xy+c_3y^2+c_4x+c_5y+c_6 di=c1x2+c2xy+c3y2+c4x+c5y+c6

  3. 构建代价函数,使用最小二乘求解// 或者SVD分解
    c i = a r g m i n Σ d j 2 s , t { ∑ i = 1 6 c i 2 = 1 i ∈ [ 1 , 6 ] , j ∈ [ 1 , n ] {c_i} = argmin\Sigma d_j^2 \hspace{2em} s,t \left\{\begin{matrix} \hspace{1em} \sum_{i=1}^{6}c_i^2 = 1 \\ \hspace{1em} i\in[1,6], \\ \hspace{1em}j\in [1,n] \end{matrix}\right. ci=argminΣdj2s,t i=16ci2=1i[1,6],j[1,n]

  4. 假设获得 c i c_i ci ,求解对应的圆心和法向量

    使用二次型构造,对称矩阵,进行分解,则特征值满足:
    λ 1 ≥ λ 2 > 0 > λ 3 \lambda_1 \ge\lambda_2>0>\lambda_3 λ1λ2>0>λ3
    如果不满足,改变构造的对称矩阵的符号,重新求解对特征值

    这里直接给出结论:

    H H H为分解矩阵后的特征向量组成的正交矩阵,法向量 n ⃗ \vec{n} n ,和中心点 P P P为:
    c o s 2 φ = λ 2 − λ 3 λ 1 − λ 3 n ⃗ = ± H [ − s i n φ 0 c o s φ ] P = ± H [ − λ 3 / λ 1 s i n φ 0 − λ 1 / λ 3 c o s φ ] cos^2\varphi = \frac{\lambda_2-\lambda_3}{\lambda_1-\lambda_3} \\ \\ \vec{n} = \pm H\begin{bmatrix} -sin\varphi \\ 0 \\ cos\varphi \end{bmatrix} \\ \\ P=\pm H \begin{bmatrix} -\sqrt{\lambda_3/\lambda_1}sin\varphi \\ 0 \\ \sqrt{-\lambda_1/\lambda_3}cos\varphi \end{bmatrix} cos2φ=λ1λ3λ2λ3n =±H sinφ0cosφ P=±H λ3/λ1 sinφ0λ1/λ3 cosφ

参考链接:

  1. 空间曲线参数方程
  2. 空间圆的方程

相关文章:

空间曲线的参数方程

空间曲线的参数方程 二维直线 经过一点 P ( x 0 &#xff0c; y 0 ) P(x_0&#xff0c;y_0) P(x0​&#xff0c;y0​)的方向向量为 n ( c o s θ &#xff0c; s i n θ ) n(cos\theta&#xff0c;sin\theta) n(cosθ&#xff0c;sinθ)的直线参数方程为&#xff1a; [ x y …...

非华为机型如何体验HarmonyOS鸿蒙系统 刷写HarmonyOS鸿蒙GSI系统以及一些初步的bug修复

最近很多视频网站有非华为机型使用HarmonyOS鸿蒙系统的演示。其实大都是刷了HarmonyOS鸿蒙系统gsi系统。体验还可以。有些刷入后bug较多。那么这些机型是如何刷写gsi&#xff1f;可以参考我以往帖子 安卓玩机搞机-----没有第三方包 刷写第三方各种GSI系统 体验非官方系统_gsi刷…...

Flutter 生成小程序的混合 App 实践

一、背景 微信小程序发展的越来越快,目前小程序甚至取代了大部分 App 的生态位,公司的坑位不增反降,只能让原生应用开发兼顾或换岗进行小程序的开发。 以我的实际情况来讲,公司应用采用的 Flutter 框架,同样的功能不可避免的就会存在 Flutter 应用开发和微信小程序开发兼…...

利用 Python-user-agents 解析 User_Agent

利用 Python-user-agents 解析 User_Agen 需求分析 近期在尝试做一个登录日志的功能&#xff0c;及用户登录成功后我在后台进行一个用户的登录记录&#xff0c;两种解决方案&#xff1a; 由前端得到用户的手机型号&#xff0c;我在后台接收后在数据库进行保存使用User_Agent…...

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看…...

Mybatis如何给字段起别名?

Mybatis如何给字段起别名&#xff1f; 假如有一个学生表&#xff0c;有一个字段是class&#xff0c;你的实体类变量肯定不能用class&#xff0c;那么如何起别名&#xff1f; 通过以下代码实现 Result(column "class",property "clas")mapper代码 pub…...

php对接AWS S3云存储,上传S3及访问权限问题

首先先下载sdk包 https://docs.aws.amazon.com/zh_cn/sdk-for-php/v3/developer-guide/getting-started_installation.html S3创建存储桶 去安全凭证-》创建访问秘钥 创建的时候会提示&#xff0c;主账号创建不安全&#xff0c;这个时候我们需要创建一个IAM账号来创建秘钥 创…...

java 实现单例模式

单例模式是一种设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一种全局访问该实例的方式。在Java中&#xff0c;可以使用多种方式来实现单例模式&#xff0c;下面整理了几种常见的实现方式。 饿汉式单例模式&#xff08;Eager Initialization&#xff09;&…...

minio文件服务器开启https

一、准备证书 你要有https安全证书&#xff0c;我的是适用于nginx的证书 私钥 xxxx.key 公钥 xxxx.pem 二、上传证书到minio服务器 然后看看你的minio docker 有没有把 /root/.minio 挂载在主机上&#xff0c;如果有那么把两个证书文件放在/root/.minio/certs目录里面。…...

每日刷题(回溯法经典问题之子集)

食用指南&#xff1a;本文为作者刷题中认为有必要记录的题目 前置知识&#xff1a;回溯法经典问题之组合 ♈️今日夜电波&#xff1a;想着你—郭顶 1:09 ━━━━━━️&#x1f49f;──────── 4:15 …...

PostgreSQL在进行除法时要注意

背景 整型除以整型&#xff0c;正常情况下当然得到的应该也是整型。数据库也是这么干的。 但是在数据库应用中&#xff0c;通常业务的需求是得到NUMERIC&#xff0c;不能直接把小数干掉。 数据库的行为给用户带来了诸多不便&#xff0c;例如1除以2&#xff0c;如果是整型除法会…...

开开心心带你学习MySQL数据库之第五篇

&#x1f63a;欢迎来到我的博客, 记得点赞&#x1f44d;收藏⭐️留言✍️&#x1f431; &#x1f409;做为一个怪兽&#xff0c;我的目标是少消灭一个奥特曼&#x1f409; &#x1f4d6;希望我写的博客对你有所帮助,如有不足,请指正&#x1f4d6; chatgpt 是否能够代替程序猿?…...

Geotools对geojson的解析

在 GeoTools 中&#xff0c;对 GeoJSON 的支持是通过一个插件来完成的&#xff0c;用户同样可以在 Maven 的 pom.xml 配置文件中添加下述的依赖。 <dependency><groupId>org.geotools</groupId><artifactId>gt-geojson</artifactId><version&…...

【博客701】shell实现保留网络现场:ping失败时执行mtr

shell实现保留网络现场&#xff1a;ping失败时执行mtr 场景 当我们网络出现抖动&#xff0c;到某个目的地ping不通时&#xff0c;我们想知道路径上哪里出现问题时可以在那时候执行mtr并保留下现场以供排查 实现&#xff1a;ping_and_mtr.sh #!/bin/bash# 定义要ping的IP地址列…...

放弃手写代码吧!用低代码你能生成各种源码

很多同学不知道为什么要用Low-code做开发&#xff0c;传统IT开发不行么&#xff1f;当然可以。 传统IT自研软件开发&#xff0c;通过编程去写代码&#xff0c;还有数据库、API、第三方基础架构等。这个方式很好&#xff0c;但不可避免的会带来开发周期长、难度大&#xff0c;技…...

什么程度才算精通 Linux?

前言 Linux 的优秀之处自然不必多说。 如果将操作系统比作一辆汽车&#xff0c;那 Linux 就是一辆性能出色的多功能越野车&#xff0c;上山下海飞天无所不能。 如果你拥有了它&#xff0c;一定不会只满足于驾驶它上下班&#xff0c;不能只会挂挡、踩油门和控制方向之类的基本…...

jmeter中的__setProperty用法

__setProperty 是一个用于设置 JMeter 属性的函数&#xff0c;基本语法&#xff1a; __setProperty(property, value)** property : 是要设置的属性的名称 ** value : 是要设置的属性的值在 JMeter中&#xff0c;可以使用 __setProperty 函数的元素&#xff1a; BeanShell …...

vue基础知识六:v-show和v-if有什么区别?使用场景分别是什么?

一、v-show与v-if的共同点 我们都知道在 vue 中 v-show 与 v-if 的作用效果是相同的(不含v-else)&#xff0c;都能控制元素在页面是否显示 在用法上也是相同的 <Model v-show"isShow" /> <Model v-if"isShow" />当表达式为true的时候&#…...

SpringBoot几个常用的注解

&#xff08;1&#xff09;RestController和Controller指定一个类&#xff0c;作为控制器的注解 &#xff08;2&#xff09;RequestMapping方法级别的映射注解&#xff0c;这一个用过Spring MVC的小伙伴相信都很熟悉 &#xff08;3&#xff09;EnableAutoConfiguration和Spri…...

腾讯JAVA后端秋招面试总结

腾讯秋招的面经,岗位是 java 后端开发。 说一下BIO、NIO和AIO 答: BIO是阻塞IO。在上一个线程的任务执行完之前,该线程必须阻塞等待上一个线程执行完毕。 NIO是非阻塞IO。一旦是响应事件发生了,该线程就会将对应的响应事件交给对应的事件处理器进行处理。 AIO是异步IO。主…...

随着iPhone 15降临,是时候扔掉所有的Lightning充电器了

自从苹果推出Lightning端口&#xff08;一直追溯到iPhone 5&#xff09;十多年后&#xff0c;你可能已经积累了相当多的Lightning电缆和配件。好吧&#xff0c;在下周的苹果活动之前&#xff0c;所有关于iPhone 15的传言都表明你不再需要它们了。 与最好的iPad和最好的MacBook…...

huggingface 使用入门笔记

概念 Hugging Face Hub​​和 Github 类似&#xff0c;都是Hub(社区)。Hugging Face可以说的上是机器学习界的Github。Hugging Face为用户提供了以下主要功能&#xff1a; ​模型仓库&#xff08;Model Repository&#xff09;​​&#xff1a;Git仓库可以让你管理代码版本、…...

ASP.NET Core 中的 Razor Pages

Razor Pages Razor Pages 是基于页面的 ASP.NET Core Web App 架构。 相比 MVC 模式&#xff0c;Razor Pages的生产效率更快。 Razer Pages 需要两个中间件&#xff1a; builder…Services.AddRazorPages 添加 Razor Pages servicesapp.MapRazorPages 添加 Razor Pages endpo…...

C语言入门 Day_14 for循环

目录​​​​​​​ 1.for循环 2.循环执行顺序 3.易错点 4.思维导图 前言 我们定义了一个数组以后&#xff0c;要使用&#xff08;读取或者修改&#xff09;数组元素的话&#xff0c;可以一个一个的读取&#xff0c;就前两课学的那样&#xff0c;代码类似这个结构。 int …...

深入解析 Socks5 代理与网络安全

作为网络工程师和网络文章主编&#xff0c;我们时刻关注着网络世界中的新趋势和技术发展。本文将探讨 Socks5 代理、代理IP、网络安全以及与之相关的 HTTP 协议&#xff0c;为您呈现一个深入的技术洞察。 引言 在今天的互联网时代&#xff0c;网络安全是至关重要的话题。攻击…...

Vue + Element UI 前端篇(十二):用户管理模块

Vue Element UI 实现权限管理系统 前端篇&#xff08;十二&#xff09;&#xff1a;用户管理模块 用户管理模块 添加接口 在 http/moduls/user.js 中添加用户管理相关接口。 import axios from ../axios/* * 用户管理模块*/// 保存 export const save (params) > {ret…...

C# 设计保存文件

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...

Leetcode 1486.数组异或操作

给你两个整数&#xff0c;n 和 start 。 数组 nums 定义为&#xff1a;nums[i] start 2*i&#xff08;下标从 0 开始&#xff09;且 n nums.length 。 请返回 nums 中所有元素按位异或&#xff08;XOR&#xff09;后得到的结果。 示例 1&#xff1a; 输入&#xff1a;n 5, …...

【Java】Java核心API概述

Java核心API是Java编程语言的基础&#xff0c;包含了Java应用程序中常用的类和接口。本文将介绍Java核心API中的一些重要部分&#xff0c;包括输入输出流、异常处理、集合框架、多线程和网络编程等。 1、输入输出流 Java的输入输出流API是Java IO&#xff0c;它提供了处理输入…...

微信小程序检查版本更新

新建文件 version-util.js // 小程序启动时检查版本 class VersionUtil {/*** 检查更新*/checkUpdate(){const updateManager wx.getUpdateManager();updateManager.onCheckForUpdate((hasUpdate)>{if(hasUpdate){updateManager.onUpdateReady(()>{wx.showModal({title…...