标题: 有谁能帮我解释rhinoscript101中平面框架遇到的问题 [打印本页] 作者: 看不见的风 时间: 2013-12-6 17:07 标题: 有谁能帮我解释rhinoscript101中平面框架遇到的问题 Call WhoFramedTheSurface()
Sub WhoFramedTheSurface()
Dim idSurface : idSurface = Rhino.GetObject("Surface to frame", 8, True, True)
If IsNull(idSurface) Then Exit Sub
Dim intCount : intCount = Rhino.GetInteger("Number of iterations per direction", 20, 2)
If IsNull(intCount) Then Exit Sub
Dim uDomain : uDomain = Rhino.SurfaceDomain(idSurface, 0)
Dim vDomain : vDomain = Rhino.SurfaceDomain(idSurface, 1)
Dim uStep : uStep = (uDomain(1) - uDomain(0)) / intCount
Dim vStep : vStep = (vDomain(1) - vDomain(0)) / intCount
Dim u, v
Dim pt
Dim srfFrame
Call Rhino.EnableRedraw(False)
For u = uDomain(0) To uDomain(1) Step uStep
For v = vdomain(0) To vDomain(1) Step vStep
pt = Rhino.EvaluateSurface(idSurface, Array(u, v))
If Rhino.Distance(pt, Rhino.BrepClosestPoint(idSurface, pt)(0)) < 0.1 Then就是这一行我不明白(原文中的解释是:21 和22 行做了一些有趣的事情,但在旁边的图释上并未显现。当我们处理裁剪过的表面(trimmed surfaces)的时候,
这两行会阻止脚本在剪去的区域(cut-away areas)内添加平面。通过比较(未裁剪的)表面上的点和它们在裁剪
过的表面上的投影,我们可以知道上述的{uv}坐标是否代表着裁剪过的表面上一个真实的点。
srfFrame = Rhino.SurfaceFrame(idSurface, Array(u, v))
Call Rhino.AddPlaneSurface(srfFrame, 1.0, 1.0)
End If
Next
Next
Call Rhino.EnableRedraw(True)
End Sub作者: 794779857lock 时间: 2013-12-6 19:28 本帖最后由 794779857lock 于 2013-12-6 21:50 编辑
If Rhino.Distance(pt, Rhino.BrepClosestPoint(idSurface, pt)(0)) < 0.1 Then
这是用两点之间的距离小于0.1来判断是否点在被剪辑的曲面上
因为你要在一个曲面上找一个点,那么这个曲面可能是被裁剪过的,当你想用曲面的UV定义曲面上的一个点的时候,使用的是被裁剪过之前的曲面的UV,而根据UV值得到的曲面上的点就可能是在曲面外的,Rhino.BrepClosestPoint(idSurface, pt)是用你现在的点找到被裁剪之前的曲面上的最近点(如果没被裁剪过,可能就是重合的)。Rhino.Distance(pt, Rhino.BrepClosestPoint(idSurface, pt)(0))是用这个投影的点与原来的点的点测量距离,如果小于0.1可以被认为是重合,那么这个点就在被裁剪的曲面上(误差0.1)。
python里的说明:
BrepClosestPoint
Returns the point on a surface or polysurface that is closest to a test point. This function works on both untrimmed and trimmed surfaces.