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] < -FTINY || co->ca[7] < -FTINY) |
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 (co->ca[6] < 0.0) co->ca[6] = 0.0; |
86 |
< |
if (co->ca[7] < 0.0) co->ca[7] = 0.0; |
87 |
< |
if (fabs(co->ca[7] - co->ca[6]) <= FTINY) |
88 |
< |
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; |
148 |
|
{ |
149 |
|
register CONE *co = (CONE *)o->os; |
150 |
|
|
151 |
+ |
if (o->os == NULL) |
152 |
+ |
return; |
153 |
|
if (co->tm != NULL) |
154 |
|
free((char *)co->tm); |
155 |
|
free(o->os); |