纠错-排查-往深了挖

今天这个问题是群里一位朋友让帮忙做一个小的程序的时候发现的。
你们还记得大明湖畔…哦不是,是我曲面桁架那一章教程提出来的问题吗?
当一个点被和曲面发生各种乱七八糟的关系,比如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的原因吧!共勉之。

 

DeeperHarderFaster

 

———————————————————————————————————————————————————————

本文所有内容版权均属于作者所有

欢迎您扫描下方二维码关注小黄人君的微信公众账号

二维码新

发表评论

邮箱地址不会被公开。 必填项已用*标注