본문 바로가기
Researches/Rhino(라이노) | Grasshopper

[Rhino | Grasshopper] 원호(arc) 아크 그리기 - 그래스호퍼 3d 파이썬 활용

by DevKev 2023. 4. 7.

 

 

 

To Do

그래스호퍼 3d 파이썬(python)을 활용한 원호(arc) 여러 개 그리기

방향 파악을 위한 벡터(vector) 가시화

 

지난 포스트에서 바운딩 박스(bounding box)를 통해 내가 만들었던 오브젝트의 정확한 크기를 파악하고자 했다. 그 과정에서 원주 방향의 각 개체의 크기를 파악해야 하는데 arc를 그려서 그 길이 파악이 필요했고 그 과정을 기록하려고 한다.

 

rhinoscriptsyntax를 rs로 불러와서 AddArcPtTanPt 메소드를 사용할 건데, 필요한 input은 세 가지:

  • 시작 점(start point)
  • 끝 점(end point)
  • 시작 점에서의 접선 벡터(tangential vector)

일단 성공적으로 내가 원하는 결과를 얻기 위해서는 원통(cylinder) 원주 방향으로 놓여있는 point들의 시작 점과 끝 점 순서를 일치시켜줘야 한다는 것. 즉, 다음과 같이 시작 점에서의 접선 벡터를 방향 반전(flip) 되는 것이 없도록 해줘야 한다.

 

consistent vector direction
[ 일정한 방향의 접선 벡터 ]

 

 

 

arc generation
[ 원호(arc) 생성 결과 ]

 

그럼 일단 필요한 작업은 설명했다. 그래스호퍼 내장 컴포넌트를 가지고는 원하는 결과를 얻기 힘들었기 때문에 GHpython으로 나만의 컴포넌트를 만들었다. 이제 코드를 어떻게 했는지 살펴보자.

 

 

 

원호 여러 개 그리기 작성 코드

파이썬 컴포넌트를 먼저 다음과 같이 작성했다. 

import rhinoscriptsyntax as rs
import scriptcontext as sc
import Rhino as rh
import GhPython as gp
import math

# 리스트 sorting 후 0번째 item 접근
def second(list):
    uni = set(list)
    sort = sorted(uni, reverse=True)
    return sort[0]

# 시작점, 끝점, 반지름을 바탕으로 벡터 분석
def makeArc(start, end, R):
    arc=[]
    vec=[]
    start_point=[]
    for i in range(len(start)):
        if start and end:
        	"""
            시작점과 끝점의 방향을 일치시켜주기 위한 벡터 외적
            """
            if rs.VectorCrossProduct(start[i], end[i])[2] < 0:
                a = end
                b = start
            else:
                a = start
                b = end
                
            V = rs.VectorCreate(a[i], b[i])
            L = rs.VectorLength(V)
            dir = V[0]
            
            """
            발생할 수 있는 각도 리스트
            - 일단 이해보다는 시작과 끝점 방향 일치 시켰으니 원하는 결과를 보여주는 item 접근
            - 위에서 작성한 second 함수 활용
            """
            ang_list = [math.degrees(math.pi-math.asin(L/(2*R))),
            math.degrees(math.asin(L/(2*R))), math.degrees(-math.asin(L/(2*R))),
            math.degrees(math.asin(L/(2*R))-math.pi)]
            
            ang = second(ang_list)
            
            d = rs.VectorRotate(V,ang,[0,0,1])
            arc.append(rs.AddArcPtTanPt(a[i], d, b[i]))
            vec.append(V)
            start_point.append(a[i])
    return arc, vec, start_point

arc, vector, anchor = makeArc(start, end, R)

 

위의 코드를 아래의 컴포넌트에 입력했다. 이 포스트 첫번째 결과 도시를 Vector Display를 통해 나타냈다.

 

 

그래스호퍼 연결
[ GHpython input과 ouput ]

 

원호(arc) 여러 개 그리기에 애먹고 있고 여러 방법을 찾고 있다면 참고하면 좋을 듯하다.

 

Tistory 첫번째 pip 블로거로서,

도움이 되셨다면? 아래 pip button을 통해 후원해 주시면 감사합니다.


 
 
 

 

https://pip.me/pipmoonbien

 

toss | PIP ME

Life, degen mode on.

www.pip.me