February 9, 2010

Farthest 2 points on a curve

라이노스크립트를 이용하여 커브 위의 가장 먼 거리에 있는 두 점을 찾는 스크립트이다.
폐곡선 위에서 가장 먼곳에 놓인 두 점을 찾는 질문이 있었는데 Recursion방법을 이용하지 않고는 힘들 것 같아 스크립트로 작성해 보았다.







라이노스크립트를 이용하여 커브위의 가장 먼거리에 있는 두 점을 찾는 스크립트입니다.
질문이 있었는데 Recursion방법을 이용하지 않고는 힘들것 같아 스크립트를 작성해보았습니다.
더 좋은 방법들도 가능할 듯 합니다.

Option Explicit
'2010년 2월 9일 화요일
'Script written by Sanghoon Yoon @ +plastic
'Script copyrighted by +plastic

main

Public S,E

Sub main()
Dim strObject, arrDomain
strObject=Rhino.GetObject("Select closed curve",4)
If isNull(strObject) Then Exit Sub
arrDomain=Rhino.CurveDomain (strObject)
S=arrDomain(0): E=arrDomain(1)
Call MaxDev ( strObject, S,E,S,E,0)
End Sub


Function MaxDev(StrObject,S1,E1,S2,E2,DmaxOld)

Dim Stp1, Stp2, arrPt1, arrPt2, Dist, Dmax, strLine,i,j
Dim NS1,NE1,NS2,NE2
Stp1=(E1-S1)/30:Stp2=(E2-S2)/30
For i=S1 To E1 Step Stp1
arrPt1=Rhino.EvaluateCurve (strObject, i)
For j=S2 To E2 Step Stp2
arrPt2=Rhino.EvaluateCurve (strObject, j)
Dist=Rhino.Distance(arrPt1, arrPt2)
If Dist > Dmax Then
Dmax=Dist
NS1=i-Stp1:NE1=i+Stp1
NS2=j-Stp2:NE2=j+Stp2
End If
Next
Next

If Abs(Dmax-DmaxOld)<0.00001 Then
i= NS1+stp1:j= NS2+stp2
If i<S Then i=S:If j>E Then j=E
strLine=Rhino.AddLine (Rhino.EvaluateCurve (strObject,i), Rhino.EvaluateCurve (strObject, j))
Rhino.SelectObject strLine
Rhino.Print "Distance:"& Round(Rhino.CurveLength (strLine),3)
Exit Function
End If
Call MaxDev (strObject, NS1, NE1,NS2,NE2, Dmax)

End Function

No comments: