home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
prgramer
/
pli
/
sphere
< prev
next >
Wrap
Text File
|
1989-03-12
|
6KB
|
205 lines
ClrScr;
PRINT(SYSPRINT,' ',
'Evenly Spaced Points on a Sphere');
PUTCRLF(SYSPRINT);
PUTCRLF(SYSPRINT);
PUTCRLF(SYSPRINT);
num_points=0;
DO WHILE(num_points < 2);
PRINT(SYSPRINT,' How many points are to be placed? ');
num_points=GETINT;
IF num_points < 2 THEN
DO;
PRINT(SYSPRINT,
' ? The number of points must be no less 2');
PUTCRLF(SYSPRINT);
END;
END;
b=2.5;
c=(b+1.0)*EXP(b*LOG(1.0+1.0/b));
PUTCRLF(sysprint);
Random=0.0;
DO WHILE((Random <= 0.0) | (Random >= 1.0));
PRINT(SYSPRINT,' Random number seed? ');
Random=GETREAL;
IF ((Random <= 0.0) | (Random >= 1.0)) THEN
DO;
PRINT(SYSPRINT,
' ? The seed must be between 0 and 1, exclusively');
PUTCRLF(SYSPRINT);
END;
END;
point_num_1=1;
DO WHILE(point_num_1 <= num_points);
sum=0.0;
dimension_num=1;
DO WHILE(dimension_num <= 3);
tem_real=1.0;
DO WHILE(tem_real >= 1.0);
Random=c*Random*EXP(b*LOG(1.0-Random));
v1=2.0*Random-1.0;
Random=c*Random*EXP(b*LOG(1.0-Random));
v2=2.0*Random-1.0;
tem_real=v1*v1+v2*v2;
END;
tem_real=v1*SQRT(-2.0*LOG(tem_real)/tem_real);
sum=sum+tem_real*tem_real;
position(dimension_num)=tem_real;
dimension_num=dimension_num+1;
END;
sum=SQRT(sum);
dimension_num=1;
DO WHILE(dimension_num <= 3);
location(point_num_1,dimension_num)
=position(dimension_num)/sum;
dimension_num=dimension_num+1;
END;
point_num_1=point_num_1+1;
END;
max_delta=num_points;
max_delta=SQRT(4.0*ATAN(1.0)/max_delta);
current_potential=0.0;
point_num_1=1;
DO WHILE (point_num_1 < num_points);
point_num_2=point_num_1;
DO WHILE (point_num_2 < num_points);
point_num_2=point_num_2+1;
distance=0.0;
dimension_num=1;
DO WHILE(dimension_num <= 3);
distance=distance
+SQR(location(point_num_1,dimension_num)
-location(point_num_2,dimension_num));
dimension_num=dimension_num+1;
END;
distance=SQRT(distance);
current_potential=current_potential+1.0/distance;
END;
point_num_1=point_num_1+1;
END;
PUTCRLF(SYSPRINT);
degrees_per_radian=180.0/PI;
point_num_1=1;
DO WHILE(point_num_1 <= num_points);
x=location(point_num_1,1);
y=location(point_num_1,2);
z=location(point_num_1,3);
latitude=ATAN(z/SQRT(SQR(x)+SQR(y)));
IF x >= 0.0 THEN
longitude=-PI/2+ATAN(y/x);
ELSE
longitude=PI/2+ATAN(y/x);
latitude=degrees_per_radian*latitude;
longitude=degrees_per_radian*longitude;
PRINT(SYSPRINT,latitude,' ',longitude);
PUTCRLF(SYSPRINT);
point_num_1=point_num_1+1;
END;
previous_potential=current_potential;
better_min_found=TRUE;
DO WHILE(better_min_found);
point_num_1=1;
DO WHILE(point_num_1 <= num_points);
dimension_num=1;
DO WHILE(dimension_num <= 3);
force(dimension_num)=0.0;
dimension_num=dimension_num+1;
END;
point_num_2=1;
DO WHILE(point_num_2 <= num_points);
IF point_num_1 != point_num_2 THEN
DO;
distance=0.0;
dimension_num=1;
DO WHILE(dimension_num <= 3);
distance=distance
+SQR(location(point_num_1,dimension_num)
-location(point_num_2,dimension_num));
dimension_num=dimension_num+1;
END;
distance=SQRT(distance);
dimension_num=1;
DO WHILE(dimension_num <= 3);
force(dimension_num)=force(dimension_num)
+(location(point_num_1,dimension_num)
-location(point_num_2,dimension_num))
/(distance*distance*distance);
dimension_num=dimension_num+1;
END;
END;
point_num_2=point_num_2+1;
END;
magnitude_of_force=0.0;
dimension_num=1;
DO WHILE(dimension_num <= 3);
magnitude_of_force
=magnitude_of_force+SQR(force(dimension_num));
dimension_num=dimension_num+1;
END;
magnitude_of_force=SQRT(magnitude_of_force);
magnitude_of_position=0.0;
dimension_num=1;
DO WHILE(dimension_num <= 3);
coordinate
=location(point_num_1,dimension_num)
+max_delta*force(dimension_num)/magnitude_of_force;
magnitude_of_position=magnitude_of_position
+coordinate*coordinate;
position(dimension_num)=coordinate;
dimension_num=dimension_num+1;
END;
magnitude_of_position=SQRT(magnitude_of_position);
dimension_num=1;
DO WHILE(dimension_num <= 3);
location(point_num_1,dimension_num)
=position(dimension_num)/magnitude_of_position;
dimension_num=dimension_num+1;
END;
point_num_1=point_num_1+1;
END;
current_potential=0.0;
point_num_1=1;
DO WHILE (point_num_1 < num_points);
point_num_2=point_num_1;
DO WHILE (point_num_2 < num_points);
point_num_2=point_num_2+1;
distance=0.0;
dimension_num=1;
DO WHILE(dimension_num <= 3);
distance=distance
+SQR(location(point_num_1,dimension_num)
-location(point_num_2,dimension_num));
dimension_num=dimension_num+1;
END;
distance=SQRT(distance);
current_potential=current_potential+1.0/distance;
END;
point_num_1=point_num_1+1;
END;
PUTCRLF(SYSPRINT);
point_num_1=1;
DO WHILE(point_num_1 <= num_points);
x=location(point_num_1,1);
y=location(point_num_1,2);
z=location(point_num_1,3);
latitude=ATAN(z/SQRT(SQR(x)+SQR(y)));
IF x >= 0.0 THEN
longitude=-PI/2+ATAN(y/x);
ELSE
longitude=PI/2+ATAN(y/x);
latitude=degrees_per_radian*latitude;
longitude=degrees_per_radian*longitude;
PRINT(SYSPRINT,latitude,' ',longitude);
PUTCRLF(SYSPRINT);
point_num_1=point_num_1+1;
END;
IF ABS(current_potential - previous_potential)/previous_potential
< 5.0E-6 THEN
better_min_found=FALSE;
ELSE
DO;
better_min_found=TRUE;
previous_potential=current_potential;
END;
END;