示例#1
0
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
}
示例#2
0
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
}
示例#3
0
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);
}
示例#4
0
/**

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)
	       );
}