void eifrac(FSIZE *x,long *i, FSIZE *f) { #if NATIVE /* Seems to split ABS INT/FRAC parts into i/f */ FSIZE y; double xp = *x; y = (FSIZE) floor( xp ); if( y < 0.0 ) { *f = y - *x; *i = -y; } else { *f = *x - y; *i = y; } #else __FP_LOAD_IEEE_AC((unsigned char *)x); FP_ABS(__FPac); __FP_SPLIT(); __FP_U32(); __AC32_STORE((U8 *)i); __FP_STORE_IEEE_ARG((unsigned char *)f); #endif #if DEBUG printf("EIFRAC: X: %.10e, %ld, %.10e\n", (double) *x, (long) *i, (double ) *f); #endif }
void eabs(FSIZE *x) { if( (*x) < 0.0 ) *x = -(*x); #if NATIVE if( (*x) < 0.0 ) *x = -(*x); #else __FP_LOAD_IEEE_AC((unsigned char *)x); FP_ABS(__FPac); __FP_STORE_IEEE_AC((unsigned char *)x); #endif }
double deifrac(double d, long *i) { unsigned char tr[TR_SIZE]; double r; d2tr(d,tr,0); __FP_LOAD_TR_AC(tr); FP_ABS(__FPac); __FP_SPLIT(); __FP_U32(); __AC32_STORE((U8 *)i); __FP_STORE_TR_ARG(tr); r = tr2d(tr); return(r); }
/** The old function nessecary for ptarray_segmentize2d in ptarray.c */ double distance2d_pt_seg(const POINT2D *p, const POINT2D *A, const POINT2D *B) { double r,s; /*if start==end, then use pt distance */ if ( ( A->x == B->x) && (A->y == B->y) ) return distance2d_pt_pt(p,A); /* * otherwise, we use comp.graphics.algorithms * Frequently Asked Questions method * * (1) AC dot AB * r = --------- * ||AB||^2 * r has the following meaning: * r=0 P = A * r=1 P = B * r<0 P is on the backward extension of AB * r>1 P is on the forward extension of AB * 0<r<1 P is interior to AB */ r = ( (p->x-A->x) * (B->x-A->x) + (p->y-A->y) * (B->y-A->y) )/( (B->x-A->x)*(B->x-A->x) +(B->y-A->y)*(B->y-A->y) ); if (r<0) return distance2d_pt_pt(p,A); if (r>1) return distance2d_pt_pt(p,B); /* * (2) * (Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay) * s = ----------------------------- * L^2 * * Then the distance from C to P = |s|*L. * */ s = ( (A->y-p->y)*(B->x-A->x)- (A->x-p->x)*(B->y-A->y) ) / ( (B->x-A->x)*(B->x-A->x) +(B->y-A->y)*(B->y-A->y) ); return FP_ABS(s) * sqrt( (B->x-A->x)*(B->x-A->x) + (B->y-A->y)*(B->y-A->y) ); }