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

📄 oval8.c

📁 nucleus 文件系统,内核和彩色图形系统,在小系统上非常好用
💻 C
字号:
/*************************************************************************/
/*                                                                       */
/*         Copyright (c) 1997 - 1999 Accelerated Technology, Inc.        */
/*                                                                       */
/* PROPRIETARY RIGHTS of Accelerated Technology are involved in the      */
/* subject matter of this material.  All manufacturing, reproduction,    */
/* use, and sales rights pertaining to this subject matter are governed  */
/* by the license agreement.  The recipient of this software implicitly  */
/* accepts the terms of the license.                                     */
/*                                                                       */
/*************************************************************************/

/*************************************************************************/
/*                                                                       */
/* FILE NAME                                            VERSION          */
/*                                                                       */
/*      OVAL8.c                                          1.9             */
/*                                                                       */
/* COMPONENT                                                             */
/*                                                                       */
/*      All                                                              */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This file contains the OvalPt function.                          */
/*                                                                       */
/* AUTHOR                                                                */
/*                                                                       */
/*      Robert G. Burrill, Accelerated Technology, Inc.                  */
/*                                                                       */
/* DATA STRUCTURES                                                       */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* FUNCTIONS                                                             */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* DEPENDENCIES                                                          */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         NAME            DATE                    REMARKS               */
/*                                                                       */
/*         GiacD          2/9/99     Added fixed-point math support      */
/*                                                                       */
/*************************************************************************/

#include "meta_wnd.h"
#include "metconst.h"    /* MetaWINDOW Constant & Stucture Definitions */
#include "metports.h"    /* MetaWINDOW Port & Bitmap Definitions */
#include "grafdata.h"
#include "metmacs3.h"
//#include "Nu_math.h"


/* Function OvalPt calculates the point gblPt of the elliptical oval inscribed
in rectangle argR which intersects a vector at angle degrees.  The center of
the rectangle is the center of the oval and the base of the angular measurement.
Angles are measured in integer increments of 0.1 degrees from the 3 o'clock
position (0 degrees), with positive angles proceeding counter-clockwise,
negative angles clockwise. */

#ifdef FIXPOINT
void OvalPt(rect *argR, int angle, point *gblPt)
{
	void InsetRect(rect * R , short dltX , short dltY);
	short ChkAngle(int angle);

	dblFix qA;			/* radY^2 */
	dblFix qB;			/* radX^2 */
	dblFix qTmp1;		/* work variable */
	dblFix qA_BMM;		/* A + (B*M*M) */
	dblFix qAdA_BMM;	/* A / (A + B*M*M) */
	dblFix dblOne = {0, 0x00010000};

	rect ctrR;			/* gblCenterR */
	short dltX;			/* gblDx, gblDy */
	short dltY;
	short quadrant;		/* pointer for "switch" function */
	short radX;			/* x,y radii */
	short radY;
	short tmpRad;

	ctrR = *argR;	/* get rectangle */
	if (globalLevel > 0)
	{
		/* convert from user to global */
		U2GR(ctrR, &ctrR, 1);
	}

	radX = ((ctrR.Xmax - ctrR.Xmin) >> 1);
	radY = ((ctrR.Ymax - ctrR.Ymin) >> 1);
	InsetRect(&ctrR, radX, radY);

	angle = ChkAngle(angle);	/* insure ( 0 <= angle < 3600 ) */

	/* Dispatch according to the angle */
	quadrant = angle / 900;	/* one of four 90 degree quandrants */
	angle = angle % 900;	/* angle is between 0 and 90 degrees */
	if (angle == 0)	/* check four trivial cases */
	{
		switch (quadrant)
		{
		case 0:	/* 0 */
			gblPt->X = ctrR.Xmax + radX;
			gblPt->Y = ctrR.Ymin;
			break;
		case 1:	/* 90 */
			gblPt->X = ctrR.Xmin;
			gblPt->Y = ctrR.Ymin - radY;
			break;
		case 2:	/* 180 */
			gblPt->X = ctrR.Xmin - radX;
			gblPt->Y = ctrR.Ymax;
			break;
		default:	/* 270 */
			gblPt->X = ctrR.Xmax;
			gblPt->Y = ctrR.Ymax + radY;
			break;
		}
	}
	else
	{
		if ((quadrant == 1) || (quadrant == 3))
		{	/* swap radX & radY */
			tmpRad = radX;
			radX = radY;
			radY = tmpRad;
		}

		/* Ready to compute inter-quadrant point */
		qA.fUpper = 0;
		qA.fLower = (radY << 16);
		dFix_mul(&qA, &qA, &qA);
		qB.fUpper = 0;
		qB.fLower = (radX << 16);
		dFix_mul(&qB, &qB, &qB);
		qTmp1.fLower = Fix_div(iSin(angle), iCos(angle));
		qTmp1.fLower = Fix_mul(qTmp1.fLower, qTmp1.fLower);
		qTmp1.fUpper = 0;

		dFix_mul(&qB, &qTmp1, &qA_BMM);
		dFix_add(&qA, &qA_BMM, &qA_BMM);
		dFix_div(&qA, &qA_BMM, &qAdA_BMM);
		
		dFix_mul(&qB, &qAdA_BMM, &qB);
		dltX = (short) ((Fix_sqrt(qB.fLower) + 0x00008000) >> 16);
		dFix_sub(&dblOne, &qAdA_BMM, &qAdA_BMM);
		dFix_mul(&qA, &qAdA_BMM, &qA);
		dltY = (short) ((Fix_sqrt(qA.fLower) + 0x00008000) >> 16);

		/* Ready to calculate point */
		switch (quadrant)
		{
		case 0:	/* Quadrant 0 */
			gblPt->X = ctrR.Xmax + dltX;
			gblPt->Y = ctrR.Ymin - dltY;
			break;
		case 1:  /* Quadrant 1 */
			gblPt->X = ctrR.Xmin - dltY;
			gblPt->Y = ctrR.Ymin - dltX;
			break;
		case 2:  /* Quadrant 2 */
			gblPt->X = ctrR.Xmin - dltX;
			gblPt->Y = ctrR.Ymax + dltY;
			break;
		default:  /* Quadrant 3 */
			gblPt->X = ctrR.Xmax + dltY;
			gblPt->Y = ctrR.Ymax + dltX;
		}
	}

	if (globalLevel > 0)
	{	/* convert from global to user */
		G2UP(gblPt->X, gblPt->Y, &gblPt->X, &gblPt->Y);
	}

	return;
}

#else
void OvalPt(rect *argR, int angle, point *gblPt)
{
	void InsetRect();
	short ChkAngle();
	double qA;			/* radY^2 */
	double qB;			/* radX^2 */
	double qTmp1;		/* work variable */
	double qA_BMM;		/* A + (B*M*M) */
	double qAdA_BMM;	/* A / (A + B*M*M) */
	rect ctrR;			/* gblCenterR */
	short dltX;			/* gblDx, gblDy */
	short dltY;
	short quadrant;		/* pointer for "switch" function */
	short radX;			/* x,y radii */
	short radY;
	short tmpRad;

	ctrR = *argR;	/* get rectangle */
	if (globalLevel > 0)
	{
		/* convert from user to global */
		U2GR(ctrR, &ctrR, 1);
	}

	radX = ((ctrR.Xmax - ctrR.Xmin) >> 1);
	radY = ((ctrR.Ymax - ctrR.Ymin) >> 1);
	InsetRect(&ctrR, radX, radY);

	angle = ChkAngle(angle);	/* insure ( 0 <= angle < 3600 ) */

	/* Dispatch according to the angle */
	quadrant = angle / 900;	/* one of four 90 degree quandrants */
	angle = angle % 900;	/* angle is between 0 and 90 degrees */
	if (angle == 0)	/* check four trivial cases */
	{
		switch (quadrant)
		{
		case 0:	/* 0 */
			gblPt->X = ctrR.Xmax + radX;
			gblPt->Y = ctrR.Ymin;
			break;
		case 1:	/* 90 */
			gblPt->X = ctrR.Xmin;
			gblPt->Y = ctrR.Ymin - radY;
			break;
		case 2:	/* 180 */
			gblPt->X = ctrR.Xmin - radX;
			gblPt->Y = ctrR.Ymax;
			break;
		default:	/* 270 */
			gblPt->X = ctrR.Xmax;
			gblPt->Y = ctrR.Ymax + radY;
			break;
		}
	}
	else
	{
		if ((quadrant == 1) || (quadrant == 3))
		{	/* swap radX & radY */
			tmpRad = radX;
			radX = radY;
			radY = tmpRad;
		}

		/* Ready to compute inter-quadrant point */
		qA = radY * radY;
		qB = radX * radX;
		qTmp1 = angle;
		qTmp1 = 3.1415926535 * qTmp1 / 1800.0;
		qTmp1 = tan(qTmp1);
		qTmp1 *= qTmp1;
		qA_BMM = qA + qB * qTmp1;
		qAdA_BMM = qA /  qA_BMM;
		qB *= qAdA_BMM;
		dltX = (short) (sqrt(qB) + .5);
		qAdA_BMM = 1 - qAdA_BMM;
		qA *= qAdA_BMM;
		dltY = (short) (sqrt(qA) + .5);

		/* Ready to calculate point */
		switch (quadrant)
		{
		case 0:	/* Quadrant 0 */
			gblPt->X = ctrR.Xmax + dltX;
			gblPt->Y = ctrR.Ymin - dltY;
			break;
		case 1:  /* Quadrant 1 */
			gblPt->X = ctrR.Xmin - dltY;
			gblPt->Y = ctrR.Ymin - dltX;
			break;
		case 2:  /* Quadrant 2 */
			gblPt->X = ctrR.Xmin - dltX;
			gblPt->Y = ctrR.Ymax + dltY;
			break;
		default:  /* Quadrant 3 */
			gblPt->X = ctrR.Xmax + dltY;
			gblPt->Y = ctrR.Ymax + dltX;
		}
	}

	if (globalLevel > 0)
	{	/* convert from global to user */
		G2UP(gblPt->X, gblPt->Y, &gblPt->X, &gblPt->Y);
	}

	return;
}
#endif

⌨️ 快捷键说明

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