【Matlab】判断点和多面体位置关系的两种方法实现

news2024/9/30 7:56:05

我的主页:

  • 技术邻:小铭的ABAQUS学习的技术邻主页
  • 博客园 : HF_SO4的主页
  • 哔哩哔哩:小铭的ABAQUS学习的个人空间
  • csdn:qgm1702

博客园文章链接:

  • https://www.cnblogs.com/aksoam/p/17590039.html

分别是向量判别法(算法来自他人论文)、体积判别法(code 是我从网上找的)。

方法一: 向量判别法

方法来自一会议论文:《判断点与多面体空间位置关系的一个新算法_石露》2008年,知网、万方、百度学术有收录。
优点:

  • 适合任意多面体
  • 计算简单
  • 速度快

算法原理

img

Matlab 实现

主函数为InPolyhedronByVJM(Nodes,P),当前仅支持ABAQUS 四面体和五面体单元,其余有需要的可自行在switch语句添加函数。
输入:

  • Nodes:包含节点顺序和坐标的N x 3的矩阵
  • P:1x3的行向量

这是我根据ABAQUS单元规则编写的函数,因此其他软件的网格信息文件还需要重写。

function flag = InPolyhedronByVJM(Nodes,P)
% 根据向量判别法,判断点和多面体的位置关系.
% 算法依据:石露,白冰,李小春. 判断点与多面体空问位置关系的一个新算法[C].
% 输入:
%       + Nodes: n x 3 matrix
%       + P    : 1 x 3 row vector
% 单元节点顺序需要满足ABAQUS的约定。
% Nodes是一个n x 3的数值矩阵,每一行表示多面体的一个节点的空间坐标。
% 点在多面体内部的充分必要条件:每个face上任一点到点P的向量和该face法向量的数量积都
% 小于等于0,否则在体外。
NumOfNode = size(Nodes, 1);
switch NumOfNode
    case 4
        flag = InTetrahedron(Nodes, P);
        disp('tetra')
    case 5
        flag = InPyramid(Nodes, P);
        disp('parymid')
end
end

针对C3D4类单元的判别函数

function flag = InTetrahedron(Nodes, P)
% tetra elem have 4 face.
% ABAQUS rule about node ordering and face numbering on element
FaceIDX = [1 2 3;
    1 4 2;
    2 4 3;
    3 4 1];
for faceId = 1 : 1 : size(FaceIDX, 1)
    % judge face i: node 1-node 2-node 3 face
    % get face normal vector(outside)
    n = -1 .* GetNormVector(Nodes(FaceIDX(faceId, 1), :), Nodes(FaceIDX(faceId, 2), :), Nodes(FaceIDX(faceId, 3), :));
    % calculate dot product of P and normal vector n
    N1P = P - Nodes(FaceIDX(faceId, 1), :);
    f = dot(N1P, n);
    if f > 0
        flag = 0;
        return
    end
end
flag=1;
end

针对C3D5类单元的判别函数

function flag = InPyramid(Nodes, P)
% Pyramid elem have 5 face.
% ABAQUS rule about node ordering and face numbering on element
FaceIDX = [1 2 3 4;
    1 5 2 0;
    2 5 3 0;
    3 5 4 0;
    4 5 1 0];
for faceId = 1 : 1 : size(FaceIDX, 1)
    % judge face i: node 1-node 2-node 3 face
    % get face normal vector(outside)
    n = -1 .* GetNormVector(Nodes(FaceIDX(faceId, 1), :), Nodes(FaceIDX(faceId, 2), :), Nodes(FaceIDX(faceId, 3), :));
    % calculate dot product of P and normal vector n
    N1P = P - Nodes(FaceIDX(faceId, 1), :);
    f = dot(N1P, n);
    if f > 0
        flag = 0;
        return
    end
end
flag = 1;
end

求面法向向量的函数

function NormalVector = GetNormVector(p1, p2, p3)
% function return a Normal Vector,base on RightHand Rule, according to three point (row vector)
% NormalVector=cross product of (p2-p1) and (p3-p1)
% check
if (~isrow(p1)) || (~isrow(p2)) || (~isrow(p3))
    return
end
p1p2 = p2 - p1;
p1p3 = p3 - p1;
NormalVector = cross(p1p2, p1p3);
end

附:abqus四面体和五面体单元的节点约定
img

img

方法二:体积判别法

这个代码是我在网上找的,出处已经忘了。

Matlab实现(仅限四面体)

function inflag = inpolyhedronByVolCal(points_mat, p_detected)
% input:
%     + points_set : 4 point's x y z coordinate,integrated in a 4X3 matrix
%     + p_detected : a point needed to detect ,1X3 matrix contain x y z
%                    coordinate
% return : inflag: 0 or 1
D0 = det([points_mat(1, :) 1;
    points_mat(2, :) 1;
    points_mat(3, :) 1;
    points_mat(4, :) 1]);
D1 = det([p_detected 1;
    points_mat(2, :) 1;
    points_mat(3, :) 1;
    points_mat(4, :) 1]);
D2 = det([points_mat(1, :) 1;
    p_detected      1;
    points_mat(3, :) 1;
    points_mat(4, :) 1]);
D3 = det([points_mat(1, :) 1;
    points_mat(2, :) 1;
    p_detected      1;
    points_mat(4, :) 1]);
D4 = det([points_mat(1, :) 1;
    points_mat(2, :) 1;
    points_mat(3, :) 1;
    p_detected      1]);

if (D0 < 0 && D1 < 0 && D2 < 0 && D3 < 0 && D4 < 0) || ((D0 > 0 && D1 > 0 && D2 > 0 && D3 > 0 && D4 > 0))
    inflag = 1;
else
    inflag = 0;
end
end

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

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

相关文章

互联网医院牌照申请指南:开启数字化医疗创新之路

申请互联网医院牌照的流程主要包括以下几个步骤&#xff1a;   准备材料&#xff1a;根据相关法规和政策要求&#xff0c;准备好申请互联网医院牌照所需的材料&#xff0c;包括但不限于医疗机构执业许可证、法人资质证明、医疗设备购置证明、医疗人员资格证书等。   填写申…

使用Hutool工具类中的BeanUtil.fillBeanWithMap方法报错`DateException`

使用Hutool工具类中的BeanUtil.fillBeanWithMap方法报错DateException 问题背景 在实现登录功能时&#xff0c;我先将用户信息存入Redis中&#xff0c;然后再获取用户信息的时候&#xff0c;又取出来。我存入Redis的用户信息是Hash格式的&#xff0c;所以取出来的时候&#xff…

BI-SQL丨两表差异比较

BOSS&#xff1a;哎&#xff0c;白茶&#xff0c;我们最近新上了一个系统&#xff0c;后续有一些数据要进行源切换&#xff0c;这个能整么&#xff1f; 白茶&#xff1a;没问题&#xff0c;可以整&#xff01; BOSS&#xff1a;哦&#xff0c;对了&#xff0c;差点忘记告诉你了…

【腾讯云 Cloud Studio 实战训练营】Claude GPT+Cloud Studio快速完成Excel工资自动核算

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

mac关闭VPN之后,浏览器就不能够正常上网了(图解)

可能打开谷歌浏览器会显示无法正常连接网络等信息&#xff0c;这个时候可以按照以下步骤&#xff1a; 点击"检查代理服务器地址" 会显示以下这段话&#xff0c;按照这个步骤来操作就可以了。 打开系统偏好设置&#xff0c;点击网络 点击高级 取消掉所有已勾选代…

Spring-mybatis结合的底层原理

1.项目前期准备 1.1 导入maven jar包 <dependencies><!-- spring依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version></depende…

CK-00靶机详解

CK-00靶机详解 靶场下载地址&#xff1a;https://download.vulnhub.com/ck/CK-00.zip 这个靶场扫描到ip打开后发现主页面css是有问题的&#xff0c;一般这种情况就是没有配置域名解析。 我们网站主页右击查看源代码&#xff0c;发现一个域名。 把域名添加到我们hosts文件中。…

Meta “地平线世界”移动端应用即将上线,手机快乐元宇宙?

根据海外记者 Janko Roettgers 的报道&#xff0c;Meta 预计很快推出移动版的 VR 元宇宙服务 "地平线世界"&#xff0c;这是Meta 长期开发的产品。 根据最新报道&#xff0c;Meta宣布正在研发“地平线世界”的移动版&#xff0c;并表示这一服务已经可以在Quest VR设…

黑客成长技术清单 | 渗透测试详解(全网最全工具,最常用的工具)

在为做网络安全不知如何入手而迷茫 在为不知如何规划自己的技术学习路线而烦恼 在为不知该钻研了解互联网的哪个方向而犹豫 这份网络安全 的内部安全资料&#xff0c;解答你所有的学习疑惑。 给大家享一份全套的网络安全学习资料, 给那些想学习网络安全的小伙伴们一点帮助!…

线段树详解 原理解释 + 构建步骤 + 代码(带模板)

目录 介绍&#xff1a; 定义&#xff1a; 以具体一个题目为例&#xff1a;​编辑 树的表示方法&#xff1a; 实现步骤&#xff1a; 构建结点属性&#xff1a; pushup函数&#xff1a; build函数&#xff1a; pushdown函数&#xff1a; modify函数&#xff1a; q…

《零基础入门学习Python》第071讲:GUI的终极选择:Tkinter8

虽然我们能用 tkinter 设计不少东西了&#xff0c;但是不少同学还是感觉对这个界面编程掌控得还不够多&#xff0c;说白了&#xff0c;就是我们现在还没办法随心所欲的去绘制我们想要的界面&#xff0c;但是不瞒你说&#xff0c;今天的这一节课将会给你的人生乃至人生观带来翻天…

Linux下在终端输入密码隐藏方法

Linux系统中&#xff0c;如何将在终端输入密码时将密码隐藏&#xff1f; 最近做简单的登录界面时&#xff0c;不做任何操作的话&#xff0c;在终端输入密码的同时也会显示输入的密码是什么&#xff0c;这样对于隐蔽性和使用都有不好的体验。那么我就想到将密码用字符*隐藏起来…

Glow: Generative Flow with Invertible 1×1 Convolutions论文解析及实现(二)

Glow: Generative Flow with Invertible 11 Convolutions 代码github: https://github.com/rosinality/glow-pytorch添加链接描述 1 模型架构如下 1.1 左边图flow模型 Flow model ① ActNorm ② InvConv2dLU ③ AffineCoupling 1.2 右边模型结构Glow模型 Glow Model Block…

C++之poll与epoll总结(一百六十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

SpringCloudAlibaba之Ribbon

Ribbon是nacos自带的负载均衡器&#xff0c;属于客户端的负载均衡 但是在Spring高级版本中让LoadBalancer替代了 本人用的是2.1.0的nacos&#xff0c;ribbon还没有被替换。 使用&#xff1a; 在配置类中&#xff1a;LoadBalanced BeanLoadBalancedpublic RestTemplate restT…

ETHERNET/IP转RS485/RS232网关什么是EtherNet/IP?

网络数据传输遇到的协议不同、数据互通麻烦等问题&#xff0c;一直困扰着大家。然而&#xff0c;现在有一种神器——捷米JM-EIP-RS485/232&#xff0c;它将ETHERNET/IP网络和RS485/RS232总线连接在一起&#xff0c;让数据传输更加便捷高效。 那么&#xff0c;它是如何实现这一功…

Python Web开发技巧VIII

目录 ModelSerializer和Serializer区别是什么 从queryset中取出某个models的字段值 Q对象进行模糊匹配 HTTP方式-如何模糊搜索JSON字段中的某个KEY值呢&#xff1f; showmigrations 合并两个或多个queryset ModelSerializer和Serializer区别是什么 都是DRF中用于序列化和…

尚医通9:医院列表功能+GateWay网关

内容介绍 1、医院列表功能&#xff08;接口&#xff09; 4、医院列表功能&#xff08;前端&#xff09; 5、更新医院上线状态功能 6、医院详情 7、GateWay网关 8、医院排班管理需求分析 9、查看医院所有科室接口、前端 医院列表功能&#xff08;接口&#xff09; 接口…

代码随想录算法训练营day15 | 102. 二叉树的层序遍历,226. 翻转二叉树,101. 对称二叉树

目录 102. 二叉树的层序遍历 226. 翻转二叉树 101. 对称二叉树 100. 相同的树 100是101的衍生题目。572也为101的衍生题目。 102. 二叉树的层序遍历 思路&#xff1a; 以前的笔记 代码&#xff1a; class Solution {public List<List<Integer>> levelOrder(T…

web自动化测试-PageObject 设计模式

为 UI 页面写测试用例时&#xff08;比如 web 页面&#xff0c;移动端页面&#xff09;&#xff0c;测试用例会存在大量元素和操作细节。当 UI 变化时&#xff0c;测试用例也要跟着变化&#xff0c; PageObject 很好的解决了这个问题。 使用 UI 自动化测试工具时&#xff08;包…