To Do
✅ 그래스호퍼 3d 파이썬(python)을 활용한 원호(arc) 여러 개 그리기
✅ 방향 파악을 위한 벡터(vector) 가시화
지난 포스트에서 바운딩 박스(bounding box)를 통해 내가 만들었던 오브젝트의 정확한 크기를 파악하고자 했다. 그 과정에서 원주 방향의 각 개체의 크기를 파악해야 하는데 arc를 그려서 그 길이 파악이 필요했고 그 과정을 기록하려고 한다.
rhinoscriptsyntax를 rs로 불러와서 AddArcPtTanPt 메소드를 사용할 건데, 필요한 input은 세 가지:
- 시작 점(start point)
- 끝 점(end point)
- 시작 점에서의 접선 벡터(tangential vector)
일단 성공적으로 내가 원하는 결과를 얻기 위해서는 원통(cylinder) 원주 방향으로 놓여있는 point들의 시작 점과 끝 점 순서를 일치시켜줘야 한다는 것. 즉, 다음과 같이 시작 점에서의 접선 벡터를 방향 반전(flip) 되는 것이 없도록 해줘야 한다.
그럼 일단 필요한 작업은 설명했다. 그래스호퍼 내장 컴포넌트를 가지고는 원하는 결과를 얻기 힘들었기 때문에 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를 통해 나타냈다.
원호(arc) 여러 개 그리기에 애먹고 있고 여러 방법을 찾고 있다면 참고하면 좋을 듯하다.
Tistory 첫번째 pip 블로거로서,
도움이 되셨다면? 아래 pip button을 통해 후원해 주시면 감사합니다.
'Researches > Rhino(라이노) | Grasshopper' 카테고리의 다른 글
[Rhino | Grasshopper] 파이썬을 이용한 불리언 토글(Boolean Toggle) 닉네임과 값 읽고 쓰기 (0) | 2023.04.25 |
---|---|
[Rhino | Grasshopper] 그래스호퍼 3d 파이썬 - GHpython 활용해보기 (0) | 2023.03.29 |
[Rhino | Grasshopper] 원하는 객체의 바운딩 박스(bounding box) - 그래스호퍼 활용 (2) | 2023.03.27 |