Dynamo For Revit 教程:如何让一条直线移动到刚好越过障碍物的位置?

介绍

这是一个抽象的数学题,至于它能用哪里?我只能说非常有用,可以用在很多地方。
假设你有一条支线和一些障碍物,如何做到刚好让这条直线越过这些障碍物。暂不考虑某些极端情况,这条直线的长度比障碍物在平面上任何方向的长度都要长很多。
如图所示:
有一个方框,还有四个障碍物。
在这里插入图片描述

思路

  1. 选择一条直线,然后得到各条直线离障碍物的位置。
  2. 计算障碍物的在屏幕上包围盒的对角线,然后加上第1步得到的距离。
  3. 计算直线向着物体的移动方向。
  4. 拿出第2步中最大的那个距离,将直线按第3步的方向移动,得到一条移动后的直线。
  5. 计算第4步得到这条直线到各个障碍的距离,得到最小值,用第2步得到那个对应的最大值减去这个最小值,既可以得到想要的距离。

总图

在这里插入图片描述

要点

如何知道物体位于直线的哪一边?

现有的节点,有一个Geometry.DistanceTo,但是他只是会范围距离。我们不知道他们的相对位置关系。如果想要知道相对位置,我们需要确定一个基准的方向。人是可以用肉眼自行判断一个物体在直线的这一边或者那一边,但是计算机不行。首先要给他定义一个方向。
方向的确定

  1. 用节点Curve.TangentAtParameter 得到这条直线的方向,因为直线的每一个点的方向都是一样的。
  2. 把这个方向旋转90度,然后让直线按照这个旋转之后的方向移动一段距离。
  3. 计算原来直线与物体的距离和移动后直线与物体的距离,如果移动后距离变小,那么物体就在这个方向上;如果距离变大,那么物体就在它的反方向。
    在这里插入图片描述

如何知道多长的距离可以越过所有物体?

我们知道,可以用Geometry.DistanceTo求得物体到直线的最小距离。另外,我们也可以获取物体的包围盒,然后就可以知道这个物体在水平面的范围。不管物体时什么形状,它在任何一个方向上的范围都不会超过对角线的长度。每一个物体,将这两个值相加,然后得到他们中的最大值,那么这个值就是一个可以怨过所有物体的长度值。
在这里插入图片描述

如何让这个距离刚好?

将直线按照上面得到的方向和长度(记作D1)进行位移。计算这条新的直线和物体之间的距离,取最小值(记作D2)。那么,D1 - D2 这个长度就是这个刚好的距离。
在这里插入图片描述

效果示意图

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客BIM工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值