ACIS中如何求点在FACE参数域内的坐标

1. 点在 FACE 上

如果点在FACE上,可以采用surface的直接接口:surface::param、surface::test_point和surface::test_point_tol。

virtual SPApar_pos surface::param	(	const SPAposition & 	pos,
const SPApar_pos & 	param_guess = SpaAcis::NullObj::get_par_pos() 
)	
logical surface::test_point	(	const SPAposition & 	pos,
const SPApar_pos & 	param_guess = SpaAcis::NullObj::get_par_pos(),
SPApar_pos & 	param_actual = SpaAcis::NullObj::get_par_pos() 
)	
virtual logical surface::test_point_tol	(	const SPAposition & 	pos,
double 	tol = 0,
const SPApar_pos & 	param_guess = SpaAcis::NullObj::get_par_pos(),
SPApar_pos & 	param_actual = SpaAcis::NullObj::get_par_pos() 
)	

我更喜欢test_point_tol这个接口,因为这个接口可以设定一个阈值,而且可以判断点是否在FACE上面。

2. 点在 FACE 外

如果点point不在FACE上面,需要找到FACE上距离point最近的点closest_pos,或者将point投影到FACE上之后(得到的也是closest_pos),再去找对应的u、v参数

其中,将point投影到FACE上的接口为point_perp,如下所示:

void point_perp(
const SPAposition& pos,
SPAposition& foot,
const SPApar_pos& param_guess	= SpaAcis::NullObj::get_par_pos(),
SPApar_pos& param_actual		= SpaAcis::NullObj::get_par_pos(),
logical f_weak					= FALSE
)

求FACE上距离point最近的点的接口为api_entity_point_distance,如下所示:

outcome api_entity_point_distance(ENTITY      *ent,
SPAposition &in_point,
SPAposition &closest_pos,
double      &distance,
param_info  &ent_info = SpaAcis::NullObj::get_param_info(),AcisOptions *ao = NULL);

上面两个接口都提供了直接获得closest_pos的UV参数的变量,但是我实测获得的UV都是0,好像不行,获得closest_pos之后,要想得到UV,还得采用(1)中的接口来获取准确的 UV 参数。

为了方便大家测试学习,我写了一段测试代码,可直接取用。

void main()
{api_start_modeller(0);//add unlock license key here; refer to the "Application Licensing" articleunlock_spatial_products();my_initialization();// Create a cuboid.BODY* block = NULL;api_make_cuboid(30, 30, 30, block, NULL);ENTITY_LIST face_list;api_get_faces(block, face_list);std::cout << "face size = " << face_list.iteration_count() << std::endl;//2. 输出面数据int faceCount = face_list.iteration_count();for (int i = 0; i < faceCount; ++i){std::cout << "第" << i << "个面:";FACE* face = (FACE*)face_list[i];SPAposition faceCenter = compute_face_midpoint(face);SPAvector faceNormal = compute_face_midpoint_outnormal(face);std::cout << "面中点坐标 = (" << faceCenter.x() << "," << faceCenter.y() << "," << faceCenter.z() << ")" << std::endl;std::cout << "面中点外法线 = (" << faceNormal.x() << "," << faceNormal.y() << "," << faceNormal.z() << ")" << std::endl;}//3. 确定测试点和面FACE* pTestFace = (FACE*)face_list[0];surface const& pTestSurf = pTestFace->geometry()->equation();SPAposition pos1 = SPAposition(3, 12, 15);//在面上的一点SPAposition pos2 = SPAposition(0, 0, 25);//在面外的一点//4.1 测试param接口SPApar_pos param1_1 = pTestSurf.param(pos1, SPApar_pos(0.2,0.2));SPApar_pos param1_2 = pTestSurf.param(pos2, SPApar_pos(0.2, 0.2));std::cout << "测试param接口:param1_1 = " << param1_1.u << ", " << param1_1.v << ". param1_2 = " << param1_2.u << ", " << param1_2.v << std::endl;//4.2 测试point_perpSPAposition foot2_1;SPAposition foot2_2;SPApar_pos param2_1;SPApar_pos param2_2;pTestSurf.point_perp(pos1, foot2_1, SPApar_pos(0.2, 0.2), param2_1);pTestSurf.point_perp(pos2, foot2_2, SPApar_pos(0.2, 0.2), param2_2);std::cout << "测试point_perp接口:param2_1 = " << param2_1.u << ", " << param2_1.v << ". param2_2 = " << param2_2.u << ", " << param2_2.v << std::endl;std::cout << "foot2_1 = (" << foot2_1.x() << "," << foot2_1.y() << "," << foot2_1.z() << ")" << std::endl;std::cout << "foot2_2 = (" << foot2_2.x() << "," << foot2_2.y() << "," << foot2_2.z() << ")" << std::endl;//4.3 测试test_pointSPAposition foot3_1;SPAposition foot3_2;SPApar_pos param3_1;SPApar_pos param3_2;bool result1 = pTestSurf.test_point(pos1, SPApar_pos(0.2, 0.2), param3_1);bool result2 = pTestSurf.test_point(pos2, SPApar_pos(0.2, 0.2), param3_2);std::cout << "result1 = " << result1 << ",result2=" << result2 << "测试point_perp接口:param3_1 = " << param3_1.u << ", " << param3_1.v<< ". param3_2 = " << param3_2.u << ", " << param3_2.v << std::endl;//4.4 测试最短距离SPAposition closest_pos1;double distance1;param_info ent_info1;outcome result = api_entity_point_distance(pTestFace, pos1, closest_pos1, distance1, ent_info1);std::cout << "closest_pos1 = (" << closest_pos1.x() << ", " << closest_pos1.y() << ", " << closest_pos1.z() << ")" << std::endl;std::cout << "distance1 = " << distance1 << std::endl;std::cout << "uv_params = (" << ent_info1.uv().u << "," << ent_info1.uv().v << ")" << std::endl;SPAposition closest_pos2;double distance2;param_info ent_info2;result = api_entity_point_distance(pTestFace, pos2, closest_pos2, distance2, ent_info2);std::cout << "closest_pos2 = (" << closest_pos2.x() << ", " << closest_pos2.y() << ", " << closest_pos2.z() << ")" << std::endl;std::cout << "distance2 = " << distance2 << std::endl;std::cout << "uv_params = (" << ent_info2.uv().u << "," << ent_info2.uv().v << ")" << std::endl;my_termination();api_stop_modeller();
}

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

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

相关文章

【SQL Server数据库】数据的增删改操作

目录 一、用SQL语句完成下列功能。 1、新开设一门课程&#xff0c;名叫网络安全与防火墙&#xff0c;学时40&#xff0c;编号为“0118”&#xff0c;主要介绍网络的安全与主要的防火墙软件。 2、先建立monitor表&#xff0c;其结构与student表大致一样&#xff0e;…

华为仓颉编程语言观感

这里写自定义目录标题 相似点&#xff08;主要与Swift进行对比&#xff09;不同点亮点 花了半天时间&#xff0c;对华为新出的仓颉编程语言做了简单的了解&#xff0c;整体观感如下&#xff1a; 仓颉语言看起来是一门大而全的语言&#xff0c;吸纳了现存的很多中编程语言的范式…

图书管理系统(详解版 附源码)

目录 项目分析 实现页面 功能描述 页面预览 准备工作 数据准备 创建数据库 用户表 创建项目 导入前端页面 测试前端页面 后端代码实现 项目公共模块 实体类 公共层 统一结果返回 统一异常处理 业务实现 持久层 用户登录 用户注册 密码加密验证 添加图书…

Cesium默认bing地图数据,还支持哪些地图的数据源呢?

传统的前端开发增长乏力了&#xff0c;新兴的web3D方向前端开发需求旺盛&#xff0c;这一块在国外很成熟&#xff0c;在国内兴起不久&#xff0c; 甚至很多前端老铁都没听过&#xff0c;没见过&#xff0c;没有意识到&#xff0c;前端除了框架、vue、uniapp这些烂大街的&#x…

黑马苍穹外卖7 用户下单+订单支付(微信小程序支付流程图)

地址簿 数据库表设计 就是基本增删改查&#xff0c;与前面的类似。 用户下单 用户点餐业务流程&#xff1a; 购物车-订单提交-订单支付-下单成功 展示购物车数据&#xff0c;不需要提交到后端 数据库设计&#xff1a;两个表【订单表orders&#xff0c;订单明细表order_d…

cnpm run dev 报错 Error: Cannot find module ‘fs/promises’

主要原因是babel版本冲突 卸载以下依赖可以解决问题&#xff1a; 之后重新安装babel-loader依赖 可能会报以下错误&#xff1a; 接着安装babel-core依赖 项目顺利启动

【启明智显分享】低成本RISC-V工业级HMI方案推荐

伴随着工业4.0的迅猛发展&#xff0c;工业HMI以方便、快捷的特点逐渐成为工业的日常应用&#xff0c;成为备受追捧的全新多媒体交互设备。 什么是工业HMI&#xff1f;工业HMI是用于工业自动化系统中的人机交互界面&#xff0c;通常由触摸屏、按钮、指示灯、显示器等组成&#…

如何正确使用C#短信接口发送招生短信

群发短信对教育机构来讲虽然是个不错的招生工具,但怎么使用决定着生源转化效率,如果是为了单纯的发短信而发短信效率当然不好,那么如何正确使用招生群发短信呢?技巧才是关键! 教育短信发送较多的就是招生群发短信内容,而运营商对教育行业内容审核一般比较严格,需要短信公司特殊…

新媒体矩阵系统是什么?怎么搭建矩阵系统?

目录 前言&#xff1a; 一、新媒体矩阵分别是什么&#xff1f; 1、横向矩阵 2、 纵向矩阵 二、新媒体矩阵的作用&#xff1f; 1、多元化发展&#xff0c;吸引目标 2、多平台协同&#xff0c;放大宣传效果 3、多平台运营&#xff0c;分散风险 三、怎么做矩阵系统&…

【摄像头标定】双目摄像头标定及矫正-opencv(python)

双目摄像头标定及矫正 棋盘格标定板标定矫正 棋盘格标定板 本文使用棋盘格标定板&#xff0c;可以到这篇博客中下载&#xff1a;https://blog.csdn.net/qq_39330520/article/details/107864568 标定 要进行标定首先需要双目拍的棋盘格图片&#xff0c;20张左右&#xff0c;…

企业微信内嵌H5项目接入聊天功能

产品需求是,在列表中把符合条件的列表接入聊天功能,以下是详细步骤: 1.引入企业微信 <script src"https://res.wx.qq.com/wwopen/js/jsapi/jweixin-1.0.0.js"></script> 2.获取wx签名(必须要) /*** 获取wx签名**/ export function getWxJsApi(data) {r…

RKmedia进行vi-vo模块

一、简介 分析一下rkmedia的代码&#xff0c;给自己加深一下印象 二、代码 2.1 头文件以及定义 首先包含了必要的头文件&#xff0c;以及rkmedia底层的库 static bool quit 是定义了布尔类型的变量来表示这个程序的运行状态 false表示没停止 true表示停止 sigterm_handle…

pdf压缩,pdf压缩在线,pdf文件太大怎么变小

在数字化时代&#xff0c;PDF文档因其跨平台、保持原样、易于阅读和打印等特点&#xff0c;成为了我们日常工作和生活中不可或缺的一部分。然而&#xff0c;随着PDF文件的不断累积&#xff0c;存储空间逐渐变得紧张&#xff0c;特别是在处理大量大型PDF文件时&#xff0c;如何有…

【Python】在 VS Code 里面绘制动图不显示动画的解决办法

在 VS Code 中&#xff0c;可以通过以下步骤来确保动画正确显示&#xff1a; 配置 VS Code 使用适当的绘图后端&#xff1a; VS Code 中使用 matplotlib 的动画功能&#xff0c;需要配置适当的绘图后端。推荐使用 TkAgg 或者 Qt5Agg 后端。你可以在代码中显式指定&#xff1a;…

若依前后端分离项目整合shardingjdbc分表(详细,分片字段订单id)

文章目录 1. 引入Maven依赖2.引入配置文件3.兼容之前的数据库源,使用现在的sharding数据库源&#xff08;shardingjdbc默认的数据源&#xff09;&#xff0c;但是配置好文件之后是没有生效的&#xff0c;需要加配置文件覆盖4. 检测是否成功5. 如何使用&#xff0c;在需要使用的…

qt开发-14_QListwidget 仿qq好友列表制作

QListWidget 继承 QListView。QListWidget 类提供了一个基于项的列表小部件。QListWidg et 是一个便捷的类&#xff0c;它提供了一个类似于 QListView&#xff08;下一小节将讲到&#xff09;提供的列表视图&#xff0c;但 是提供了一个用于添加和删除项目的基于项目的经典接口…

第10章 启动过程组 (启动过程组的重点工作)

第10章 启动过程组 10.3启动过程组的重点工作&#xff0c;在第三版教材第362~364页&#xff1b; 文字图片音频方式 第一个知识点&#xff1a;项目启动会议 1、作用 标志着对项目经理责权的定义结果的正式公布&#xff0c;通常由项目经理负责组织和召开。2、目的 使项目各…

数据库常用操作命令

数据库基本操作 #查看数据库 show databases#创建数据库 create database db DEFAULT CHARSET utf8 COLLATE utf8_general_ci;#使用数据库 use db;用户操作 #创建用户 create user 用户名IP地址 identified by 密码;#删除用户 drop user 用户名IP地址;#修改用户 rename user …

分享:Wordpress插件-AI Image Pro v2.6.0中文版语言包

AI Image Pro是一个wordpress插件,可将您的 WordPress 网站直接与最佳图像生成 A模型(DALL.E和稳定扩散)集成&#xff0c;并允许您利用 AI 生成图像、编辑(内画)图像和创建图像变体。最重要的是&#xff0c;它配备了许多一键式滤镜和许多微调选项,您可以使用它们来增强和创建令…

【算法介绍】开集识别算法 OpenMax

OpenMax算法简介 OpenMax是一种用于深度学习模型的开集识别算法&#xff0c;它能够在模型的输出中区分已知类别和未知类别。该算法的核心思想是利用深度神经网络的倒数第二层&#xff08;全连接层&#xff09;的激活向量&#xff0c;通过构建每个类别的平均激活向量&#xff0…