Download

 

! ***************** s_kappa  ****************************

!

! +++

! Curvature analysis of surfaces

!

!

!

! Curvature analysis cases

!

! maxp:  Maximum principal curvature directions

! minp:  Minimum principal curvature directions

! gauss: Gaussian curvature

! devan: Developability analysis

!

!

! Visualization cases

!

! R*3:  On the surface (3D)

! U,V:  In the surface parameter plane (2D)

!

! 2006-04-16 Gunnar Liden

! ---

!************************************************************

 

!sdesce Curvature analysis of surfaces

 

GLOBAL GEOMETRY MODULE s_kappa  (

 

REF    s_id                     >"@t16 Select surface";

REF    c_id                     >"@t8192 Select U,V coordinate system";

STRING kcase*10:="minp"         >"Case: maxp minp gauss devan";

INT    iu_d   := 10             >"@ Step in U direction";

INT    iv_d   :=  7             >"@ Step in V direction";

STRING rflag*3:= "ALL"          >"@ Representation R*3, U,V or ALL";

FLOAT  rleng  := 70.0           >"@ Length of lines in R*3 space";

FLOAT  uleng  := 30.0           >"@ Length of lines in U,V plane";

INT    kpen   :=  2             >"@ Pen (colour) for curvature lines";

INT    upen   :=  6             >"@ Pen (colour) for U,V grid";

INT    graphic:= 1              >"@ Graphic Eq 1: Lines Eq 2: ..");

 

 

! Internal variables

 

 

CONSTANT FLOAT  lklim  = 0.00000000001;  ! Lower (zero) limit for devan

CONSTANT FLOAT  uklim  = 0.000000001;    ! Upper        limit for devan

CONSTANT FLOAT  pcrit  = 0.00000001;     ! Criterion for planar surface

CONSTANT FLOAT  kleng  = 50000000.0;     ! Length of gaussian lines

 

  INT    npatu;                  ! No patches in U direction

  INT    npatv;                  ! No patches in V direction

 

  INT    i_l;                    ! Loop index for U,V grid

 

  INT    iu;                     ! Loop index U points

  INT    iv;                     ! Loop index V points

 

  FLOAT  ustep;                  ! U step within patch 

  FLOAT  vstep;                  ! V step within patch 

 

  FLOAT  uglob;                  ! U surface global parameter

  FLOAT  vglob;                  ! V surface global parameter

 

  VECTOR uv;                     ! Vector for EVAL function

  VECTOR d_a;                    ! Vector for EVAL function

  VECTOR d_b;                    ! Vector for EVAL function

  VECTOR s_p;                    ! Surface point

  VECTOR s_n;                    ! Surface normal

  STRING ecase1*10;              ! Case 1 for EVAL

  STRING ecase2*10;              ! Case 2 for EVAL

  STRING ecase3*10;              ! Case 3 for EVAL

 

  FLOAT  pleng;                  ! Minimum length of gaussian lines

 

BEGINMODULE

 

! +++

! Algorithm

! _________

!

! ---

! 0. Initializations and checks     

!

  IF   kcase="maxp" OR

       kcase="MAXP"     THEN

     ecase1:= "UVMAX";

     ecase2:= "R3MAX";

     ecase3:= "UNDEF";

  ELIF kcase="minp" OR

       kcase="MINP"     THEN

     ecase1:= "UVMIN";

     ecase2:= "R3MIN";

     ecase3:= "UNDEF";

  ELIF kcase="devan" OR

       kcase="DEVAN"    THEN

     ecase1:= "UVMIN";

     ecase2:= "R3MIN";

     ecase3:= "KAPPAMIN";

  ELIF kcase="gauss" OR

       kcase="GAUSS"    THEN

     ecase1:= "UVMIN";

     ecase2:= "R3MIN";

     ecase3:= "GAUSSIAN";

  ELSE

    EXIT("s_kappa: kcase "+ kcase+" not implemented");

  ENDIF;

 

!+++

!    Retrieve number of patches. Calls of GETSURH.

!---

 

  GETSURH(s_id,"NPATU",npatu);

  GETSURH(s_id,"NPATV",npatv);

 

! +++

! 1. Grid of lines for UV graphical representation

!

!    Create a grid of U,V lines corresponding to the number

!    of patches in U and V direction in the XY plane of the

!    selected coordinate system.

! ---

 

IF rflag="U,V" OR rflag="u,v" OR   ! Case: rcase= U,V or ALL

   rflag="ALL" OR rflag="all" THEN !

  SET(PEN=upen);                   ! Pen (colour)

  MODE_LOCAL(c_id);                ! Activate local  system

  FOR i_l:=1 TO npatu + 1 DO       ! Start loop U lines

    LIN_FREE(#15,                  ! Create line

    VEC(100+(i_l-1)*100,100,0),    !

    VEC(100+(i_l-1)*100,           !

         100*(npatv+1),0));        !

  ENDFOR;                          ! End   loop U lines

  FOR i_l:=1 TO npatv + 1 DO       ! Start loop V lines

    LIN_FREE(#16,                  ! Create line

    VEC(100,100+(i_l-1)*100,0),    !

    VEC(100*(npatu+1),             !

         100+(i_l-1)*100,0));      !

  ENDFOR;                          ! End   loop V lines

  SET(PEN=1   );                   ! Pen (colour)

  MODE_GLOBAL();                   ! Activate global system

ENDIF;                             ! End rcase=U,V or ALL

 

! +++

! 2. Curvature calculation

!

!    Calculate curvature and create geometry (lines)

!    showing the curvature.

! ---

 

ustep := 1.0/iu_d;

vstep := 1.0/iv_d;

 

SET(PEN=kpen);

 

! Start loop U points

FOR iu:=1 TO npatu*iu_d+1 DO 

  ! Start loop V points    

  FOR iv:=1 TO npatv*iv_d+1 DO

    ! Global parameters U and V

    uglob:= (iu-1)*ustep;

    vglob:= (iv-1)*vstep;

    uv := VEC(uglob,vglob,0);

 

    ! Case: rcase= U,V or ALL

    IF rflag="U,V" OR rflag="u,v" OR rflag="ALL" OR rflag="all" THEN

       ! Calculate curvature

       d_a:= EVAL(s_id,ecase1,uv);

 

       MODE_LOCAL(c_id);

 

       ! Case: ecase3 <> UNDEF (start)

       IF ecase3 <> "UNDEF" THEN

       ! Curvature

       d_b:=EVAL(s_id,ecase3  ,uv);

        

       pleng:= kleng*d_b.x;

       ! Case: devan (start)

       IF kcase = "devan" OR kcase = "DEVAN" THEN

           IF ABS(d_b.x)<lklim THEN!

             LIN_FREE( #8,

             VEC(100+uglob*100, 100+vglob*100,0),

             VEC(100+uglob*100, 100+vglob*100,0) +

             VEC(d_a.x*uleng, d_a.y*uleng, 0));

           ENDIF;

         ! Case: Not devan

         ELSE

           IF ABS(pleng)<0.5 THEN

             pleng:= 0.5;

           ENDIF;

           LIN_FREE( #7, VEC(100+uglob*100, 100+vglob*100,0),

                         VEC(100+uglob*100, 100+vglob*100,pleng));

         ENDIF;  ! Case: devan (end)

 

       ! Case: ecase =  UNDEF (else)

       ELSE                      

         LIN_FREE( #5, VEC(100+uglob*100, 100+vglob*100,0),

         VEC(100+uglob*100, 100+vglob*100,0) +

         VEC(d_a.x*uleng, d_a.y*uleng, 0));

       ENDIF; ! Case: ecase <> UNDEF (end)

 

       MODE_GLOBAL();

    ENDIF; ! Case: rcase= U,V or ALL

 

    ! Case: rcase= R*3 or ALL

    IF rflag="R*3" OR  rflag="r*3" OR rflag="ALL" OR rflag="all" THEN

 

       ! Calculate curvature

       d_a:= EVAL(s_id,ecase2,uv);

       ! Surface point

       s_p:= EVAL(s_id,"XYZ",uv);

 

       IF ecase3 <> "UNDEF" THEN ! Case: ecase3 <> UNDEF (start)

       ! Surface normal

       s_n:=EVAL(s_id,"NORMAL",uv);

       ! Curvature

       d_b:=EVAL(s_id,ecase3  ,uv);

       pleng:= kleng*d_b.x;

 

         ! Case: devan (start)

         IF kcase = "devan" OR kcase = "DEVAN"   THEN !

           IF ABS(d_b.x)<lklim THEN

             ! Create min curve line if curvature > lklim

             LIN_FREE(#10,s_p,s_p+ rleng*d_a);

           ENDIF;

         ELSE  ! Case: Not devan

           IF ABS(pleng)<0.5 THEN

             pleng:= 0.5;

           ENDIF;

           LIN_FREE( #9,s_p, s_p +  s_n*pleng);

         ENDIF;  ! Case: devan (end)

 

       ELSE ! Case: ecase =  UNDEF (else)

         LIN_FREE( #6, s_p, s_p + rleng*d_a);

       ENDIF; ! Case: ecase <> UNDEF (end)

 

    ENDIF; ! Case: rcase= U,V or ALL

 

  ENDFOR; ! End   loop V points

ENDFOR;   ! End   loop U points

 

 

ENDMODULE

 

 

! ***************** lofted_fuselage   ****************************

!

! +++

! Create a fuselage surface with SUR_CONIC

!

! 2006-04-15 Gunnar Liden

! ---

!************************************************************

 

!sdesce Create a fuselage surface with SUR_CONIC

 

GLOBAL GEOMETRY MODULE lofted_fuselage   (

 

INT graphic:=1  >"Graphic 0: Nothing 1: Surface 2: All");

 

! Internal variables

 

CONSTANT INT sur_color = 3;

 

CONSTANT FLOAT eps = 0.5;

 

  REF spine_id;

  REF lim_1_id;

  REF lim_2_id;

  REF lim_3_id;

  REF tang_1_id;

  REF tang_2_id;

  REF tang_3_id;

  REF pcur_1_id;

  REF pcur_2_id;

 

! BLANK values for graphic

  INT bval_sur;          

  INT bval_csy;

  INT bval_cur;

  INT bval_poi;

 

 

BEGINMODULE

 

! +++

! Algorithm

! ---

 

 

! +++

! Initializations and check of input data

! ---

 

  IF graphic = 0 THEN

    bval_sur := 1;          

    bval_csy := 1; 

    bval_cur := 1; 

    bval_poi := 1; 

  ELIF graphic = 1 THEN

    bval_sur := 0;          

    bval_csy := 1; 

    bval_cur := 1; 

    bval_poi := 1; 

  ELIF graphic = 2 THEN

    bval_sur := 0;          

    bval_csy := 0; 

    bval_cur := 0;

    bval_poi := 0; 

  ELSE

    EXIT("trimmed_appr_sur: graphic not 0, 1 or 2");

  ENDIF;

 

  spine_id  := #0;

  lim_1_id  := #0;

  lim_2_id  := #0;

  lim_3_id  := #0;

  tang_1_id := #0;

  tang_2_id := #0;

  tang_3_id := #0; 

  pcur_1_id := #0;

  pcur_2_id := #0;

 

 

! Longitudinal 1  LIMIT

  CUR_CONIC(#11,"FREE",

    VEC(   0.00, 0.00,  1.00),    VEC(   0.98, 0.00,  1.20),0.5,

    VEC(5000.00, 0.00,175.00),    VEC(5001.00, 0.00,174.92),0.5,

    VEC(5500.00, 0.00,134.38),    VEC(5501.00, 0.00,134.29),0.5,

    VEC(6000.00, 0.00, 93.75),    VEC(6001.00, 0.00, 93.72),0.5,

    VEC(6560.00, 0.00, 48.00),    VEC(6561.00, 0.00, 47.92),0.5,

    VEC(8000.00, 0.00,-68.75),    VEC(8001.00, 0.00,-68.83)

                                 :BLANK=bval_cur,PEN=2);

    lim_1_id  := GLOBAL_REF(#11);

 

! Tangent curve 1  TANGENT

  CUR_CONIC(#12,"FREE",

    VEC(   0.00,180.84,  1.00),    VEC(   0.98,180.84,  1.19),0.5,

    VEC(1000.00,180.84,184.00),    VEC(1000.99,180.84,184.15),0.5,

    VEC(2000.00,180.84,300.00),    VEC(2001.00,180.84,300.04),0.5,

    VEC(4000.00,180.84,251.00),    VEC(4001.00,180.84,250.93),0.5,

    VEC(5500.00,180.84,134.38),    VEC(5501.00,180.84,134.28),0.5,

    VEC(6000.00,180.84, 93.75),    VEC(6001.00,180.84, 93.70),0.5,

    VEC(6560.00,180.84, 48.00),    VEC(6561.00,180.84, 47.92),0.5,

    VEC(8000.00,180.84,-68.75),    VEC(8001.00,180.84,-68.83)

                                 :BLANK=bval_cur,PEN=2);

    tang_1_id  := GLOBAL_REF(#12);

 

! Longitudinal 2  LIMIT

  CUR_CONIC(#13,"FREE",

    VEC(   0.00,  1.00,   0.00),    VEC(   0.92,  1.37,  -0.13),0.5,

    VEC(5000.00,762.30,-700.00),    VEC(5000.99,762.32,-700.14),0.5,

    VEC(8000.00,765.70,-947.00),    VEC(8001.00,765.68,-947.02)

                                 :BLANK=bval_cur,PEN=2);

    lim_2_id  := GLOBAL_REF(#13);

 

! Tangent curve 2  TANGENT

  CUR_CONIC(#14,"FREE",

    VEC(   0.00,  1.00, -183.08),   VEC( 0.92,    1.37, -183.21),0.5,

    VEC(5000.00,762.30, -883.08),   VEC(5000.99,762.32, -883.22),0.5,

    VEC(8000.00,765.70,-1130.08),   VEC(8001.00,765.68,-1130.10)

                                 :BLANK=bval_cur,PEN=2);

    tang_2_id  := GLOBAL_REF(#14);

 

! Longitudinal 3  LIMIT

  CUR_CONIC(#15,"FREE",

    VEC(   0.00, 0.00,-   1.00),    VEC(   0.88, 0.00,   -1.48),0.5,

    VEC(5000.00, 0.00,-1475.00),    VEC(5000.99, 0.00,-1475.15),0.5,

    VEC(7000.00, 0.00,-1632.00),    VEC(7001.00, 0.00,-1632.02),0.5,

    VEC(7500.00, 0.00,-1638.60),    VEC(7501.00, 0.00,-1638.64),0.5,

    VEC(8000.00, 0.00,-1635.00),    VEC(8001.00, 0.00,-1634.98)

                                 :BLANK=bval_cur,PEN=2);

    lim_3_id  := GLOBAL_REF(#15);

 

! Tangent curve 3  TANGENT

  CUR_CONIC(#16,"FREE",

    VEC(   0.00,-185.24,   -1.00),    VEC(   0.88,-185.24,   -1.48),0.5,

    VEC(1000.00,-185.24, -515.00),    VEC(1000.91,-185.24, -515.41),0.5,

    VEC(2000.00,-185.24, -900.00),    VEC(2000.96,-185.24, -900.27),0.5,

    VEC(4000.00,-185.24,-1319.00),    VEC(4000.99,-185.24,-1319.16),0.5,

    VEC(6000.00,-185.24,-1584.00),    VEC(6001.00,-185.24,-1584.07),0.5,

    VEC(7000.00,-185.24,-1632.00),    VEC(7001.00,-185.24,-1632.02),0.5,

    VEC(8000.00,-185.24,-1635.00),    VEC(8001.00,-185.24,-1634.98)

                                 :BLANK=bval_cur,PEN=2);

    tang_3_id  := GLOBAL_REF(#16);

 

! Spine curve

  CUR_CONIC(#17,"FREE",

    VEC(   0.00+eps, 0.00, 0.00),  VEC(8000.00-eps, 0.00, 0.00), 0.5,

    VEC(8000.00-eps, 0.00, 0.00),  VEC(   0.00+eps, 0.00, 0.00)

                                 :BLANK=bval_cur,PEN=2);

    spine_id  := GLOBAL_REF(#17);

 

 

 

!  Define P-curves. The curves must be defined in the BASIC coordinate system

 

 

  MODE_BASIC();

 

  CUR_CONIC(#18,"FREE", VEC(0,0.55,0), VEC(ARCL(spine_id), 0.45,0), 0.5,

                        VEC(ARCL(spine_id), 0.45, 0), VEC(0,0.55,0):BLANK=1);

  pcur_1_id  := GLOBAL_REF(#18);

 

  CUR_CONIC(#19,"FREE", VEC(0,0.65,0), VEC(ARCL(spine_id), 0.50,0), 0.5,

                        VEC(ARCL(spine_id), 0.50, 0), VEC(0,0.65,0):BLANK=1);

  pcur_2_id  := GLOBAL_REF(#19);

 

  MODE_GLOBAL();

 

!  Define the lofted surface

 

  SUR_CONIC( #1, spine_id, lim_1_id, tang_1_id, "P", pcur_1_id,

                           lim_2_id, tang_2_id, "P", pcur_2_id,

                           lim_3_id, tang_3_id

                           :PEN=sur_color, BLANK=bval_sur); 

 

 

ENDMODULE