상세 컨텐츠

본문 제목

hFormula 노드의 formula 입력창 진행과정

Maya_Plugin_Development /hConnect

by hwano 2014. 4. 15. 14:34

본문

 

 

formula 창에 들어온 숫자들을 하나씩 쪼개서 모두 더한 후 출력

 

 

vector를 연습하는 겸 작업 해보자

formula창에 숫자들을 '487951' 이런식으로 넣으면

하나씩 쪼개서 vector의 원소로 하나씩 집어넣자.

 

그런 다음 다시 하나씩 불러내서  4+8+7+9+5+1 의 결과를 출력해보자. 

 

 

 

사칙연산을 기준으로 숫자를 나눠 집어넣고,  사칙연산을 실행해보자

 

  

먼저 한자리씩 앞에서부터 string을 검사해 가다가 사칙연산이 나오면 stop한다.

사칙연산이 나오기 전까지의 숫자들을 자리수를 곱한 후 더해서 하나의 숫자로 만든다.

 

이후 사칙연산 실행

 

예시로 수식  

A-BXC/D-E/F    

을 이용해서 알고리즘을 생각해보면

 

 

 

 

이런 식이 되겠다. 

 

리스트를 하나 만들어서 숫자와 연산자들을 차례대로 노드들에 집어넣는다.

연산자들에게는 우선순위를 부여한다.

곱하기 나누기를 1순위로 놓고 플러스 마이너스를 2순위로 설정한다.

 

리스트의 앞에서부터 차례대로 검색해가면서 1순위먼저 계산을 끝낸다.

위의 그림에서 B X C를 가장 먼저 하게 될건데 노드 3,4,5를 계산하는게 된다.

노드 4번에서 1순위인 곱하기 연산자를 발견하게 된고 그 앞뒤의 숫자들을 곱해준다.

 

그런다음 3,4,5의 노드들을 하나로 묶어 결과값을 뽑아내어 노드3에 넣고 노드4,5는 삭제해준다.

이런식으로 1순위 2순위를 앞에서부터 차례대로 계산해 보면 자연스레 결과값을 얻을 수 있다.

 

 

 

 

 

 

정해진 규칙에서 벗어날 때 오류메세지를 뱉어줄 시스템 만들것.

 

 

원시적이지만 우선 만들었고,,

 

 

 

소괄호()가 먹도록 수정해 보자.

 

 

너무 복잡해지지 않도록 괄호용 우선순위를 하나 더 추가하자.

괄호 안에 괄호가 들어가는 중복 괄호의 경우     ex.  ((  )+(   )) 

 

괄호가 열릴 때 마다 우선순위=0 를 1씩 증가 시킨 다음 닫힐 때 1씩 감소 시키면

괄호의 짝이 맞지않는 에러가 나는 부분을 잡아 낼 수 있다. ( 완벽히는 아니겠지만,, )

 

 

 

 

기타 수학기호들과 변수가 작동하도록 수정해 보자.

 

 

꼭 들어가야 할 수학기호들은 sin, cos, tan, pi, sqrt, pow 등..

( 역함수나 %나머지 등은 나중에 필요할 때 추가 하자 )

 

텍스트를 읽어들이는 알고리즘으로 정해진 inValue[]변수는 작동을 하지만

문제는 수학기호들이다.

 

현재 적용할 수학기호는 정확히 분류하면 수학기호인 PI를 제외하고는

전부 소괄호와 묶여있는 sin(), cos(), tan() 이런식의 수학 함수들이다.

 

 

현재 계산을 위한 m_expression의 노드 구조는

operator가 있을 경우 앞뒤 노드의 float값을 가져와 operator에 맞는 연산을 진행한다.

 

 

여기에 중간에 수학함수가 들어갈 경우 노드의 순서는 아래와 같이 바뀌게 된다.

 

 

수학함수의 () 소괄호들도 일반 소괄호들과 똑같이 취급한다면

sin(  (A + B) * C / D )

사인함수안에 있는 ABCD 연산들의 parentPriority가 더 높기 때문에 괄호안의 연산은 자연스레 먼저 계산이 되어

sin( float )로 정리가 된다.

 

따라서 hEval::calculate()함수의 계산의 순서를 정리해 보면

 

 

이렇게 된다.

 

...  아.  pow는 인자가 두개구나..

 

 

 

 

 

속도 테스트

 

 

pow 적용은 우선 무시하고

 

2014/01/16 - 현재 상태에서 간단한 속도테스트

 

위 페이지에 있는 [[math.sin( inValue[0]/math.cos( inValue[0]) ) * 20]]

공식을 현재 노드로 다시 속도테스트를 해봤다.   

 

현재 128개로 복사했을 때 평균적으로 34fps 정도가 나온다.   기대했던거에 많이 못 미친다.

알고리즘이 쓸데없이 복잡한가?  계산이 복잡한 곳도 없는데 왜 이렇게 무거울까

 

 

 

 

 

 

 

관련글 더보기