본문 바로가기
STL/stl - cutting하기

[파이썬] STL을 평면으로 자르기 #3. 속도개선 (20초 근처로 단축)

by 만다린망고 2022. 2. 5.
반응형

코드 실행속도를 개선하기 위해 for 문을 아래와 같이 수정해보았다. 

 

for i in range(ctl.n_cells-1): #교점을 찾는 for문
    p1=ctl.cell_points(i)[0]
    p2=ctl.cell_points(i)[1]
    p3=ctl.cell_points(i)[2]

    if (pl.side_point(p1)+pl.side_point(p2))*pl.side_point(p3)==2 :
        pass
    else :
        if pl.side_point(p1)*pl.side_point(p2)==-1 :
            inter_point=np.vstack((inter_point,pl.intersect_line(Line.from_points(p1,p2))))

        if pl.side_point(p1)*pl.side_point(p3)==-1 :
            inter_point=np.vstack((inter_point,pl.intersect_line(Line.from_points(p1,p3))))

        if pl.side_point(p2)*pl.side_point(p3)==-1 :
            inter_point=np.vstack((inter_point,pl.intersect_line(Line.from_points(p2,p3))))

 

아이디어는 이렇다. 만약 어느 매쉬의 세 점이 모두 평면으로 구분된 공간의 한쪽 편에 있다면 굳이 교점이 있는지 체크할 필요가 없다. 무조건 교점이 없을 것이기 때문이다. 따라서 세 점이 모두 평면 한쪽에 있는지 먼저 체크하고, 그럴 경우 pass 하도록 했다. 

 

세 점이 같은 쪽에 있는지 확인하는 방법을 설명하겠다. 세 점이 평면의 같은 쪽에 있을때 가지는 값은 아래 두가지 경우다. 

 

1 1 1

-1 -1 -1

 

앞에 둘을 더해서 나머지 하나를 곱하면 2가 나온다. 이 원리를 이용했다. 

 

소요시간은 아래와 같다. 

 

>>> print("소요시간 : %f초" % (time_end - time_start))
소요시간 : 21.837278초

>>> print("소요시간 : %f초" % (time_end - time_start))
소요시간 : 24.539013초

>>> print("소요시간 : %f초" % (time_end - time_start))
소요시간 : 24.571535초

 

줄어들긴 했지만 드라마틱한 정도는 아니다. 

 

상용프로그램에서 stl 커팅기능을 쓰면 2초도 안걸리던데, 대체 어떻게하는건지 궁금하다. 

반응형

댓글