| 1 |
< |
/* Copyright (c) 1986 Regents of the University of California */ |
| 1 |
> |
/* Copyright (c) 1991 Regents of the University of California */ |
| 2 |
|
|
| 3 |
|
#ifndef lint |
| 4 |
|
static char SCCSid[] = "$SunId$ LBL"; |
| 49 |
|
int getxf; |
| 50 |
|
{ |
| 51 |
|
double fabs(), sqrt(); |
| 52 |
+ |
int sgn0, sgn1; |
| 53 |
|
register CONE *co; |
| 54 |
|
|
| 55 |
|
if ((co = (CONE *)o->os) == NULL) { |
| 63 |
|
if (o->otype == OBJ_CYLINDER || o->otype == OBJ_TUBE) { |
| 64 |
|
if (o->oargs.nfargs != 7) |
| 65 |
|
goto argcerr; |
| 66 |
< |
if (co->ca[6] <= FTINY) |
| 66 |
> |
if (co->ca[6] < -FTINY) { |
| 67 |
> |
objerror(o, WARNING, "negative radius"); |
| 68 |
> |
o->otype = o->otype == OBJ_CYLINDER ? |
| 69 |
> |
OBJ_TUBE : OBJ_CYLINDER; |
| 70 |
> |
co->ca[6] = -co->ca[6]; |
| 71 |
> |
} else if (co->ca[6] <= FTINY) |
| 72 |
|
goto raderr; |
| 73 |
|
co->r0 = co->r1 = 6; |
| 74 |
|
} else { |
| 75 |
|
if (o->oargs.nfargs != 8) |
| 76 |
|
goto argcerr; |
| 77 |
< |
if (co->ca[6] < 0.0 || co->ca[7] < 0.0) |
| 77 |
> |
if (co->ca[6] < -FTINY) sgn0 = -1; |
| 78 |
> |
else if (co->ca[6] > FTINY) sgn0 = 1; |
| 79 |
> |
else sgn0 = 0; |
| 80 |
> |
if (co->ca[7] < -FTINY) sgn1 = -1; |
| 81 |
> |
else if (co->ca[7] > FTINY) sgn1 = 1; |
| 82 |
> |
else sgn1 = 0; |
| 83 |
> |
if (sgn0+sgn1 == 0) |
| 84 |
|
goto raderr; |
| 85 |
< |
if (fabs(co->ca[7] - co->ca[6]) <= FTINY) |
| 86 |
< |
goto raderr; |
| 85 |
> |
if (sgn0 < 0 || sgn1 < 0) { |
| 86 |
> |
objerror(o, o->otype==OBJ_RING?USER:WARNING, |
| 87 |
> |
"negative radii"); |
| 88 |
> |
o->otype = o->otype == OBJ_CONE ? |
| 89 |
> |
OBJ_CUP : OBJ_CONE; |
| 90 |
> |
} |
| 91 |
> |
co->ca[6] = co->ca[6]*sgn0; |
| 92 |
> |
co->ca[7] = co->ca[7]*sgn1; |
| 93 |
|
co->r0 = 6; |
| 94 |
|
co->r1 = 7; |
| 95 |
+ |
if (fabs(co->ca[7] - co->ca[6]) <= FTINY) { |
| 96 |
+ |
if (o->otype == OBJ_RING) |
| 97 |
+ |
goto raderr; |
| 98 |
+ |
o->otype = o->otype == OBJ_CONE ? |
| 99 |
+ |
OBJ_CYLINDER : OBJ_TUBE; |
| 100 |
+ |
o->oargs.nfargs = 7; |
| 101 |
+ |
co->r1 = 6; |
| 102 |
+ |
} |
| 103 |
|
} |
| 104 |
|
/* get axis orientation */ |
| 105 |
|
co->p0 = 0; |
| 130 |
|
co->sl = co->al; |
| 131 |
|
} |
| 132 |
|
co->tm = NULL; |
| 133 |
< |
(CONE *)o->os = co; |
| 133 |
> |
o->os = (char *)co; |
| 134 |
|
} |
| 135 |
|
if (getxf && co->tm == NULL) |
| 136 |
|
conexform(co); |