NX二次开发判断两对象是否相连(相交,相离)

一、概述

        最近学习如何判断两根曲线是否连接(不是相交,两条直线有一个端点重合),网上说到两种方法,一种是第一种方法,UF_MODL_ask_minimum_dist_3函数判断两个对象的距离,测得的距离等于零,就是接触的(当然可能是相连或者相交,根据实际情况使用)。第二种方法,通过UF_CURVE_ask_spline_data函数得到曲线两端的端点坐标,比对端点坐标,如果相同,则相互连接。

二、代码分析

1、UF_MODL_ask_minimum_dist_3判断两个对象的距离

代码解析:

UF_initialize();
	//创建两条直线
	UF_CURVE_line_t Line1;
	Line1.start_point[0] = 0.0;
	Line1.start_point[1] = 0.0;
	Line1.start_point[2] = 0.0;
	Line1.end_point[0] = 100.0;
	Line1.end_point[1] = 100.0;
	Line1.end_point[2] = 0.0;
	tag_t Line1TAG = NULL_TAG;
	UF_CURVE_create_line(&Line1, &Line1TAG);

	UF_CURVE_line_t Line2;
	Line2.start_point[0] = 100.0;
	Line2.start_point[1] = 80.0;
	/*Line2.start_point[2] = 0.0;*/
	Line2.start_point[2] = 100.0;
	Line2.end_point[0] = 30.0;
	Line2.end_point[1] = 100.0;
	Line2.end_point[2] = 0.0;
	tag_t Line2TAG = NULL_TAG;
	UF_CURVE_create_line(&Line2, &Line2TAG);


	//判断两个对象的最短距离函数
	tag_t tagObj1 = Line1TAG;
	tag_t tagObj2 = Line2TAG; //为空
	int iGuess2Given = 1; // 为1
	double douGuess2[3]={ 0.0,0.0,0.0 };//设置点坐标
	double douDis = 0.0;
	double douPointOnObj1[3] = { 0 };
	double douPointOnObj2[3] = { 0 };
	double douAccuracy = 0.0;
	UF_MODL_ask_minimum_dist_3(2, tagObj1, tagObj2, 0, NULL, 0, NULL, &douDis, douPointOnObj1, douPointOnObj2, &douAccuracy);
	char msg1[256], msg2[256], msg3[256];
	sprintf(msg1, "两个点最近的坐标,对象1:%f,%f,%f\n", douPointOnObj1[0], douPointOnObj1[1], douPointOnObj1[2]);
	sprintf(msg2, "两个点最近的坐标,对象2:%f,%f,%f\n", douPointOnObj2[0], douPointOnObj2[1], douPointOnObj2[2]);
	sprintf(msg3, "最小距离:%f\n", douDis);
	print(msg1);
	print(msg2);
	print(msg3);
	UF_terminate();

2、UF_CURVE_ask_spline_data判断是否存在两个端点相等

struct CurveData
{
	Point3d start;
	Point3d end;
	tag_t curve_tag;

	// 有参数构造函数
	CurveData(const Point3d& startPoint, const Point3d& endPoint, const tag_t& CurveTag)
		: start(startPoint), end(endPoint), curve_tag(CurveTag)
	{

	}
};
//获取曲线的端点
CurveData getVerOfCurve(tag_t curveTag)
{
	double point[3] = { 0 };
	double target[3] = { 0 };
	double pnorm[3] = { 0 };
	double bnorm[3] = { 0 };
	double a, b;
	double sta = 0;
	double end = 1;
	double stratP[3] = { 0 };
	double endP[3] = { 0 };
	UF_MODL_ask_curve_props(curveTag, sta, stratP, target, pnorm, bnorm, &a, &b);
	UF_MODL_ask_curve_props(curveTag, end, endP, target, pnorm, bnorm, &a, &b);
	return CurveData(Point3d(stratP[0], stratP[1], stratP[2]), Point3d(endP[0], endP[1], endP[2]), curveTag);
}
// 检查两个点是否相同
bool IsSamePoint(const Point3d& a, const Point3d& b)
{
	// 可以根据实际情况调整精度
	const double tolerance = 1e-6;
	return (std::abs(a.X - b.X) < tolerance && std::abs(a.Y - b.Y) < tolerance && std::abs(a.Z - b.Z) < tolerance);
}

//判断曲线1和2是否相连
bool areLinesConnected(const CurveData& Curve1, const CurveData& Curve2)
{
	if (IsSamePoint(Curve1.end, Curve2.start))
	{
		// 当前线段的终点与另一线段的起点相连记录
		return true;

	}
	else if (IsSamePoint(Curve1.end, Curve2.end))
	{
		return true;
	}
	else
	{
		return false;
	}
}

void MyClass::do_it()
{
	// TODO: add your code here
	UF_initialize();
	//创建两条直线
	UF_CURVE_line_t Line1;
	Line1.start_point[0] = 0.0;
	Line1.start_point[1] = 0.0;
	Line1.start_point[2] = 0.0;
	Line1.end_point[0] = 100.0;
	Line1.end_point[1] = 100.0;
	Line1.end_point[2] = 0.0;
	tag_t Line1TAG = NULL_TAG;
	UF_CURVE_create_line(&Line1, &Line1TAG);

	UF_CURVE_line_t Line2;
	Line2.start_point[0] = 100.0;
	Line2.start_point[1] = 100.0;
	Line2.start_point[2] = 0.0;
	Line2.end_point[0] = 30.0;
	Line2.end_point[1] = 100.0;
	Line2.end_point[2] = 0.0;
	tag_t Line2TAG = NULL_TAG;
	UF_CURVE_create_line(&Line2, &Line2TAG);

	CurveData thecurvedate1 = getVerOfCurve(Line1TAG);
	CurveData thecurvedate2 = getVerOfCurve(Line2TAG);
	bool IsCurveConnected = areLinesConnected(thecurvedate1, thecurvedate2);
	if (IsCurveConnected==true)
	{
		uc1601("相连",1);
	}
	else
	{
		uc1601("不相连", 1);
	}

	UF_terminate();
}

三、拓展

        可以通过这两个函数UF_CURVE_ask_spline_data判断是否相连,然后通过UF_MODL_ask_minimum_dist_3判断是否相交或者相离。

//判断两条曲线相交、将离,返会0为相交,返回1为相离
int IsCurveIntersectOrSeparation(tag_t curve1Tag, tag_t curve2Tag)
{
	//判断两个对象的最短距离函数
	tag_t tagObj1 = curve1Tag;
	tag_t tagObj2 = curve2Tag; 
	double douGuess2[3] = { 0.0,0.0,0.0 };//设置点坐标
	double douDis = 0.0;
	double douPointOnObj1[3] = { 0 };
	double douPointOnObj2[3] = { 0 };
	double douAccuracy = 0.0;
	UF_MODL_ask_minimum_dist_3(2, tagObj1, tagObj2, 0, NULL, 0, NULL, &douDis, douPointOnObj1, douPointOnObj2, &douAccuracy);
	if (douDis!=0)
	{
		return 1;
	}
	return 0;
}

void MyClass::do_it()
{
	// TODO: add your code here
	UF_initialize();
	//创建两条直线
	UF_CURVE_line_t Line1;
	Line1.start_point[0] = 0.0;
	Line1.start_point[1] = 0.0;
	Line1.start_point[2] = 0.0;
	Line1.end_point[0] = 100.0;
	Line1.end_point[1] = 100.0;
	Line1.end_point[2] = 0.0;
	tag_t Line1TAG = NULL_TAG;
	UF_CURVE_create_line(&Line1, &Line1TAG);

	UF_CURVE_line_t Line2;
	Line2.start_point[0] = 90.0;
	Line2.start_point[1] = 90.0;
	Line2.start_point[2] = 0.0;
	Line2.end_point[0] = 30.0;
	Line2.end_point[1] = 100.0;
	Line2.end_point[2] = 0.0;
	tag_t Line2TAG = NULL_TAG;
	UF_CURVE_create_line(&Line2, &Line2TAG);

	CurveData thecurvedate1 = getVerOfCurve(Line1TAG);
	CurveData thecurvedate2 = getVerOfCurve(Line2TAG);
	bool theIsCurveConnected = areLinesConnected(thecurvedate1, thecurvedate2);
	if (theIsCurveConnected==true)
	{
		uc1601("相连",1);
	}
	else
	{
		int theIsCurInterOrSep = IsCurveIntersectOrSeparation(Line1TAG, Line2TAG);
		if (theIsCurInterOrSep==1)
		{
			uc1601("不相交", 1);
		}
		else if (theIsCurInterOrSep == 0)
		{
			uc1601("相交", 1);
		}
	}
	UF_terminate();
}

        NX二次开发是枯燥的,但同时又是有趣的,就像我,同一份代码,不同的时刻编写的不一样,还记得刚刚开始时,所有代码都是写到一起的,但是后来慢慢开始定义函数,再后来定义结构体,使用迭代器等等,现在也正在封装自己的函数库,方便今后的直接调用。如果你坚持不下去时请多看看我的文章,最近事情比较多,但是一直抽时间写博客。把自己最近学的东西做以下记录,方便他人的同时,更是对自己生活的记录。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python】进程和线程

文章目录 进程创建进程os.fork() - 只适用于linux/unix/macmultiprocessing模块Process 类Pool进程池进程间通信队列queue常见用法管道pipes线程创建线程线程间通信互斥锁队列进程 任务管理器中一个任务就是一个进程 创建进程 os.fork() - 只适用于linux/unix/mac multipr…

Halcon与C#联合开发——1.读取图片、图像二值化

在vs中引入halcon控件 修改目标平台为 x64 拖出三个控件 代码展示 using System; using System.Windows.Forms; //引用支持halcon的命名空间 using HalconDotNet;namespace _1.HalconDisplay {public partial class Form1 : Form {// HObject 是Halcon库中表示图像和其他图形…

CentOS7下nginx部署测试

nginx部署测试 #安装程序和依赖yum install -y vim net-tools wgetyum -y install gcc pcre-devel zlib-devel openssl openssl-devel #下载nginx mkdir /opt/nginx cd /opt/nginx wget https://nginx.org/download/nginx-1.20.2.tar.gz#解压 tar zxvf nginx-1.20.2.tar.gz c…

Docker容器与虚拟化技术:OpenEuler 部署 Docker UI

目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose-ui 2.OpenEuler 部署 docker ui 3.使用cpolar内网穿透 二、问题 1.docker run -w 的作用 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168…

PMBOK第八版、项目管理AI标准...PMI标准今年有这些进展

项目管理实践标准不断在演变&#xff0c;PMI作为项目管理领域的权威机构&#xff0c;一直致力于与全球各行各业的项目实践者一同探索和研究最新的行业标准&#xff0c;确保PMI标准符合全球项目专业人士当前能力建设与职业发展的需要。 今年以来&#xff0c;我们发布了一系列PM…

Python提取本体文件的数据

运行结果&#xff1a; 使用replace函数去除前缀。 查找OWL的对象属性&#xff1a; 输出结果&#xff1a; 出现最后这个的原因&#xff1a; 修改程序&#xff1a; 最后的输出结果&#xff1a; 这个解析之后是这个样子的&#xff1a;

考研数学|《1800》《1000》《880》《660》最佳搭配使用方法

直接说结论&#xff1a;基础不好先做1800、强化之前660&#xff0c;强化可选880/1000题。 首先&#xff0c;传统习题册存在的一个问题是题量较大&#xff0c;但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大&#xff0c;但有些题目难度不够平衡&#xff0c;有些过于简单…

代码随想录训练营第59天 | LeetCode 503.下一个更大元素II、LeetCode 42. 接雨水

目录 LeetCode 503.下一个更大元素II 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;单调栈&#xff0c;成环了可怎么办&#xff1f;LeetCode&#xff1a;503.下一个更大元素II_哔哩哔哩_bilibili 思路 ​​​​​​LeetCode 42. 接雨水 文章…

Compute Express Link (CXL): An Open Interconnect for Cloud Infrastructure——论文阅读

DAC 2023 Paper CXL论文阅读笔记整理 背景 Compute Express Link是一种开放的行业标准互连&#xff0c;在PCI Express&#xff08;PCIe&#xff09;之上提供缓存和内存语义&#xff0c;具有资源池和织物功能。本文探讨了CXL在解决云基础设施中的一些挑战方面的作用。 CXL主要…

数据化运营09 抓住问题关键:用相关性分析拆解多个影响因素

前一讲&#xff0c;和你探讨了多维分析的方法&#xff0c;通过多维分析来寻找指标变化的原因。当我们找到问题的原因时&#xff0c;自然会进一步思考一个问题&#xff1a;指标变化的原因这么多&#xff0c;决定问题的关键因素又是哪个呢&#xff1f; 需要专栏原数据进行实操的同…

Linux小程序——进度条

前言&#xff1a;哈喽小伙伴们&#xff0c;经过我们对多个Linux基本开发工具的学习之后&#xff0c;对于Linux的使用也算是更上一层楼。 所以这篇文章&#xff0c;我们就尝试使用我们学过的Linux知识来写一个小程序——进度条&#xff0c;达到实践以及加深知识映像的效果。 目…

智能文档处理技术综述

一、 智能文档处理介绍 智能文档处理&#xff08;Intelligent Document Processing, IDP&#xff09;是利用人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、计算机视觉&#xff08;CV&#xff09;、自然语言处理&#xff08;NLP&#xff09;等技术…

POJ3037 + HDU-6714

两道最短路好题 POJ3037 手玩一下 发现每一点的速度可以直接搞出来&#xff0c;就是pow(2,h[1][1]-h[i][j])*V 那么从这个点出发到达别的点的耗费的时间都是上面这个数的倒数&#xff0c;然后直接跑最短路就好了 #include<iostream> #include<vector> #include<…

BeanPostProcessors是什么以及如何使用?

目录 一、BeanPostProcessors是什么&#xff1f;二、如何使用 BeanPostProcessor1、实现 BeanPostProcessor 接口2、注册 BeanPostProcessor3、示例代码 三、使用场景四、注意事项 一、BeanPostProcessors是什么&#xff1f; BeanPostProcessor 是 Spring 框架提供的一个扩展点…

Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

每日一题——LeetCode1748.唯一元素的和

方法一 两次遍历 var sumOfUnique function(nums) {let map new Map()for(let num of nums){map.set(num,map.has(num)?map.get(num)1:1)}let res0for(let num of nums){if(map.get(num)1) resnum}return res }; 消耗时间和内存情况&#xff1a; 方法二 一次遍历 var su…

新书速递——《可解释AI实战(PyTorch版)》

本书旨在帮助你实施最新的可解释AI技术&#xff0c;以构建公平且可解释的AI系统。可解释AI是当今AI研究中的热门话题&#xff0c;但只有少数资源和指南涵盖了所有重要技术&#xff0c;这些技术对实践者来说非常有价值。本书旨在填补这一空白。 本书读者对象 本书既适合那些有兴…

揭秘神秘商业模式:看似赔钱的买卖,如何月赚600万?

你是否曾被一个看似赔钱的买卖所吸引&#xff0c;最终却惊喜地发现它一个月竟然能赚600多万&#xff1f;这样的数字&#xff0c;是否让你感到意外又好奇&#xff1f;如果你仔细品味我们今天的内容&#xff0c;我相信&#xff0c;你也能开启属于自己的赚钱之路。 他们是如何实现…

自学编程的六种方法,你必须知道

随着互联网日趋迅猛&#xff0c;编程已经在我们生活当中无处不在了。众所周知&#xff0c;程序员的工资都很不错&#xff0c;于是越来越多的人&#xff0c;都想加入到编程的行业中来。那么如何加入到程序员的行业当中&#xff1f; PHP从入门到放弃&#xff0c;C语言从入门到放…

【CSDN活动】程序员职业生涯的分水岭:年龄还是经验?

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 程序员职业生涯的分水岭&#xff1a;年龄还是经验&#xff1f;引言技术更新换代…
最新文章