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

📄 sph_poly.c

📁 [Game.Programming].Academic - Graphics Gems (6 books source code)
💻 C
字号:
/* * ANSI C code from the article * "Computing the Area of a Spherical Polygon" * by Robert D. Miller * in "Graphics Gems IV", Academic Press, 1994 *//* * to test, compile with "cc -DMAIN -o spherical_poly spherical_poly.c -lm" * to create subroutine, compile with "cc -c spherical_poly.c" */#include <math.h>static const double    HalfPi= 1.5707963267948966192313,    Degree= 57.295779513082320876798;	/* degrees per radian */double Hav(double X)/*  Haversine function: hav(x)= (1-cos(x))/2.  */{    return (1.0 -cos(X))/2.0;}double SphericalPolyArea(double *Lat, double *Lon, int N)/*  Returns the area of a spherical polygon in spherical degrees,     given the latitudes and longitudes in Lat and Lon, respectively.     The N data points have indices which range from 0 to N-1. */{int  J, K;double    Lam1, Lam2, Beta1, Beta2,    CosB1, CosB2, HavA,    T, A, B, C, S, Sum, Excess;    Sum= 0;    for (J= 0; J <= N; J++)    {	K= J+1;	if (J == 0)	{	    Lam1= Lon[J];	Beta1= Lat[J];	    Lam2= Lon[J+1];	Beta2= Lat[J+1];	    CosB1= cos(Beta1);	CosB2= cos(Beta2);	}	else	{	    K= (J+1) % (N+1);	    Lam1= Lam2;		Beta1= Beta2;	    Lam2= Lon[K];	Beta2= Lat[K];	    CosB1= CosB2;	CosB2= cos(Beta2);	}	if (Lam1 != Lam2)	{	    HavA= Hav(Beta2-Beta1) +CosB1*CosB2*Hav(Lam2-Lam1);	    A= 2*asin(sqrt(HavA));	    B= HalfPi -Beta2;	    C= HalfPi -Beta1;	    S= 0.5*(A+B+C);	    T= tan(S/2) * tan((S-A)/2) * tan((S-B)/2) * tan((S-C)/2);	    Excess= fabs(4*atan(sqrt(fabs(T))))*Degree;	    if (Lam2 < Lam1) Excess= -Excess;	    Sum= Sum + Excess;	}    }    return fabs(Sum);}   /*	SphericalPolyArea. */#ifdef MAIN#include <stdlib.h>#include <stdio.h>double SphericalPolyArea(double *Lat, double *Lon, int N);double    SqMi= 273218.4, /* Square mi per spherical degree. */    SqKm= 707632.4; /* Square km per spherical degree. */main()	     /*	 Spherical Polygon Area test routine */{double	Lat[100], Lon[100];double	P, Q, Area;int	K, LastPt;    LastPt= -1;    printf("Enter Longitude Latitude. End with: 0 0.\n");    while (1)	{	scanf("%lf %lf",&P,&Q);	if ((P == 0.0) && (Q == 0.0))	break;	Lon[++LastPt]= P;  Lat[LastPt]= Q;	}    for (K= 0; K <= LastPt; K++)	{	Lat[K]= Lat[K]/Degree;	Lon[K]= Lon[K]/Degree;	}    Area= SphericalPolyArea(Lat, Lon, LastPt);    printf("	 Area=%12.4lf sq mi., %12.4lf spherical degrees.\n",	   Area*SqMi, Area);    return 0;}#endif

⌨️ 快捷键说明

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