! *****************
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; !
INT
iv; !
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,"
! 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