단방향 One-to-One 관계의 표현

두개의 User, AccessRight의 java클래스가 단방향 1:1 관계를 이룰때

class User {
   int user;
   AccessRight right;
   ….
  
}

class AccessRight {
   int rightId;
   …
}

User와 AccessRight의 매핑파일은 아래와 같다.

——————— User.hbm.xml ———————-
<?xml version=”1.0″?>
<!DOCTYPE hibernate-mapping PUBLIC
 “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
 “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd“>
<hibernate-mapping package=”dev.struts3.model” default-lazy=”false”>
  <class name=”User”>
   <id name=”user” type=”int”  unsaved-value=”null”>
    <generator class=”increment”/>
   </id>
   …  
  <many-to-one name=”right”
              column=”rightId”                     
     class=”AccessRight”
     not-null=”true”/>
  </class>
</hibernate-mapping>

——————— AccessRight.hbm.xml ———————-
<?xml version=”1.0″?>
<!DOCTYPE hibernate-mapping PUBLIC
 “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
 “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd“>
<hibernate-mapping package=”dev.struts3.model” default-lazy=”false”>
   <class name=”AccessRight”> 
   <id name=”rightId” type=”int” unsaved-value=”null”>
     <generator class=”increment”/>
   </id>  
   …..
   </class> 
</hibernate-mapping>

User.hbm.xml에 다음절에 의해 User테이블에 rightId가 필드가 AccessRight의 rightId를 외래키로 지정된다.
<many-to-one name=”right” column=”rightId”  class=”AccessRight”  not-null=”true”/>

 

Velocity 엔진 사용하기







 – velocity는 동적문서 생성, 동적 서블릿등에 사용할 수 있는 프레임 워크 임.



 jakarta 프로젝트에 포함되어 있는 velocity를 사용하기.



  try {
    
      Velocity.init(“velocity.properties”);          
     
  }catch(Exception e){


         e.printStackTrace();


  }
           
  VelocityContext context = new VelocityContext();
  context.put(“survey”, new Survey());        
  Template template =  null;
 


   try {


      template = Velocity.getTemplate(“template/survey.vm”, “EUC-KR”);
   } catch( Exception rnfe ){


      rnfe.printStackTrace();


   BufferedWriter writer = new BufferedWriter(out);


   try{
        if ( template != null)
            template.merge(context, writer);      
   }catch(Exception e){


        e.printStackTrace();


   }



  1. 위와 같은 형태로 사용된다.


  2. velocity.properties 파일을 적어준다.


    < 로그파일, 인코딩, 리소스로더등등이 포함된다. >



예제)velocity.properties 파일


runtime.log = velocity.log
output.ENCODING = EUC-KR
input.ENCODING = EUC-KR
resource.loader = file


file.resource.loader.description = Velocity File Resource Loader
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.path = .


file.resource.loader.cache = false
file.resource.loader.modificationCheckInterval = 2


  주의) 리소스로더에대해 반드시 하나는 기술해줘야 한다. 리소스 로더 패스가 기술되지 않으면 getTemplate같은 리소스 관련 메소드를 실행시 에러가 남



ACIS에서 인식되는 Feature


  • Holes (cylindrical, conical, spherical and toroidal): Holes that are split along or across axis due to interaction with other features are recognized as a single hole only if they are completely overlapping along their axis. Partial overlap holes are not recognized as a single hole feature. Filleted holes are recognized as toroidal holes and not as a hole and a fillet. Partial spherical holes where the angle of wrap is less than 360 are not recognized. If a spherical hole is cut, it is recognized only if the cut is normal to the axis. Partial holes and bosses are not supported.
  • Chamfers
  • Blends (constant radius and variable radius): Constant radius as well as variable radius blends are supported. Blend chains are recognized as single features.
    위에 해당되는 피처만 디피처링된다.

    ACIS의 디피처링 기능은 다음과 같은 제한이 있다.


    • The bodies passed into the defeaturing API must be manifold.
    • Although the defeaturing API recognizes blends whose faces have been split, currently these blends cannot be removed. Refer to the following figure for an example of a blend with a split face.

  • Plane vs Plane 교차직선구하기

    평면 vs 평면의 교차직선구하는 방법은 간단하다..

    두평면의 노멀을 구한뒤 CrossProduct 방향으로 직선의 디렉션을 구할 수 있다.

    문제는 Origin ..

    두개의 평면의 P1과 P2라 하면 P1의 평면 방정식

    a1x + b1y + c1z = d1

    P2의 평면 방정식

    a2x + b2y + c2z = d2

    P1과 P2에 수직인 평면 P3라 하면

    a3x + b3y + c3z = d3

    세개의 삼원일차 방정식을 풀면 Origin P(x,y,z)를 구할수 있다.

    3개의 평면의 교점은 반드시 존재하므로 Matrix로 푼다.

    교차선 L(t)에 대해
    L(t) = t*Cross(N0,N1)/|Cross(N0,N1)| + c0*N0 + c1*N1
    이므로
    d0 = Dot(N0,L) = c0*Dot(N0,N0) + c1*Dot(N0,N1) = c0 + c1*d
    d1 = Dot(N1,L) = c0*Dot(N0,N1) + c1*Dot(N1,N1) = c0*d + c1
    c0와 c1은 다음과 같이 구해진다..
    c0 = (d0 – d*d1)/det
    c1 = (d1 – d*d0)/det
    det = 1 – d^2.

    솔리드 모델 정의

    솔리드는 다음과 같은 성질을 만족하여야 한다.

    1. 경계성 : 경계가 솔리드의 내부를 제한하고 포함하여야 한다.


    2. 등질 3차원성 : 매달린 모서리나 면이 없어서 경계는 항상 솔리드의 내부와 접촉하고 있어야 한다.


    3. 유한성 : 솔리드는 크기가 무한하지 않고 제한된 양의 정보에 의해서 표현가능해야 한다.


     bounded, reqular, semianalytic

    NURBS, Hermit, Bezier

    Hermit 곡선방정식

    CAD 시스템에서 사용되는 곡선 방정식으로 가장 많이 사용되는 것은 삼차식이다. 왜냐하면 두 개의 곡선을 연결하여 복잡한 형태의 곡선을 만들 때, 양쪽 곡선이 모두 삼차식이면 연결점에서 이차 미분까지 연속하게 구속 조건을 줄 수 있으므로 곡률의 연속을 보장할 수 있기 때문이다. 물론 삼차식 이상이기만 하면 곡률의 연속을 보장할 수 있지만, 차수가 높아지면 계산 시간이 오래 걸리고 또 곡선의 형상이 미세한 진동을 보이는 단점이 발생하므로 삼차식 이상은 잘 사용하지 않는다. 삼차식의 곡선을 매개 변수 u를 이용하여 나타내면 상식적으로 아래와 같은 형태를 생각할 수 있을 것이다.

    P(u)=[x(u) y(u) z(u)]=a0+a1u+a2u2+a3u3 (0
    위식에서 a0,a1,a2,a3는 벡터 계수로서 각각 x,y,z요소를 갖는 열벡터(row vector)이다. 이 식은 a0,a1,a2,a3 와 같은 계수를 변화시킬 때 곡선의 형태가 어떻게 변화할 지를 미리 예측하기 어려운 단점이 있다. 이러한 문제를 극복하기 위해 a0,a1,a2,a3를 P0,P1,P’0,P’1으로 대체한다. 여기서 P0,P1은 곡선의 양 끝점이고 P’0,P’1은 양 끝점에서의 접선 벡터이다. 앞의 P0,P1,P’0,P’1의 정의로부터 다음과 같은 네 개의 경계 조건식을 유도할 수 있다.

    P0=P(0)=a0

    P1=P(1)=a0+a1+a2+a3

    P’0=P'(0)=a1

    P’1=P'(1)=a1+2a2+3a3

    식을 풀어서 a0,a1,a2,a3를 P0,P1,P’0,P’1으로 표시하고 원래식에 대입하면 아래와 같이 곡선식을 P0,P1,P’0,P’1으로 나타낼 수 있다.

    P(u)=[1-3u2+2u3 3u2-2u3 u-2u2+u3 -u2+u3][P0,P1,P’0,P’1] 행벡터×열벡터

    a0,a1,a2,a3와 같은 대수계수(algebraic coefficient)를 곡선의 형상과 밀접한 관계를 갖는 P0,P1,P’0,P’1과 같은 기하계수(geometric coefficient)로 바꾸어서 나타낸 것을 Hermit곡선식이라 하고 P0,P1,P’0,P’1은 다음의 각각의 함수에 의해 결정되는 영향력으로 각각 곡선의 형상을 결정한다. 따라서 이들 함수를 블랜딩 함수(blending function)이라 한다.

    f1(u)=1-3u2+2u3

    f2(u)=3u2-2u3

    f3(u)=u-2u2+u3

    f4(u)=-u2+u3

    Bezier곡선 방정식

    Hermit 곡선식의 형태가 일반 대수식으로 표시된 형태보다는 P0,P1,P’0,P’1을 변화시켜 가면서 원하는 형상의 곡선을 생성시켜 나가는 데는 다소 진전된 형태이나, 여전히 원하는 형상을 자유자재로 생성시키는 데는 적절하다고 보기 어렵다. 왜냐하면 P’0,P’1의 크기 변화에 의한 곡선 형상의 변화가 일반인들의 직관과 완전히 일치한다고 보기 어렵기 때문이다. 이에 따라 프랑스 Renault 자동차 회사의 Bezier는 1960년대 초 일반인들의 직관과 부합되는 곡선 방정식의 형태로, 생성하고자 하는 Bezier곡선을 제안하였다. Hermit곡선에서 의 P0,P1,P’0,P’1영향을 각각 해당되는 블렌딩 함수로 섞어서 곡선을 형성하듯이 Bezier곡선에서는 이들 다각형 꼭지점들의 영향을 각각 해당되는 블렌딩 함수로 섞어서 곡선을 형성한다. 이때 블렌딩 함수는 다음의 성질을 만족하도록 선택하였다.

    첫째, 생성되는 곡선은 다각형의 시작점과 끝점을 반드시 통과하여야 한다.

    둘째, 다각형의 첫째 선분은 시작점에서의 접선 벡터와 같은 방향이고 마지막 선분은 끝점에서의 접선 벡터와 같은 방향이어야 한다.

    셋째, 앞에서 곡선의 양끝에서의 1차 미분이 두 개의 꼭지점에 의해 결정되는 성질의 확장으로서 시작점이나 끝점에서의 n번 미분값은 그 점을 포함하여 인접한 (n+1)개의 꼭지점에 의해 결정되어야 한다. 이성질은 두 개의 서로 다른 곡선을 접속시킬 때, 연결점에서 임의의 미분까지 연속을 보장하는데 이용될수 있다.

    넷째, 다각형의 꼭지점의 순서를 거꾸로 하여 곡선을 생성하여도 같은 곡선이 생성되어야 한다.

    이상의 조건을 만족시키는 블렌딩 함수로서 Bezier는 아래와 같이 정의되는 Bernstein 다항식을 블렌딩 함수로 사용하였다.

    Bi,n(u)=nCiui(1-u)n-i 여기서 nCi=n!/i!(n-i)! 이다. 이 블렌딩 함수를 다각형의 꼭지점에 적용하면 Bezier곡선 방정식은 아래와 같이 얻어진다.

    P(u)=∑nCiui(1-u)n-iPi (0
    여기서 Pi는 다각형의 꼭지점으로서 조정점(control point)이라 하고 이에 따라 이들 꼭지점으로 이루어진 다각형도 조정다각형(control polygon)이라 부른다. Bezier 곡선의 또 하나 중요한 성질로 볼록껍질(convex hull)성질이 있다. 볼록껍질 성질이란 주어진 조정점에 의해 정의된 Bezier 곡선은 항상 그 조정점들에 의해 결정되는 블록껍질안에 존재한다는 것이다. 이 성질은 Bezier 곡선의 정의에 사용된 블렌딩함수가 임의의 u값에서 모두 0과 1사이면서 그 합이 1이 되기 때문에 성립한다. 볼록껍질 성질은 두 Bezier 곡선간에 교차점을 구할 때 매우 유용하게 사용되는데, 그 이유는 두 개의 곡선에 해당되는 볼록껍질간의 교차 여부를 간단히 검사하여 그들간에 겹치는 영역이 없으면 두 곡선간의 교차점 계산을 안해도 되기 때문이다.

    B-spline 방정식

    Bezier곡선에서는 조정점의 개수와 곡선식의 차수가 직결되어 있고 실제로 모든 조정점이 곡선의 형상에 영향을 주게끔 되어 있다. 이 경우 다음과 같은 두가지 단점을 수반하게 된다. 첫째는 복잡한 형상의 곡선을 생성하기 위해서는 필연적으로 많은 조정점을 사용하게 되는데 이 경우 곡선식의 차수도 같이 올라가게 되어 계산량 증가는 물론 곡선 형상의 진동 등의 문제를 야기하게 된다. 물론 곡선의 각 부분을 별개의 Bezier곡선으로 표시하고 이들을 합성하는 방법을 채택할 수 있으나, 이들 곡선의 연결점에서 1차 미분값, 2차 미분값 등의 연속을 보장하면서 연결하는 일이 매우 번거로운 어려움이 있다. 둘째는 모든 조정점이 곡선의 형상에 영향을 주므로 곡선의 어느 일부분의 형상을 변형시키기 위해 그 부분의 조정점의 위치를 변동하여 해당 부위를 원하는 형상대로 변화시킬 때 이와 병행하여 곡선의 나머지 부분도 예상치 않게 변화시키는 문제가 발생한다. 이를 광범위 변형(global modification)이라 하는데 곡선의 설계에 있어서는 이와 반대 성질인 국소적 변형(local modification)기능이 필수적이라 하겠다. 위에 언급한 두 가지 문제점은 Bezier곡선에서 사용된 블렌딩 함수의 성질에서 유래한 것이라 할 수 있다. 따라서 새로운 블렌딩 함수는 다음과 같은 성질을 갖도록 선택되어야 한다. 첫째, Bezier곡선의 Bi,n(u)와는 달리 조정점의 개수와 관련된 n을 포함하지 않고, 원하는 차수를 직접 지정할 수 있어야 한다. 둘째, 모든 블렌딩 함수는 매개 변수 u의 전체 범위 중 각각 서로 다른 일정 범위에서만 값을 갖도록 하여, 매개 변수의 일정 범위에 해당되는 곡선 부위에서는 그 범위에서 0이 안되는 블렌딩 함수와 짝이 되는 한정된 개수의 조정점들만 형상에 영향을 줄 수 있어야 한다. 위에 언급한 조건을 만족시키는 블렌딩 함수로서 de Boor, Cox등에 의해 다음 점화식을 만족시키는 Ni,k(u)가 제안되었고, 이 를 B-spline곡선이라 한다.

    NURBS 방정식

    NURBS 방정식이란 Non-Uniform Rational B-Spline 방정식을 의미하는데 B-spline 곡선에서 매듭값의 간격이 일정치 않을 때 유도되는 non-uniform B-spline 함수를 블렌딩 함수로 사용한다는 점에서는 비균일 B-spline 곡선과 다른점이 없다. 그러나 비균일 B-spline 곡선에서는 조정점의 x,y,z 좌표를 각각 이들 블렌딩 함수로 섞어주면 되지만, NURBS 곡선에서는 조정점을 호모지니어스 좌표계를 사용하여 각각을 (xihi, yihi zihi hi)의 형태로 표시하고 이들 네 개의 좌표를 블렌딩 함수로 섞어 주도록 한다. NURBS 곡선식은 일반적인 B-spline 곡선식을 포함하는 더 일반적인 형태라고 할 수 있다. NURBS 곡선은 일반적인 B-spline 곡선에 비해 다음과 같은 장점을 갖는다.

    첫째, 일반적인 B-spline 곡선에서는 곡선의 모양을 변화시키기 위해 각각의 조정점에서 x,y,z 세 좌표를 조절하는 세 개의 자유도가 허용하나, NURBS 곡선에서는 각각의 조정점에서 호모지니어스 좌표값까지 포함하여 네 개의 자유도가 허용된다. 따라서 곡선의 보다 자유로운 변형이 가능하다. 실제로 호모지니어스 좌표값을 증가시키면 곡선을 해당 조정점 쪽으로 끌어 당기는 효과가 있다.

    둘째, 일반적인 B-spline 방정식으로는 원, 타원, 포물선, 쌍곡선 등 원추 곡선을 근사하게 밖에 나타내지 못하지만, NURBS 곡선은 이들 곡선을 정확하게 표시할 수 있다. 따라서 NURBS 곡선은 자유 곡선은 물론 원추 곡선까지 한 방정식의 형태로 나타내게 하므로 프로그램 개발시 그 작업량을 줄여 준다. 예를 들어 곡선과 곡선의 교차점을 계산하는 프로그램을 개발하는 경우, 원호와 원호, 원호와 자유곡선, 원호와 포물선 등 모든 가능한 경우에 해당하는 교차점을 계산하는 프로그램을 만드는 대신, 이들 원추 곡선을 NURBS 방정식으로 표시 한다면 NURBS 곡선과 NURBS 곡선의 교차점을 계산하는 프로그램 하나로 해결할 수 있을 것이다.

    참고문헌 : “컴퓨터그래픽과 CAD” 이건우 저

    *출처: 성창귀 홈페이지