⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 posn.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include	<u.h>#include	<libc.h>#include	<bio.h>#include	"sky.h"voidamdinv(Header *h, Angle ra, Angle dec, float mag, float col){	int i, max_iterations;	float tolerance;	float object_x, object_y, delta_x, delta_y, f, fx, fy, g, gx, gy;	float x1, x2, x3, x4;	float y1, y2, y3, y4;	/*	 *  Initialize	 */	max_iterations = 50;	tolerance = 0.0000005;	/*	 *  Convert RA and Dec to St.coords	 */	traneqstd(h, ra, dec);	/*	 *  Set initial value for x,y	 */	object_x = h->xi/h->param[Ppltscale];	object_y = h->eta/h->param[Ppltscale];	/*	 *  Iterate by Newtons method	 */	for(i = 0; i < max_iterations; i++) {		/*		 *  X plate model		 */		x1 = object_x;		x2 = x1 * object_x;		x3 = x1 * object_x;		x4 = x1 * object_x;		y1 = object_y;		y2 = y1 * object_y;		y3 = y1 * object_y;		y4 = y1 * object_y;		f =			h->param[Pamdx1] * x1 +			h->param[Pamdx2] * y1 +		 	h->param[Pamdx3] +			h->param[Pamdx4] * x2 +			h->param[Pamdx5] * x1*y1 +			h->param[Pamdx6] * y2 +		   	h->param[Pamdx7] * (x2+y2) +			h->param[Pamdx8] * x2*x1 +			h->param[Pamdx9] * x2*y1 +			h->param[Pamdx10] * x1*y2 +			h->param[Pamdx11] * y3 +			h->param[Pamdx12] * x1* (x2+y2) +			h->param[Pamdx13] * x1 * (x2+y2) * (x2+y2) +			h->param[Pamdx14] * mag +			h->param[Pamdx15] * mag*mag +			h->param[Pamdx16] * mag*mag*mag +			h->param[Pamdx17] * mag*x1 +			h->param[Pamdx18] * mag * (x2+y2) +			h->param[Pamdx19] * mag*x1 * (x2+y2) +			h->param[Pamdx20] * col;		/*		 *  Derivative of X model wrt x		 */		fx =			h->param[Pamdx1] +			h->param[Pamdx4] * 2*x1 +			h->param[Pamdx5] * y1 +			h->param[Pamdx7] * 2*x1 +			h->param[Pamdx8] * 3*x2 +			h->param[Pamdx9] * 2*x1*y1 +			h->param[Pamdx10] * y2 +			h->param[Pamdx12] * (3*x2+y2) +			h->param[Pamdx13] * (5*x4 + 6*x2*y2 + y4) +			h->param[Pamdx17] * mag +			h->param[Pamdx18] * mag*2*x1 +			h->param[Pamdx19] * mag*(3*x2+y2);		/*		 *  Derivative of X model wrt y		 */		fy =			h->param[Pamdx2] +			h->param[Pamdx5] * x1 +			h->param[Pamdx6] * 2*y1 +			h->param[Pamdx7] * 2*y1 +			h->param[Pamdx9] * x2 +			h->param[Pamdx10] * x1*2*y1 +			h->param[Pamdx11] * 3*y2 +			h->param[Pamdx12] * 2*x1*y1 +			h->param[Pamdx13] * 4*x1*y1* (x2+y2) +			h->param[Pamdx18] * mag*2*y1 +			h->param[Pamdx19] * mag*2*x1*y1;		/*		 *  Y plate model		 */		g =			h->param[Pamdy1] * y1 +			h->param[Pamdy2] * x1 +			h->param[Pamdy3] +			h->param[Pamdy4] * y2 +			h->param[Pamdy5] * y1*x1 +			h->param[Pamdy6] * x2 +			h->param[Pamdy7] * (x2+y2) +			h->param[Pamdy8] * y3 +			h->param[Pamdy9] * y2*x1 +			h->param[Pamdy10] * y1*x3 +			h->param[Pamdy11] * x3 +			h->param[Pamdy12] * y1 * (x2+y2) +			h->param[Pamdy13] * y1 * (x2+y2) * (x2+y2) +			h->param[Pamdy14] * mag +			h->param[Pamdy15] * mag*mag +			h->param[Pamdy16] * mag*mag*mag +			h->param[Pamdy17] * mag*y1 +			h->param[Pamdy18] * mag * (x2+y2) +			h->param[Pamdy19] * mag*y1 * (x2+y2) +			h->param[Pamdy20] * col;		/*		 *  Derivative of Y model wrt x		 */		gx =			h->param[Pamdy2] +			h->param[Pamdy5] * y1 +			h->param[Pamdy6] * 2*x1 +			h->param[Pamdy7] * 2*x1 +			h->param[Pamdy9] * y2 +			h->param[Pamdy10] * y1*2*x1 +			h->param[Pamdy11] * 3*x2 +			h->param[Pamdy12] * 2*x1*y1 +			h->param[Pamdy13] * 4*x1*y1 * (x2+y2) +			h->param[Pamdy18] * mag*2*x1 +			h->param[Pamdy19] * mag*y1*2*x1;		/*		 *  Derivative of Y model wrt y		 */		gy =			h->param[Pamdy1] +			h->param[Pamdy4] * 2*y1 +			h->param[Pamdy5] * x1 +			h->param[Pamdy7] * 2*y1 +			h->param[Pamdy8] * 3*y2 +			h->param[Pamdy9] * 2*y1*x1 +			h->param[Pamdy10] * x2 +			h->param[Pamdy12] * 3*y2 +			h->param[Pamdy13] * (5*y4 + 6*x2*y2 + x4) +			h->param[Pamdy17] * mag +			h->param[Pamdy18] * mag*2*y1 +			h->param[Pamdy19] * mag*(x2 + 3*y2);		f = f - h->xi;		g = g - h->eta;		delta_x = (-f*gy+g*fy) / (fx*gy-fy*gx);		delta_y = (-g*fx+f*gx) / (fx*gy-fy*gx);		object_x = object_x + delta_x;		object_y = object_y + delta_y;		if((fabs(delta_x) < tolerance) && (fabs(delta_y) < tolerance))			break;	}	/*	 *  Convert mm from plate center to pixels	 */	h->x = (h->param[Pppo3]-object_x*1000.0)/h->param[Pxpixelsz];	h->y = (h->param[Pppo6]+object_y*1000.0)/h->param[Pypixelsz];}voidppoinv(Header *h, Angle ra, Angle dec){	/*	 *  Convert RA and Dec to standard coords.	 */	traneqstd(h, ra, dec);	/*	 *  Convert st.coords from arcsec to radians	 */	h->xi  /= ARCSECONDS_PER_RADIAN;	h->eta /= ARCSECONDS_PER_RADIAN;	/*	 *  Compute PDS coordinates from solution	 */	h->x =		h->param[Pppo1]*h->xi +		h->param[Pppo2]*h->eta +		h->param[Pppo3];	h->y =		h->param[Pppo4]*h->xi +		h->param[Pppo5]*h->eta +		h->param[Pppo6];	/*	 * Convert x,y from microns to pixels	 */	h->x /= h->param[Pxpixelsz];	h->y /= h->param[Pypixelsz];}voidtraneqstd(Header *h, Angle object_ra, Angle object_dec){	float div;	/*	 *  Find divisor	 */	div =		(sin(object_dec)*sin(h->param[Ppltdec]) +		cos(object_dec)*cos(h->param[Ppltdec]) *		cos(object_ra - h->param[Ppltra]));	/*	 *  Compute standard coords and convert to arcsec	 */	h->xi = cos(object_dec) *		sin(object_ra - h->param[Ppltra]) *		ARCSECONDS_PER_RADIAN/div;	h->eta = (sin(object_dec)*cos(h->param[Ppltdec])-		cos(object_dec)*sin(h->param[Ppltdec])*		cos(object_ra - h->param[Ppltra]))*		ARCSECONDS_PER_RADIAN/div;}voidxypos(Header *h, Angle ra, Angle dec, float mag, float col){	if (h->amdflag) {		amdinv(h, ra, dec, mag, col);	} else {		ppoinv(h, ra, dec);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -