你们还记得大明湖畔…哦不是,是我曲面桁架那一章教程提出来的问题吗?
当一个点被和曲面发生各种乱七八糟的关系,比如pull,closest的时候,总是无法正确出现在曲面上?
今天我们从各种可能性来做一个小的探讨。
这篇帖子将更加简练,如果基础还不牢固,请看完我其余帖子再观看本贴。
本文旨在为大家介绍一种“纠错,排查”的自学工作流。
![]()
首先今天一个朋友提了一个问题,如何将一大堆点中不在面上的删除?
面是一个trim面。
![]()
我首先的思路是,divide domain2和isotrim然后取中心
![]()
绿色即为需要取的点
![]()
将这些中心点在曲面上的最近点找到,如果一个点在面上,那么它在面上的最近点和它肯定重合。
那么它们两个点的距离是0.只要用dispatch踢出距离非0的点就可以了。
如图,绿色区域内的点在面上的最近点是在面的边线上,即黄色实线上。
而黄色范围内的点本身在原地没有动,所以距离应为0。
同时,由于是trim面,divide domain2的时候patch自动补全。不再赘述。
![]()
随后出现了问题。得到的解集为空集。也就是说所有点的最近点都发生了位移。
![]()
怎么回事呢?这里面用到的命令屈指可数,我们一个个来检查。
首先我们来排除Surface Closest Point的命令,随意点四个点。
通过不同方法我们都可以验证点在找到最近点以后,最近点确实是在面上的。排除。
![]()
接下来我们返回上一步,直接Point in Trim来验证Closest Point命令输出的点是否在Trim面上。
答案令人很沮丧,虽然显示有24个点不在面上,76个点在,但实际上我们已经看得出来,
红色的24个点实际上是在Trim面边线上的。
![]()
再来思考一下,应该是细分面以后的中心点不在面上的问题。
因为面不是平面,就如同弧面(凸包)的中心点不在面上是很正常的。
所以我们跳过最近点直接用Center Point输出结果来验证。
结果很奇特,Point in Trim竟然显示True。我们不能再依赖这个运算器的布尔值了。
![]()
我们随意做一个弧面,我用4点生面手工拉了一个面,抬了一个角点。
如刚才5分析的,Point in Trim又显示不在面上,这时候说明又对了。
那么5为什么刚才显示的不正确呢?不过我们已经找到了原因之一了。
![]()
联想一下曲面桁架的教程,我认为还应该是Isotrim 和 Divide Domain2两个命令的原因。
他们的使用导致了Closest Point无法正常工作。
到了这里,其实已经脱离了如何选取点这个最开始的目标了。
而是变成了到底这个运算器能否在这种环境下正常工作?
为了验证刚才说的在Isotrim 和 Divide Domain2两个命令连用的情况下,面上最近点的点会不在面上这个奇葩现象,
我试着将在Trim Srf上的点再一次在面上找Closest Point。
我们首先来理清一下思路:
(1)如果一个点A和一个面S在同一xy平面内,位置关系是点A在面S外,并且不在面S的上下方,
即无法投影在这个面S上,那么这个点在面上的最近点a一定位于S的边线上。详情查看步骤1黄色实线。
那么很显然两点的距离Aa一定大于零。
(2)如果一个点B恰好位于面S范围内,那么B的z向投影点b也肯定在面S内且和B坐标重合。
那么B和b的距离Bb一定为0,因为是坐标相同的两个点。
这里能理解清楚,那么往下我继续验证。
如果之前Point in Trim我们不敢肯定结果的话,那么我用一个点的三个坐标来验证总完全没问题了吧。
根据上边的推理(2),Bb=0,那么xB=xb,yB=yb,zB=zb
用坐标最原始也是最不可置疑。
我们将Closest Point输出的已经在面上的最近点B再次拉到面上得到点b。按照推理(2),他们的横坐标xB将等于xb。
事实是,我们的100个点只有74个点原地没动,剩余26个点又动了。
请大家自行脑补暴漫“我给你跪了”的表情。
![]()
继续验证,为了方便我们将上边的程序打包。
![]()
不断把已经在面S上的点B再次pull在面b上寻找最近点。
![]()
到这一步大家就看的很清楚了,每一次找最近点,总是有26个点的坐标会发生变化。
这是一个死循环。
大家可以联想一下曲面桁架的教程,当时我说你们一定要再找一次Closet Point,把得到的最近点Pull到UV结构线交点上。
其实就是因为最近点不在曲面上的原因。
至此可以肯定,最大的罪魁祸首就是Isotrim 和 Divide Domain2两个命令工作环境下Surface Closest Point并不在Surface上。
哈哈哈。我也是跪了。
当然,以上推理中的Bb=0是严格的推理。从理论上讲他们的距离应该等于0。
我们再回到最开始的问题上,如果想要得到这个同学的答案应该怎么做?
我用Panel查看了一下在循环查找最近点之后B和b的距离只有e^-12这么小了。
所以只要只选择小的值,就可以得到这些点了。
通过这个例子我想告诉大家,其实有时候一个程序是很有意思的。
也许你看了别人的做法,会了,但是你可能永远不知道这个程序里隐藏着许多未解之谜。
不亲手操作一下,你是永远不可能知道的。
有时候我们不能只把做出来结果当做正确解,而是要甘于钻研每一个电池的“微效应”,这样才能彻底把相关知识学透彻。
至于到底为什么会会出现Isotrim 和 Divide Domain2两个命令工作环境下Surface Closest Point并不在Surface上的情况?
抱歉,我也不明白。我是用GH当做工具简化我的建模,把自己当做使用者来用软件的。
而不是把自己当百科全书十万个为什么来被软件用的。
我只是一个使用者,而不是程序的开发者,这个问题我也解答不了。
希望各位通过这个例子能够学会深入探索的精神,并且知道当发现一个问题的时候,如何一步步的排查问题原因。
通过更改变量(比如将Point in Trim更改为坐标验证)来查找到底是哪一步出现了差错。
希望大家能掌握到一种新的自学方法。自学永远是最好的老师。
最后还是给出这位同学问题的答案吧。绿框内是解答,黄圈里是主要使用的计算器。
而紫色的框里,是你如果只注重“解出”问题而不注重“解答”过程本身所丢失的学习机会。
我想这就是为什么同样的练习题,有人考试考了100有人考了60的原因吧!共勉之。
![]()
———————————————————————————————————————————————————————
本文所有内容版权均属于作者所有
欢迎您扫描下方二维码关注小黄人君的微信公众账号
