|
FUNCTION enclose_pregion_in_pregion (prgn : polar_complex_number_region, centre : complex_number_literal) : polar_complex_number_region; FUNCTION angle ( a : REAL ) : REAL ; REPEAT WHILE a > PI ; a := a - 2.0 * PI ; END_REPEAT ; REPEAT WHILE a <= - PI ; a := a + 2.0 * PI ; END_REPEAT ; RETURN ( a ) ; END_FUNCTION ; PROCEDURE angle_range ( VAR amin , amax : REAL ) ; amin := angle ( amin ) ; IF amin = PI THEN amin := - PI ; END_IF ; amax := angle ( amax ) ; IF amax <= amin THEN amax := amax + 2.0 * PI ; END_IF ; END_PROCEDURE ; FUNCTION strictly_in ( a : REAL ; aitv : finite_real_interval ) : LOGICAL ; a := angle ( a ) ; RETURN ( { aitv . min < a < aitv . max } OR { aitv . min < a + 2.0 * PI < aitv . max } ) ; END_FUNCTION ; PROCEDURE find_aminmax ( ab , a0 , a1 , a2 , a3 : REAL ; in0 , in1 , in2 , in3 : BOOLEAN ; VAR amin , amax : REAL ; VAR amin_in , amax_in : BOOLEAN ) ; LOCAL a : REAL ; END_LOCAL ; amin := angle ( a0 - ab ) ; amin_in := in0 ; amax := amin ; amax_in := in0 ; a := angle ( a1 - ab ) ; IF a = amin THEN amin_in := amin_in OR in1 ; END_IF ; IF a < amin THEN amin := a ; amin_in := in1 ; END_IF ; IF a = amax THEN amax_in := amax_in OR in1 ; END_IF ; IF a > amax THEN amax := a ; amax_in := in1 ; END_IF ; a := angle ( a2 - ab ) ; IF a = amin THEN amin_in := amin_in OR in2 ; END_IF ; IF a < amin THEN amin := a ; amin_in := in2 ; END_IF ; IF a = amax THEN amax_in := amax_in OR in2 ; END_IF ; IF a > amax THEN amax := a ; amax_in := in2 ; END_IF ; a := angle ( a3 - ab ) ; IF a = amin THEN amin_in := amin_in OR in3 ; END_IF ; IF a < amin THEN amin := a ; amin_in := in3 ; END_IF ; IF a = amax THEN amax_in := amax_in OR in3 ; END_IF ; IF a > amax THEN amax := a ; amax_in := in3 ; END_IF ; amin := amin + ab ; amax := amax + ab ; angle_range ( amin , amax ) ; END_PROCEDURE ; LOCAL ritp , ritv : real_interval ; aitp , aitv : finite_real_interval ; xp , yp , xc , yc , rmax , rmin , amin , amax , rc , acp , apc : REAL := 0.0 ; rmax_in , rmin_in , amin_in , amax_in : BOOLEAN := FALSE ; rmxp , rmnp , x , y , r , a , ab , r0 , a0 , r1 , a1 , r2 , a2 , r3 , a3 : REAL := 0.0 ; in0 , in1 , in2 , in3 , inn : BOOLEAN := FALSE ; minclo , maxclo : open_closed := open ; END_LOCAL ; IF NOT EXISTS ( prgn ) OR NOT EXISTS ( centre ) THEN RETURN ( ? ) ; END_IF ; xp := prgn . centre . real_part ; yp := prgn . centre . imag_part ; ritp := prgn . distance_constraint ; aitp := prgn . direction_constraint ; xc := centre . real_part ; yc := centre . imag_part ; IF ( xc = xp ) AND ( yc = yp ) THEN RETURN ( prgn ) ; END_IF ; rc := SQRT ( ( xp - xc ) ** 2 + ( yp - yc ) ** 2 ) ; acp := atan2 ( yp - yc , xp - xc ) ; apc := atan2 ( yc - yp , xc - xp ) ; rmnp := real_min ( ritp ) ; IF max_exists ( ritp ) THEN rmxp := real_max ( ritp ) ; IF aitp . max - aitp . min = 2.0 * PI THEN inn := NOT max_included ( aitp ) ; a := angle ( aitp . min ) ; rmax := rc + rmxp ; rmax_in := max_included ( ritp ) ; IF inn AND ( acp = a ) THEN rmax_in := FALSE ; END_IF ; IF rc > rmxp THEN a0 := ASIN ( rmxp / rc ) ; amin := angle ( acp - a0 ) ; amin_in := max_included ( ritp ) ; IF amin = PI THEN amin := - PI ; END_IF ; amax := angle ( acp + a0 ) ; amax_in := amin_in ; IF amax < amin THEN amax := amax + 2.0 * PI ; END_IF ; rmin := rc - rmxp ; rmin_in := amin_in ; IF inn THEN IF apc = a THEN rmin_in := FALSE ; END_IF ; IF angle ( amin + 0.5 * PI ) = a THEN amin_in := FALSE ; END_IF ; IF angle ( amax - 0.5 * PI ) = a THEN amax_in := FALSE ; END_IF ; END_IF ; ELSE IF rc = rmxp THEN amin := angle ( acp - 0.5 * PI ) ; amin_in := FALSE ; IF amin = PI THEN amin := - PI ; END_IF ; amax := angle ( acp + 0.5 * PI ) ; amax_in := FALSE ; IF amax < amin THEN amax := amax + 2.0 * PI ; END_IF ; rmin := 0.0 ; rmin_in := max_included ( ritp ) ; IF inn AND ( apc = a ) THEN rmin_in := FALSE ; END_IF ; ELSE IF rc > rmnp THEN IF inn AND ( apc = a ) THEN rmin := 0.0 ; rmin_in := FALSE ; amin := aitp . min ; amin_in := FALSE ; amax := aitp . max ; amax_in := FALSE ; ELSE rmin := 0.0 ; rmin_in := TRUE ; amin := - PI ; amin_in := FALSE ; amax := PI ; amax_in := TRUE ; END_IF ; ELSE rmin := rmnp - rc ; rmin_in := min_included ( ritp ) ; amin := - PI ; amin_in := FALSE ; amax := PI ; amax_in := TRUE ; IF inn THEN IF apc = a THEN rmin_in := FALSE ; amin := aitp . min ; amin_in := FALSE ; amax := aitp . max ; amax_in := FALSE ; ELSE IF acp = a THEN amin := aitp . min ; amin_in := FALSE ; amax := aitp . max ; amax_in := FALSE ; END_IF ; END_IF ; END_IF ; END_IF ; END_IF ; END_IF ; ELSE x := xp + rmxp * COS ( aitp . min ) - xc ; y := yp + rmxp * SIN ( aitp . min ) - yc ; r0 := SQRT ( x ** 2 + y ** 2 ) ; in0 := max_included ( ritp ) AND min_included ( aitp ) ; IF r0 <> 0.0 THEN a0 := atan2 ( y , x ) ; END_IF ; x := xp + rmxp * COS ( aitp . max ) - xc ; y := yp + rmxp * SIN ( aitp . max ) - yc ; r1 := SQRT ( x ** 2 + y ** 2 ) ; in1 := max_included ( ritp ) AND max_included ( aitp ) ; IF r1 <> 0.0 THEN a1 := atan2 ( y , x ) ; END_IF ; x := xp + rmnp * COS ( aitp . max ) - xc ; y := yp + rmnp * SIN ( aitp . max ) - yc ; r2 := SQRT ( x ** 2 + y ** 2 ) ; in2 := min_included ( ritp ) AND max_included ( aitp ) ; IF r2 <> 0.0 THEN a2 := atan2 ( y , x ) ; ELSE a2 := a1 ; in2 := in1 ; END_IF ; IF r1 = 0.0 THEN a1 := a2 ; in1 := in2 ; END_IF ; x := xp + rmnp * COS ( aitp . min ) - xc ; y := yp + rmnp * SIN ( aitp . min ) - yc ; r3 := SQRT ( x ** 2 + y ** 2 ) ; in3 := min_included ( ritp ) AND min_included ( aitp ) ; IF r3 <> 0.0 THEN a3 := atan2 ( y , x ) ; ELSE a3 := a0 ; in3 := in0 ; END_IF ; IF r0 = 0.0 THEN a0 := a3 ; in0 := in3 ; END_IF ; IF rmnp = 0.0 THEN in2 := min_included ( ritp ) ; in3 := in2 ; END_IF ; IF ( apc = angle ( aitp . min ) ) OR ( acp = angle ( aitp . min ) ) THEN in0 := min_included ( aitp ) ; in3 := in0 ; ELSE IF ( apc = angle ( aitp . max ) ) OR ( acp = angle ( aitp . max ) ) THEN in1 := max_included ( aitp ) ; in2 := in1 ; END_IF ; END_IF ; IF strictly_in ( acp , aitp ) THEN rmax := rc + rmxp ; rmax_in := max_included ( ritp ) ; ELSE rmax := r0 ; rmax_in := in0 ; IF rmax = r1 THEN rmax_in := rmax_in OR in1 ; END_IF ; IF rmax < r1 THEN rmax := r1 ; rmax_in := in1 ; END_IF ; IF rmax = r2 THEN rmax_in := rmax_in OR in2 ; END_IF ; IF rmax < r2 THEN rmax := r2 ; rmax_in := in2 ; END_IF ; IF rmax = r3 THEN rmax_in := rmax_in OR in3 ; END_IF ; IF rmax < r3 THEN rmax := r3 ; rmax_in := in3 ; END_IF ; END_IF ; IF strictly_in ( apc , aitp ) THEN IF rc >= rmxp THEN rmin := rc - rmxp ; rmin_in := max_included ( ritp ) ; ELSE IF rc <= rmnp THEN rmin := rmnp - rc ; rmin_in := min_included ( ritp ) ; ELSE rmin := 0.0 ; rmin_in := TRUE ; END_IF ; END_IF ; ELSE rmin := r0 ; rmin_in := in0 ; a := apc - aitp . min ; r := rc * COS ( a ) ; IF { rmnp < r < rmxp } THEN rmin := rc * SIN ( ABS ( a ) ) ; rmin_in := min_included ( aitp ) ; END_IF ; a := apc - aitp . max ; r := rc * COS ( a ) ; IF { rmnp < r < rmxp } THEN r := rc * SIN ( ABS ( a ) ) ; inn := max_included ( aitp ) ; IF r = rmin THEN rmin_in := rmin_in OR inn ; END_IF ; IF r < rmin THEN rmin := r ; rmin_in := inn ; END_IF ; END_IF ; IF r1 = rmin THEN rmin_in := rmin_in OR in1 ; END_IF ; IF r1 < rmin THEN rmin := r1 ; rmin_in := in1 ; END_IF ; IF r2 = rmin THEN rmin_in := rmin_in OR in2 ; END_IF ; IF r2 < rmin THEN rmin := r2 ; rmin_in := in2 ; END_IF ; IF r3 = rmin THEN rmin_in := rmin_in OR in3 ; END_IF ; IF r3 < rmin THEN rmin := r3 ; rmin_in := in3 ; END_IF ; END_IF ; IF rc >= rmxp THEN ab := acp ; find_aminmax ( ab , a0 , a1 , a2 , a3 , in0 , in1 , in2 , in3 , amin , amax , amin_in , amax_in ) ; a := ACOS ( rmxp / rc ) ; IF strictly_in ( apc - a , aitp ) THEN amin := ab - ASIN ( rmxp / rc ) ; amin_in := max_included ( ritp ) ; END_IF ; IF strictly_in ( apc + a , aitp ) THEN amax := ab + ASIN ( rmxp / rc ) ; amax_in := max_included ( ritp ) ; END_IF ; angle_range ( amin , amax ) ; ELSE IF rc > rmnp THEN ab := angle ( 0.5 * ( aitp . min + aitp . max ) ) ; find_aminmax ( ab , a0 , a1 , a2 , a3 , in0 , in1 , in2 , in3 , amin , amax , amin_in , amax_in ) ; ELSE ab := angle ( 0.5 * ( aitp . min + aitp . max ) ) ; a0 := angle ( a0 - ab ) ; a1 := angle ( a1 - ab ) ; a2 := angle ( a2 - ab ) ; a3 := angle ( a3 - ab ) ; IF a3 > a2 THEN a2 := a2 + 2.0 * PI ; END_IF ; IF a0 > a1 THEN a0 := a0 + 2.0 * PI ; END_IF ; IF a3 < a0 THEN amin := a3 ; amin_in := in3 ; ELSE amin := a0 ; amin_in := in0 ; END_IF ; IF a2 > a1 THEN amax := a2 ; amax_in := in2 ; ELSE amax := a1 ; amax_in := in1 ; END_IF ; IF ( amax - amin > 2.0 * PI ) OR ( ( amax - amin = 2.0 * PI ) AND ( amin_in OR amax_in ) ) THEN amin := - PI ; amin_in := FALSE ; amax := PI ; amax_in := TRUE ; ELSE amin := amin + ab ; amax := amax + ab ; angle_range ( amin , amax ) ; END_IF ; END_IF ; END_IF ; END_IF ; IF rmin_in THEN minclo := closed ; END_IF ; IF rmax_in THEN maxclo := closed ; END_IF ; ritv := make_finite_real_interval ( rmin , minclo , rmax , maxclo ) ; ELSE IF ( rc > rmnp ) AND strictly_in ( apc , aitp ) THEN RETURN ( ? ) ; END_IF ; IF aitp . max - aitp . min = 2.0 * PI THEN a := angle ( aitp . min ) ; IF rc > rmnp THEN IF max_included ( aitp ) THEN RETURN ( ? ) ; END_IF ; rmin := 0.0 ; rmin_in := FALSE ; amin := aitp . min ; amin_in := FALSE ; amax := aitp . max ; amax_in := FALSE ; ELSE rmin := rmnp - rc ; rmin_in := min_included ( ritp ) ; amin := - PI ; amin_in := FALSE ; amax := PI ; amax_in := TRUE ; IF NOT max_included ( aitp ) THEN IF apc = a THEN rmin_in := FALSE ; amin := aitp . min ; amin_in := FALSE ; amax := aitp . max ; amax_in := FALSE ; ELSE IF acp = a THEN amin := aitp . min ; amin_in := FALSE ; amax := aitp . max ; amax_in := FALSE ; END_IF ; END_IF ; END_IF ; END_IF ; ELSE a0 := angle ( aitp . min ) ; in0 := FALSE ; a1 := angle ( aitp . max ) ; in1 := FALSE ; x := xp + rmnp * COS ( aitp . max ) - xc ; y := yp + rmnp * SIN ( aitp . max ) - yc ; r2 := SQRT ( x ** 2 + y ** 2 ) ; in2 := min_included ( ritp ) AND max_included ( aitp ) ; IF r2 <> 0.0 THEN a2 := atan2 ( y , x ) ; ELSE a2 := a1 ; in2 := in1 ; END_IF ; x := xp + rmnp * COS ( aitp . min ) - xc ; y := yp + rmnp * SIN ( aitp . min ) - yc ; r3 := SQRT ( x ** 2 + y ** 2 ) ; in3 := min_included ( ritp ) AND min_included ( aitp ) ; IF r3 <> 0.0 THEN a3 := atan2 ( y , x ) ; ELSE a3 := a0 ; in3 := in0 ; END_IF ; IF rmnp = 0.0 THEN in2 := min_included ( ritp ) ; in3 := in2 ; END_IF ; IF ( apc = angle ( aitp . min ) ) OR ( acp = angle ( aitp . min ) ) THEN in0 := min_included ( aitp ) ; in3 := in0 ; ELSE IF ( apc = angle ( aitp . max ) ) OR ( acp = angle ( aitp . max ) ) THEN in1 := max_included ( aitp ) ; in2 := in1 ; END_IF ; END_IF ; IF strictly_in ( apc , aitp ) THEN rmin := rmnp - rc ; rmin_in := min_included ( ritp ) ; ELSE rmin := r2 ; rmin_in := in2 ; a := apc - aitp . min ; r := rc * COS ( a ) ; IF rmnp < r THEN rmin := rc * SIN ( ABS ( a ) ) ; rmin_in := min_included ( aitp ) ; END_IF ; a := apc - aitp . max ; r := rc * COS ( a ) ; IF rmnp < r THEN r := rc * SIN ( ABS ( a ) ) ; inn := max_included ( aitp ) ; IF r = rmin THEN rmin_in := rmin_in OR inn ; END_IF ; IF r < rmin THEN rmin := r ; rmin_in := inn ; END_IF ; END_IF ; IF r3 = rmin THEN rmin_in := rmin_in OR in3 ; END_IF ; IF r3 < rmin THEN rmin := r3 ; rmin_in := in3 ; END_IF ; END_IF ; ab := angle ( 0.5 * ( aitp . min + aitp . max ) ) ; IF rc > rmnp THEN find_aminmax ( ab , a0 , a1 , a2 , a3 , in0 , in1 , in2 , in3 , amin , amax , amin_in , amax_in ) ; ELSE a0 := angle ( a0 - ab ) ; a1 := angle ( a1 - ab ) ; a2 := angle ( a2 - ab ) ; a3 := angle ( a3 - ab ) ; IF a3 > a2 THEN a2 := a2 + 2.0 * PI ; END_IF ; IF a0 > a1 THEN a0 := a0 + 2.0 * PI ; END_IF ; IF a3 < a0 THEN amin := a3 ; amin_in := in3 ; ELSE amin := a0 ; amin_in := in0 ; END_IF ; IF a2 > a1 THEN amax := a2 ; amax_in := in2 ; ELSE amax := a1 ; amax_in := in1 ; END_IF ; IF ( amax - amin > 2.0 * PI ) OR ( ( amax - amin = 2.0 * PI ) AND ( amin_in OR amax_in ) ) THEN amin := - PI ; amin_in := FALSE ; amax := PI ; amax_in := TRUE ; IF ( rmin = 0.0 ) AND rmin_in THEN RETURN ( ? ) ; END_IF ; ELSE amin := amin + ab ; amax := amax + ab ; angle_range ( amin , amax ) ; END_IF ; END_IF ; END_IF ; IF rmin_in THEN minclo := closed ; END_IF ; ritv := make_real_interval_from_min ( rmin , minclo ) ; END_IF ; minclo := open ; maxclo := open ; IF amin_in THEN minclo := closed ; END_IF ; IF amax_in THEN maxclo := closed ; END_IF ; aitv := make_finite_real_interval ( amin , minclo , amax , maxclo ) ; RETURN ( make_polar_complex_number_region ( centre , ritv , aitv ) ) ; END_FUNCTION; -- enclose_pregion_in_pregion |
|
public class FEnclose_pregion_in_pregion public static Value run(SdaiContext _context, Value prgn, Value centre) |