-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgeometry.h
800 lines (800 loc) · 42.3 KB
/
geometry.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
void angle_box_2d ( double dist, double p1[2], double p2[2], double p3[2],
double p4[2], double p5[2] );
int angle_contains_ray_2d ( double p1[2], double p2[2], double p3[2],
double p[2] );
double angle_deg_2d ( double p1[2], double p2[2], double p3[2] );
double *angle_half_2d ( double p1[2], double p2[2], double p3[2] );
double angle_rad_2d ( double p1[2], double p2[2], double p3[2] );
double angle_rad_3d ( double p1[3], double p2[3], double p3[3] );
double angle_rad_nd ( int dim_num, double vec1[], double vec2[] );
double angle_turn_2d ( double p1[2], double p2[2], double p3[2] );
double anglei_deg_2d ( double p1[2], double p2[2], double p3[2] );
double anglei_rad_2d ( double p1[2], double p2[2], double p3[2] );
double annulus_area_2d ( double r1, double r2 );
double annulus_sector_area_2d ( double r1, double r2, double theta1,
double theta2 );
double *annulus_sector_centroid_2d ( double pc[2], double r1, double r2,
double theta1, double theta2 );
double *ball_unit_sample_2d ( int *seed );
double *ball_unit_sample_3d ( int *seed );
double *ball_unit_sample_nd ( int dim_num, int *seed );
double *basis_map_3d ( double u[3*3], double v[3*3] );
int box_01_contains_point_2d ( double p[2] );
int box_01_contains_point_nd ( int dim_num, double p[] );
int box_contains_point_2d ( double p1[2], double p2[2], double p[2] );
int box_contains_point_nd ( int dim_num, double p1[], double p2[], double p[] );
void box_ray_int_2d ( double p1[2], double p2[2], double pa[2],
double pb[2], double pint[2] );
int box_segment_clip_2d ( double p1[2], double p2[2], double pa[2],
double pb[2] );
void circle_arc_point_near_2d ( double r, double pc[2], double theta1,
double theta2, double p[2], double pn[2], double *dist );
double circle_area_2d ( double r );
void circle_dia2imp_2d ( double p1[2], double p2[2], double *r, double pc[2] );
int circle_exp_contains_point_2d ( double p1[2], double p2[2], double p3[2],
double p[2] );
void circle_exp2imp_2d ( double p1[2], double p2[2], double p3[2], double *r,
double pc[2] );
int circle_imp_contains_point_2d ( double r, double pc[2], double p[2] );
void circle_imp_line_par_int_2d ( double r, double pc[2], double x0, double y0,
double f, double g, int *int_num, double p[] );
double circle_imp_point_dist_2d ( double r, double pc[2], double p[2] );
double circle_imp_point_dist_signed_2d ( double r, double pc[2], double p[2] );
double circle_imp_point_near_2d ( double r, double pc[2], double p[2],
double pn[2] );
double *circle_imp_points_2d ( double r, double pc[2], int n );
double *circle_imp_points_3d ( double r, double pc[3], double nc[3], int n );
void circle_imp_points_arc_2d ( double r, double pc[2], double theta1,
double theta2, int n, double p[] );
void circle_imp_print_2d ( double r, double pc[2], char *title );
void circle_imp_print_3d ( double r, double pc[3], double nc[3], char *title );
void circle_imp2exp_2d ( double r, double pc[2], double p1[2], double p2[2],
double p3[2] );
double *circle_llr2imp_2d ( double p1[], double p2[], double q1[], double q2[],
double r );
double circle_lune_area_2d ( double r, double pc[2], double theta1,
double theta2 );
double *circle_lune_centroid_2d ( double r, double pc[2], double theta1,
double theta2 );
void circle_pppr2imp_3d ( double p1[], double p2[], double p3[], double r,
double pc[], double normal[] );
double *circle_ppr2imp_2d ( double p1[], double p2[], double r );
double circle_sector_area_2d ( double r, double pc[2], double theta1,
double theta2 );
double *circle_sector_centroid_2d ( double r, double pc[2], double theta1,
double theta2 );
int circle_sector_contains_point_2d ( double r, double pc[2], double theta1,
double theta2, double p[2] );
void circle_sector_print_2d ( double r, double pc[2], double theta1,
double theta2 );
double circle_triangle_area_2d ( double r, double pc[2], double theta1,
double theta2 );
void circle_triple_angles_2d ( double r1, double r2, double r3, double *angle1,
double *angle2, double *angle3 );
void circles_imp_int_2d ( double r1, double pc1[2], double r2, double pc2[2],
int *int_num, double p[] );
double cone_area_3d ( double h, double r );
double *cone_centroid_3d ( double r, double pc[3], double pt[3] );
double cone_volume_3d ( double h, double r );
void conv3d ( char axis, double theta, int n, double cor3[], double cor2[] );
double cos_deg ( double angle );
double cot_deg ( double angle );
double cot_rad ( double angle );
double csc_deg ( double angle );
void cube_shape_3d ( int point_num, int face_num, int face_order_max,
double point_coord[], int face_order[], int face_point[] );
void cube_size_3d ( int *point_num, int *edge_num, int *face_num,
int *face_order_max );
double cylinder_point_dist_3d ( double p1[3], double p2[3], double r,
double p[3] );
double cylinder_point_dist_signed_3d ( double p1[3], double p2[3], double r,
double p[3] );
int cylinder_point_inside_3d ( double p1[3], double p2[3], double r,
double p[3] );
double *cylinder_point_near_3d ( double p1[3], double p2[3], double r,
double p[3] );
double *cylinder_sample_3d ( double p1[3], double p2[3], double r, int n,
int *seed );
double cylinder_volume_3d ( double p1[3], double p2[3], double r );
double degrees_to_radians ( double degrees );
double dge_det ( int n, double a[], int pivot[] );
int dge_fa ( int n, double a[], int pivot[] );
void dge_sl ( int n, double a[], int pivot[], double b[], int job );
double *direction_pert_3d ( double sigma, double vbase[3], int *seed );
double *direction_uniform_2d ( int *seed );
double *direction_uniform_3d ( int *seed );
double *direction_uniform_nd ( int dim_num, int *seed );
double disk_point_dist_3d ( double pc[3], double r, double axis[3],
double p[3] );
double dms_to_radians ( int degrees, int minutes, int seconds );
void dodec_shape_3d ( int point_num, int face_num, int face_order_max,
double point_coord[], int face_order[], int face_point[] );
void dodec_size_3d ( int *point_num, int *edge_num, int *face_num,
int *face_order_max );
void dual_shape_3d ( int point_num, int face_num, int face_order_max,
double point_coord[], int face_order[], int face_point[], int point_num2,
int face_num2, int face_order_max2, double point_coord2[], int face_order2[],
int face_point2[] );
void dual_size_3d ( int point_num, int edge_num, int face_num,
int face_order_max, double point_coord[], int face_order[], int face_point[],
int *point_num2, int *edge_num2, int *face_num2, int *face_order_max2 );
double ellipse_area_2d ( double r1, double r2 );
double ellipse_point_dist_2d ( double r1, double r2, double p[2] );
double *ellipse_point_near_2d ( double r1, double r2, double p[2] );
void ellipse_points_2d ( double pc[2], double r1, double r2, double psi,
int n, double p[] );
void ellipse_points_arc_2d ( double pc[2], double r1, double r2, double psi,
double theta1, double theta2, int n, double p[] );
double enorm0_nd ( int n, double x[], double y[] );
int get_seed ( void );
void glob2loc_3d ( double cospitch, double cosroll, double cosyaw,
double sinpitch, double sinroll, double sinyaw, double globas[3],
double glopts[3], double locpts[3] );
int halfplane_contains_point_2d ( double pa[2], double pb[2], double p[2] );
int halfspace_imp_triangle_int_3d ( double a, double b, double c, double d,
double t[3*3], double p[3*4] );
int halfspace_norm_triangle_int_3d ( double pp[3], double pn[3], double t[3*3],
double p[3*4] );
int halfspace_triangle_int_3d ( double dist1, double dist2, double dist3,
double t[3*3], double p[3*4] );
double haversine ( double a );
void helix_shape_3d ( double a, int n, double r, double theta1, double theta2,
double p[] );
double hexagon_area_2d ( double r );
int hexagon_contains_point_2d ( double v[2*6], double p[2] );
void hexagon_shape_2d ( double angle, double p[2] );
double hexagon_unit_area_2d ( );
void hexagon_vertices_2d ( double h[2*6] );
double i4_dedekind_factor ( int p, int q );
double i4_dedekind_sum ( int p, int q );
int i4_factorial2 ( int n );
int i4_gcd ( int i, int j );
int i4_lcm ( int i, int j );
int i4_max ( int i1, int i2 );
int i4_min ( int i1, int i2 );
int i4_modp ( int i, int j );
int i4_sign ( int i );
void i4_swap ( int *i, int *j );
int i4_uniform ( int a, int b, int *seed );
int i4_wrap ( int ival, int ilo, int ihi );
int i4col_compare ( int m, int n, int a[], int i, int j );
void i4col_find_item ( int m, int n, int a[], int item, int *row, int *col );
void i4col_find_pair_wrap ( int m, int n, int a[], int item1, int item2,
int *row, int *col );
void i4col_sort_a ( int m, int n, int a[] );
int i4col_sorted_unique_count ( int m, int n, int a[] );
void i4col_swap ( int m, int n, int a[], int icol1, int icol2 );
void i4mat_print ( int m, int n, int a[], char *title );
void i4mat_print_some ( int m, int n, int a[], int ilo, int jlo, int ihi,
int jhi, char *title );
void i4mat_transpose_print ( int m, int n, int a[], char *title );
void i4mat_transpose_print_some ( int m, int n, int a[], int ilo, int jlo,
int ihi, int jhi, char *title );
int i4row_compare ( int m, int n, int a[], int i, int j );
void i4row_sort_a ( int m, int n, int a[] );
void i4row_swap ( int m, int n, int a[], int irow1, int irow2 );
void i4vec_copy ( int n, int a1[], int a2[] );
void i4vec_heap_d ( int n, int a[] );
int *i4vec_indicator_new ( int n );
int i4vec_lcm ( int n, int v[] );
void i4vec_print ( int n, int a[], char *title );
int i4vec_product ( int n, int a[] );
void i4vec_reverse ( int n, int a[] );
void i4vec_sort_heap_a ( int n, int a[] );
int i4vec_sorted_unique ( int n, int a[] );
int *i4vec_uniform_new ( int n, int a, int b, int *seed );
void i4vec_zero ( int n, int a[] );
int i4vec2_compare ( int n, int a1[], int a2[], int i, int j );
void i4vec2_sort_a ( int n, int a1[], int a2[] );
void i4vec2_sorted_unique ( int n, int a1[], int a2[], int *nuniq );
void icos_shape ( int point_num, int edge_num, int face_num,
int face_order_max, double point_coord[], int edge_point[], int face_order[],
int face_point[] );
void icos_size ( int *point_num, int *edge_num, int *face_num,
int *face_order_max );
int line_exp_is_degenerate_nd ( int dim_num, double p1[], double p2[] );
double *line_exp_normal_2d ( double p1[2], double p2[2] );
double *line_exp_perp_2d ( double p1[2], double p2[2], double p3[2], int *flag );
double line_exp_point_dist_2d ( double p1[2], double p2[2], double p[2] );
double line_exp_point_dist_3d ( double p1[3], double p2[3], double p[3] );
double line_exp_point_dist_signed_2d ( double p1[2], double p2[2], double p[2] );
void line_exp_point_near_2d ( double p1[2], double p2[2], double p[2],
double pn[2], double *dist, double *t );
void line_exp_point_near_3d ( double p1[3], double p2[3], double p[3],
double pn[3], double *dist, double *t );
void line_exp2imp_2d ( double p1[2], double p2[2], double *a, double *b,
double *c );
void line_exp2par_2d ( double p1[2], double p2[2], double *f, double *g,
double *x0, double *y0 );
void line_exp2par_3d ( double p1[3], double p2[3], double *f, double *g,
double *h, double *x0, double *y0, double *z0 );
int line_imp_is_degenerate_2d ( double a, double b, double c );
double line_imp_point_dist_2d ( double a, double b, double c, double p[2] );
double line_imp_point_dist_signed_2d ( double a, double b, double c,
double p[2] );
void line_imp2exp_2d ( double a, double b, double c, double p1[2],
double p2[2] );
void line_imp2par_2d ( double a, double b, double c, double *f, double *g,
double *x0, double *y0 );
double line_par_point_dist_2d ( double f, double g, double x0, double y0,
double p[2] );
double line_par_point_dist_3d ( double f, double g, double h, double x0,
double y0, double z0, double p[3] );
double *line_par_point_near_2d ( double f, double g, double x0, double y0,
double p[2] );
double *line_par_point_near_3d ( double f, double g, double h, double x0,
double y0, double z0, double p[3] );
void line_par2exp_2d ( double f, double g, double x0, double y0,
double p1[2], double p2[2] );
void line_par2exp_3d ( double f, double g, double h, double x0, double y0,
double z0, double p1[3], double p2[3] );
void line_par2imp_2d ( double f, double g, double x0, double y0, double *a,
double *b, double *c );
double lines_exp_angle_3d ( double p1[3], double p2[3], double p3[3],
double p4[3] );
double lines_exp_angle_nd ( double p1[], double p2[], double q1[], double q2[],
int n );
double lines_exp_dist_3d ( double p1[3], double p2[3], double q1[3],
double q2[3] );
double lines_exp_dist_3d_2 ( double p1[3], double p2[3], double q1[3],
double q2[3] );
int lines_exp_equal_2d ( double p1[2], double p2[2], double q1[2],
double q2[2] );
void lines_exp_int_2d ( double p1[2], double p2[2], double p3[2],
double p4[2], int *ival, double p[2] );
void lines_exp_near_3d ( double p1[3], double p2[3], double q1[3],
double q2[3], double pn[3], double qn[3] );
int lines_exp_parallel_2d ( double p1[2], double p2[2], double q1[2],
double q2[2] );
int lines_exp_parallel_3d ( double p1[3], double p2[3], double q1[3],
double q2[3] );
double lines_imp_angle_2d ( double a1, double b1, double c1,
double a2, double b2, double c2 );
double lines_imp_dist_2d ( double a1, double b1, double c1, double a2,
double b2, double c2 );
void lines_imp_int_2d ( double a1, double b1, double c1, double a2, double b2,
double c2, int *ival, double p[2] );
double lines_par_angle_2d ( double f1, double g1, double x01, double y01,
double f2, double g2, double x02, double y02 );
double lines_par_angle_3d ( double f1, double g1, double h1, double x01,
double y01, double z01, double f2, double g2, double h2, double x02,
double y02, double z02 );
double lines_par_dist_3d ( double f1, double g1, double h1, double x01,
double y01, double z01, double f2, double g2, double h2, double x02,
double y02, double z02 );
void lines_par_int_2d ( double f1, double g1, double x1, double y1, double f2,
double g2, double x2, double y2, double *t1, double *t2, double pint[2] );
void loc2glob_3d ( double cospitch, double cosroll, double cosyaw,
double sinpitch, double sinroll, double sinyaw, double locpts[3],
double globas[3], double glopts[3] );
int lrline ( double xu, double yu, double xv1, double yv1, double xv2,
double yv2, double dv );
void lvec_print ( int n, int a[], char *title );
void minabs ( double x1, double y1, double x2, double y2, double x3, double y3,
double *xmin, double *ymin );
int minquad ( double x1, double y1, double x2, double y2, double x3, double y3,
double *xmin, double *ymin );
void octahedron_shape_3d ( int point_num, int face_num, int face_order_max,
double point_coord[], int face_order[], int face_point[] );
void octahedron_size_3d ( int *point_num, int *edge_num, int *face_num,
int *face_order_max );
int parabola_ex ( double x1, double y1, double x2, double y2, double x3,
double y3, double *x, double *y );
int parabola_ex2 ( double x1, double y1, double x2, double y2, double x3,
double y3, double *x, double *y, double *a, double *b, double *c );
double parallelogram_area_2d ( double p[] );
double parallelogram_area_3d ( double p[] );
int parallelogram_contains_point_2d ( double p1[2], double p2[2], double p3[2],
double p[2] );
int parallelogram_contains_point_3d ( double p1[3], double p2[3], double p3[3],
double p[3] );
double parallelogram_point_dist_3d ( double p1[3], double p2[3], double p3[3],
double p[3] );
int parallelepiped_contains_point_3d ( double p1[3], double p2[3], double p3[3],
double p4[3], double p[3] );
double parallelepiped_point_dist_3d ( double p1[3], double p2[3], double p3[3],
double p4[3], double p[3] );
int perm_check ( int n, int p[] );
void perm_inv ( int n, int p[] );
void plane_exp_grid_3d ( double p1[3], double p2[3], double p3[3], int *ncor3,
int *line_num, double cor3[], int lines[], int maxcor3, int line_max,
int *ierror );
double plane_exp_point_dist_3d ( double p1[3], double p2[3], double p3[3],
double p[3] );
void plane_exp_normal_3d ( double p1[3], double p2[3], double p3[3],
double pn[3] );
void plane_exp_pro2 ( double p1[3], double p2[3], double p3[3], int npnt,
double pp[], double alpha[], double beta[] );
void plane_exp_pro3 ( double p1[3], double p2[3], double p3[3], int n,
double po[], double pp[] );
void plane_exp_project_3d ( double p1[3], double p2[3], double p3[3],
double pf[3], int n, double po[], double pp[], int ivis[] );
void plane_exp2imp_3d ( double p1[3], double p2[3], double p3[3], double *a,
double *b, double *c, double *d );
void plane_exp2normal_3d ( double p1[3], double p2[3], double p3[3],
double pp[3], double pn[3] );
int plane_imp_is_degenerate_3d ( double a, double b, double c );
int plane_imp_line_par_int_3d ( double a, double b, double c, double d,
double x0, double y0, double z0, double f, double g, double h, double p[3] );
double plane_imp_point_dist_3d ( double a, double b, double c, double d,
double p[3] );
double plane_imp_point_dist_signed_3d ( double a, double b, double c, double d,
double p[3] );
void plane_imp_point_near_3d ( double a, double b, double c, double d,
double p[3], double pn[3] );
void plane_imp_segment_near_3d ( double p1[3], double p2[3], double a, double b,
double c, double d, double *dist, double pnp[3], double pnl[3] );
void plane_imp_triangle_int_3d ( double a, double b, double c, double d,
double t[3*3], int *int_num, double p[] );
void plane_imp_triangle_int_add_3d ( double p1[3], double p2[3], double dist1,
double dist2, int *int_num, double p[] );
int plane_imp_triangle_near_3d ( double t[3*3], double a, double b, double c,
double d, double *dist, double pn[] );
void plane_imp2exp_3d ( double a, double b, double c, double d, double p1[3],
double p2[3], double p3[3] );
void plane_imp2normal_3d ( double a, double b, double c, double d,
double pp[3], double pn[3] );
void plane_normal_basis_3d ( double pp[3], double pn[3], double pq[3],
double pr[3] );
int plane_normal_line_exp_int_3d ( double pp[3], double normal[3],
double p1[3], double p2[3], double pint[3] );
double *plane_normal_qr_to_xyz ( double pp[], double normal[], double pq[],
double pr[], int n, double qr[] );
void plane_normal_tetrahedron_intersect ( double pp[3],
double normal[3], double t[3*4], int *int_num, double pint[3*4] );
int plane_normal_triangle_int_3d ( double pp[3], double pn[3], double t[3*3],
double p[3*3] );
void plane_normal_uniform_3d ( int *seed, double pp[3], double normal[3] );
void plane_normal_uniform_nd ( int dim_num, int *seed, double pp[],
double normal[] );
double *plane_normal_xyz_to_qr ( double pp[], double normal[], double pq[],
double pr[], int n, double xyz[] );
void plane_normal2exp_3d ( double pp[3], double pn[3], double p1[3],
double p2[3], double p3[3] );
void plane_normal2imp_3d ( double pp[3], double pn[3], double *a, double *b,
double *c, double *d );
double planes_imp_angle_3d ( double a1, double b1, double c1, double d1,
double a2, double b2, double c2, double d2 );
int points_avoid_point_naive_2d ( int n, double pset[], double p[2] );
void points_bisect_line_imp_2d ( double p1[2], double p2[2], double *a,
double *b, double *c );
void points_bisect_line_par_2d ( double p1[2], double p2[2], double *f,
double *g, double *x, double *y );
int points_centroid_2d ( int n, double p[] );
double points_colin_2d ( double p1[2], double p2[2], double p3[2] );
double points_colin_3d ( double p1[3], double p2[3], double p3[3] );
double points_dist_2d ( double p1[2], double p2[2] );
double points_dist_3d ( double p1[3], double p2[3] );
double points_dist_nd ( int dim_num, double p1[], double p2[] );
void points_hull_2d ( int node_num, double node_xy[], int *hull_num,
int hull[] );
void points_plot ( char *file_name, int node_num, double node_xy[],
int node_label );
int points_point_near_naive_2d ( int nset, double pset[], double ptest[],
double *d_min );
int points_point_near_naive_3d ( int nset, double pset[], double ptest[],
double *d_min );
int points_point_near_naive_nd ( int dim_num, int nset, double pset[],
double ptest[], double *d_min );
int *points_points_near_naive_2d ( int nset, double pset[], int ntest,
double ptest[] );
int *points_points_near_naive_3d ( int nset, double pset[], int ntest,
double ptest[] );
void polar_to_xy ( double r, double t, double xy[2] );
double polygon_1_2d ( int n, double v[] );
double *polygon_angles_2d ( int n, double v[] );
double polygon_area_2d ( int n, double v[] );
double polygon_area_2d_2 ( int n, double v[] );
double polygon_area_3d ( int n, double v[], double normal[] );
double polygon_area_3d_2 ( int n, double v[] );
double *polygon_centroid_2d ( int n, double v[] );
double *polygon_centroid_2d_2 ( int n, double v[] );
double *polygon_centroid_3d ( int n, double v[] );
int polygon_contains_point_2d ( int n, double v[], double p[2] );
int polygon_contains_point_2d_2 ( int n, double v[], double p[2] );
double polygon_diameter_2d ( int n, double v[] );
double *polygon_expand_2d ( int n, double v[], double h );
void polygon_inrad_data_2d ( int n, double radin, double *area, double *radout,
double *side );
int polygon_is_convex ( int n, double v[] );
double polygon_lattice_area_2d ( int i, int b );
double *polygon_normal_3d ( int n, double v[] );
void polygon_outrad_data_2d ( int n, double radout, double *area, double *radin,
double *side );
void polygon_side_data_2d ( int n, double side, double *area, double *radin,
double *radout );
double polygon_solid_angle_3d ( int n, double v[], double p[3] );
double polygon_x_2d ( int n, double v[] );
double polygon_y_2d ( int n, double v[] );
double polygon_xx_2d ( int n, double v[] );
double polygon_xy_2d ( int n, double v[] );
double polygon_yy_2d ( int n, double v[] );
double polyhedron_area_3d ( double coord[], int order_max, int face_num,
int node[], int node_num, int order[] );
double *polyhedron_centroid_3d ( double coord[], int order_max, int face_num,
int node[], int node_num, int order[] );
int polyhedron_contains_point_3d ( int node_num, int face_num,
int face_order_max, double v[], int face_order[], int face_point[],
double p[3] );
double polyhedron_volume_3d ( double coord[], int order_max, int face_num,
int node[], int node_num, int order[] );
double polyhedron_volume_3d_2 ( double coord[], int order_max, int face_num,
int node[], int node_num, int order[] );
double *polyline_arclength_nd ( int dim_num, int n, double p[] );
double *polyline_index_point_nd ( int dim_num, int n, double p[], double t );
double polyline_length_nd ( int dim_num, int n, double p[] );
double *polyline_points_nd ( int dim_num, int n, double p[], int nt );
double *polyloop_arclength_nd ( int dim_num, int nk, double pk[] );
double *polyloop_points_nd ( int dim_num, int nk, double pk[], int nt );
void provec ( int m, int n, double base[], double vecm[], double vecn[],
double vecnm[] );
double pyramid_volume_3d ( double h, double s );
double quad_area_2d ( double q[2*4] );
double quad_area2_2d ( double q[] );
double quad_area_3d ( double q[] );
int quad_contains_point_2d ( double q[2*4], double p[2] );
void quad_convex_random ( int *seed, double xy[] );
double quad_point_dist_2d ( double q[2*4], double p[2] );
double quad_point_dist_signed_2d ( double q[2*4], double p[2] );
void quad_point_near_2d ( double q[2*4], double p[2], double pn[2],
double *dist );
double *quat_conj ( double q[] );
double *quat_inv ( double q[] );
double *quat_mul ( double q1[], double q2[] );
double quat_norm ( double q[] );
float r4_abs ( float x );
int r4_nint ( float x );
double r8_abs ( double x );
double r8_acos ( double c );
double r8_asin ( double s );
double r8_atan ( double y, double x );
double r8_epsilon ( void );
double r8_huge ( void );
double r8_max ( double x, double y );
double r8_min ( double x, double y );
double r8_modp ( double x, double y );
int r8_nint ( double x );
double r8_normal_01 ( int *seed );
double r8_pi ( void );
double r8_sign ( double x );
int r8_sign_opposite_strict ( double r1, double r2 );
void r8_swap ( double *x, double *y );
double r8_uniform ( double b, double c, int *seed );
double r8_uniform_01 ( int *seed );
void r82vec_part_quick_a ( int n, double a[], int *l, int *r );
void r82vec_permute ( int n, double a[], int p[] );
void r82vec_print ( int n, double a[], char *title );
int *r82vec_sort_heap_index_a ( int n, double a[] );
void r82vec_sort_quick_a ( int n, double a[] );
void r8mat_copy ( int m, int n, double a1[], double a2[] );
double r8mat_det_2d ( double a[] );
double r8mat_det_3d ( double a[] );
double r8mat_det_4d ( double a[] );
double r8mat_det_5d ( double a[] );
double *r8mat_inverse_2d ( double a[] );
double *r8mat_inverse_3d ( double a[] );
double *r8mat_mv ( int m, int n, double a[], double x[] );
void r8mat_print ( int m, int n, double a[], char *title );
void r8mat_print_some ( int m, int n, double a[], int ilo, int jlo, int ihi,
int jhi, char *title );
int r8mat_solve ( int n, int rhs_num, double a[] );
double *r8mat_solve_2d ( double a[], double b[], double *det );
void r8mat_transpose_print ( int m, int n, double a[], char *title );
void r8mat_transpose_print_some ( int m, int n, double a[], int ilo, int jlo,
int ihi, int jhi, char *title );
double *r8mat_uniform_new ( int m, int n, double alo, double ahi, int *seed );
void r8mat_uniform_01 ( int m, int n, int *seed, double r[] );
double *r8mat_uniform_01_new ( int m, int n, int *seed );
double r8vec_angle_3d ( double u[], double v[] );
double *r8vec_any_normal ( int dim_num, double v1[] );
void r8vec_bracket ( int n, double x[], double xval, int *left, int *right );
void r8vec_copy ( int n, double a1[], double a2[] );
double r8vec_cross_product_2d ( double v1[2], double v2[2] );
double r8vec_cross_product_2d_affine ( double v0[2], double v1[2], double v2[2] );
double *r8vec_cross_product_3d ( double v1[3], double v2[3] );
double *r8vec_cross_product_3d_affine ( double v0[3], double v1[3], double v2[3] );
double r8vec_distance ( int dim_num, double v1[], double v2[] );
double r8vec_dot_product ( int n, double a1[], double a2[] );
double r8vec_dot_product_affine ( int n, double v0[], double v1[], double v2[] );
int r8vec_eq ( int n, double a1[], double a2[] );
int r8vec_gt ( int n, double a1[], double a2[] );
int r8vec_lt ( int n, double a1[], double a2[] );
double r8vec_max ( int n, double *rvec );
double r8vec_mean ( int n, double x[] );
double r8vec_min ( int n, double *rvec );
int r8vec_negative_strict ( int n, double a[] );
double r8vec_norm ( int n, double x[] );
double r8vec_norm_affine ( int n, double v0[], double v1[] );
double *r8vec_normal_01_new ( int n, int *seed );
double r8vec_normsq ( int n, double a[] );
double r8vec_normsq_affine ( int n, double v0[], double v1[] );
int r8vec_positive_strict ( int n, double a[] );
void r8vec_print ( int n, double a[], char *title );
void r8vec_print_2d ( double x, double y, char *title );
void r8vec_print_3d ( double x, double y, double z, char *title );
double r8vec_scalar_triple_product ( double v1[3], double v2[3], double v3[3] );
void r8vec_swap ( int n, double a1[], double a2[] );
double *r8vec_uniform_new ( int n, double b, double c, int *seed );
double *r8vec_uniform_01_new ( int n, int *seed );
double *r8vec_uniform_unit_new ( int m, int *seed );
double r8vec_variance ( int n, double x[] );
void r8vec_zero ( int n, double a[] );
double radec_distance_3d ( double ra1, double dec1, double ra2, double dec2 );
double *radec_to_xyz ( double ra, double dec );
double radians_to_degrees ( double angle );
void radians_to_dms ( double radians, int *degrees, int *minutes, int *seconds );
unsigned long random_initialize ( unsigned long seed );
void rotation_axis_vector_3d ( double axis[3], double angle, double v[3],
double w[3] );
void rotation_axis2mat_3d ( double axis[3], double angle, double a[3*3] );
void rotation_axis2quat_3d ( double axis[3], double angle, double q[4] );
void rotation_mat_vector_3d ( double a[3*3], double v[3], double w[3] );
void rotation_mat2axis_3d ( double a[3*3], double axis[3], double *angle );
void rotation_mat2quat_3d ( double a[3*3], double q[4] );
void rotation_quat_vector_3d ( double q[4], double v[3], double w[3] );
void rotation_quat2axis_3d ( double q[4], double axis[3], double *angle );
void rotation_quat2mat_3d ( double q[4], double a[3*3] );
void rtp_to_xyz ( double r, double theta, double phi, double xyz[3] );
int s_len_trim ( char *s );
double sec_deg ( double angle );
void segment_contains_point_1d ( double p1, double p2, double p3, double *u );
void segment_contains_point_2d ( double p1[2], double p2[2], double p3[2],
double u[2] );
void segment_point_coords_2d ( double p1[2], double p2[2], double p[2],
double *s, double *t );
void segment_point_coords_3d ( double p1[3], double p2[3], double p[3],
double *s, double *t );
double segment_point_dist_2d ( double p1[2], double p2[2], double p[2] );
double segment_point_dist_3d ( double p1[3], double p2[3], double p[3] );
void segment_point_near_2d ( double p1[2], double p2[2], double p[2],
double pn[2], double *dist, double *t );
void segment_point_near_3d ( double p1[3], double p2[3], double p[3],
double pn[3], double *dist, double *t );
double segments_curvature_2d ( double p1[2], double p2[2], double p3[2] );
double segments_dist_2d ( double p1[2], double p2[2], double q1[2],
double q2[2] );
double segments_dist_3d ( double p1[3], double p2[3], double q1[3],
double q2[3] );
double segments_dist_3d_old ( double p1[3], double p2[3], double q1[3],
double q2[3] );
double segments_int_1d ( double p1, double p2, double q1, double q2,
double *r1, double *r2 );
void segments_int_2d ( double p1[2], double p2[2], double p3[2],
double p4[2], int *flag, double p5[2] );
double shape_point_dist_2d ( double pc[2], double p1[2], int nside,
double p[2] );
void shape_point_near_2d ( double pc[2], double p1[2], int nside, double p[2],
double pn[2], double *dist );
void shape_print_3d ( int point_num, int face_num, int face_order_max,
double point_coord[], int face_order[], int face_point[] );
void shape_ray_int_2d ( double pc[2], double p1[2], int nside, double pa[2],
double pb[2], double pi[2] );
void simplex_lattice_layer_point_next ( int n, int c[], int v[], int *more );
void simplex_lattice_point_next ( int n, int c[], int v[], int *more );
int simplex_unit_lattice_point_num_nd ( int d, int s );
double simplex_unit_volume_nd ( int ndim );
double simplex_volume_nd ( int ndim, double a[] );
double sin_deg ( double angle );
double sin_power_int ( double a, double b, int n );
void soccer_shape_3d ( int point_num, int face_num, int face_order_max,
double point_coord[], int face_order[], int face_point[] );
void soccer_size_3d ( int *point_num, int *edge_num, int *face_num,
int *face_order_max );
void sort_heap_external ( int n, int *indx, int *i, int *j, int isgn );
double sphere_cap_area_2d ( double r, double h );
double sphere_cap_area_3d ( double r, double h );
double sphere_cap_area_nd ( int ndim, double r, double h );
double sphere_cap_volume_2d ( double r, double h );
double sphere_cap_volume_3d ( double r, double h );
double sphere_cap_volume_nd ( int ndim, double r, double h );
void sphere_dia2imp_3d ( double p1[3], double p2[3], double *r, double pc[3] );
double sphere_distance1 ( double lat1, double long1, double lat2,
double long2, double radius );
double sphere_distance2 ( double lat1, double long1, double lat2,
double long2, double radius );
double sphere_distance3 ( double lat1, double long1, double lat2,
double long2, double radius );
int sphere_exp_contains_point_3d ( double p1[3], double p2[3], double p3[3],
double p4[3], double p[3] );
void sphere_exp_point_near_3d ( double p1[3], double p2[3], double p3[3],
double p4[3], double p[3], double pn[3] );
void sphere_exp2imp_3d ( double p1[3], double p2[3], double p3[3], double p4[3],
double *r, double pc[3] );
void sphere_exp2imp_nd ( int n, double p[], double *r, double pc[] );
double sphere_imp_area_nd ( int n, double r );
int sphere_imp_contains_point_3d ( double r, double pc[3], double p[3] );
void sphere_imp_grid_icos_size ( int factor, int *node_num, int *edge_num,
int *triangle_num );
void sphere_imp_gridfaces_3d ( int maxtri, int nlat, int nlong, int *ntri,
int tri[] );
void sphere_imp_gridlines_3d ( int line_max, int nlat, int nlong, int *line_num,
int line[] );
void sphere_imp_gridpoints_3d ( double r, double pc[3], int maxpoint, int nlat,
int nlong, int *npoint, double p[] );
void sphere_imp_gridpoints_icos1 ( int factor, int node_num,
double node_xyz[] );
void sphere_imp_gridpoints_icos2 ( int factor, int node_num,
double node_xyz[] );
int sphere_imp_line_project_3d ( double r, double pc[3], int n, double p[],
int maxpnt2, double pp[], double thetamin, double thetamax );
void sphere_imp_local2xyz_3d ( double r, double pc[3], double theta,
double phi, double p[3] );
void sphere_imp_point_near_3d ( double r, double pc[3], double p[3],
double pn[3] );
void sphere_imp_point_project_3d ( double r, double pc[3], double p[3],
double pp[3] );
void sphere_imp_spiralpoints_3d ( double r, double pc[3], int n, double p[] );
double sphere_imp_volume_3d ( double r );
double sphere_imp_volume_nd ( int n, double r );
double sphere_imp_zone_area_3d ( double r, double h1, double h2 );
double sphere_imp_zone_volume_3d ( double r, double h1, double h2 );
void sphere_imp2exp_3d ( double r, double pc[3], double p1[3], double p2[3],
double p3[3], double p4[3] );
double sphere_k ( int n );
double sphere_triangle_angles_to_area ( double r, double a, double b, double c );
double sphere_triangle_contains_point ( double v1[3], double v2[3], double v3[3],
double p[3] );
void sphere_triangle_sides_to_angles ( double r, double as, double bs, double cs,
double *a, double *b, double *c );
void sphere_triangle_vertices_to_angles ( double r, double v1[3], double v2[3],
double v3[3], double *a, double *b, double *c );
double sphere_triangle_vertices_to_area ( double r, double v1[3], double v2[3],
double v3[3] );
void sphere_triangle_vertices_to_centroid ( double r, double v1[3], double v2[3],
double v3[3], double vs[] );
int sphere_triangle_vertices_to_orientation ( double v1[3], double v2[3], double v3[3] );
void sphere_triangle_vertices_to_sides ( double r, double v1[3], double v2[3],
double v3[3], double *as, double *bs, double *cs );
double sphere_unit_area_nd ( int n );
void sphere_unit_area_values ( int *n_data, int *n, double *area );
double *sphere_unit_sample_2d ( int *seed );
double *sphere_unit_sample_3d ( int *seed );
double *sphere_unit_sample_3d_2 ( int *seed );
double *sphere_unit_sample_nd ( int n, int *seed );
double *sphere_unit_sample_nd_2 ( int n, int *seed );
double *sphere_unit_sample_nd_3 ( int n, int *seed );
double sphere_unit_volume_nd ( int n );
void sphere_unit_volume_values ( int *n_data, int *n, double *volume );
double sphere01_distance_xyz ( double xyz1[3], double xyz2[3] );
double sphere01_polygon_area ( int n, double lat[], double lon[] );
double sphere01_triangle_angles_to_area ( double a, double b, double c );
void sphere01_triangle_sides_to_angles ( double as, double bs, double cs,
double *a, double *b, double *c );
void sphere01_triangle_vertices_to_angles ( double v1[3], double v2[3],
double v3[3], double *a, double *b, double *c );
double sphere01_triangle_vertices_to_area ( double v1[3], double v2[3],
double v3[3] );
void sphere01_triangle_vertices_to_midpoints ( double v1[3], double v2[3],
double v3[3], double m1[3], double m2[3], double m3[3] );
double *sphere01_triangle_vertices_to_centroid ( double v1[3], double v2[3], double v3[3] );
void sphere01_triangle_vertices_to_sides ( double v1[3], double v2[3],
double v3[3], double *as, double *bs, double *cs );
void string_2d ( int vec_num, double p1[], double p2[], int *string_num,
int order[], int string[] );
void super_ellipse_points_2d ( double pc[2], double r1, double r2,
double expo, double psi, int n, double p[] );
double tan_deg ( double angle );
double *tetrahedron_barycentric_3d ( double tetra[3*4], double p[3] );
double *tetrahedron_centroid_3d ( double tetra[3*4] );
void tetrahedron_circumsphere_3d ( double tetra[3*4], double *r, double pc[3] );
int tetrahedron_contains_point_3d ( double tetra[3*4], double p[3] );
double *tetrahedron_dihedral_angles_3d ( double tetra[] );
double *tetrahedron_edge_length_3d ( double tetra[3*4] );
void tetrahedron_face_angles_3d ( double tetra[], double angles[] );
void tetrahedron_face_areas_3d ( double tetra[], double areas[] );
void tetrahedron_insphere_3d ( double tetra[3*4], double *r, double pc[3] );
void tetrahedron_lattice_layer_point_next ( int c[], int v[], int *more );
void tetrahedron_lattice_point_next ( int c[], int v[], int *more );
double tetrahedron_quality1_3d ( double tetra[3*4] );
double tetrahedron_quality2_3d ( double tetra[3*4] );
double tetrahedron_quality3_3d ( double tetra[3*4] );
double tetrahedron_quality4_3d ( double tetra[3*4] );
void tetrahedron_rhombic_shape_3d ( int point_num, int face_num,
int face_order_max, double point_coord[], int face_order[],
int face_point[] );
void tetrahedron_rhombic_size_3d ( int *point_num, int *edge_num,
int *face_num, int *face_order_max );
void tetrahedron_sample_3d ( double tetra[3*4], int n, int *seed, double p[] );
void tetrahedron_shape_3d ( int point_num, int face_num, int face_order_max,
double point_coord[], int face_order[], int face_point[] );
void tetrahedron_size_3d ( int *point_num, int *edge_num, int *face_num,
int *face_order_max );
double *tetrahedron_solid_angles_3d ( double tetra[] );
int tetrahedron_unit_lattice_point_num_3d ( int s );
double tetrahedron_volume_3d ( double tetra[3*4] );
void theta2_adjust ( double *theta1, double *theta2 );
void theta3_adjust ( double *theta1, double *theta2, double *theta3 );
void timestamp ( void );
void tmat_init ( double a[4*4] );
void tmat_mxm ( double a[4*4], double b[4*4], double c[4*4] );
void tmat_mxp ( double a[4*4], double x[4], double y[4] );
void tmat_mxp2 ( double a[4*4], double p1[], double p2[], int n );
void tmat_mxv ( double a[4*4], double x[4], double y[4] );
void tmat_rot_axis ( double a[4*4], double b[4*4], double angle,
char axis );
void tmat_rot_vector ( double a[4*4], double b[4*4], double angle,
double v[3] );
void tmat_scale ( double a[4*4], double b[4*4], double s[3] );
void tmat_shear ( double a[4*4], double b[4*4], char *axis, double s );
void tmat_trans ( double a[4*4], double b[4*4], double v[3] );
double torus_volume_3d ( double r1, double r2 );
double *tp_to_xyz ( double theta, double phi );
void triangle_angles_2d ( double t[2*3], double angle[3] );
double *triangle_angles_2d_new ( double t[2*3] );
void triangle_angles_3d ( double t[3*3], double angle[3] );
double *triangle_angles_3d_new ( double t[3*3] );
double triangle_area_2d ( double t[2*3] );
double triangle_area_3d ( double t[3*3] );
double triangle_area_3d_2 ( double t[3*3] );
double triangle_area_3d_3 ( double t[3*3] );
double triangle_area_heron ( double s[3] );
double *triangle_area_vector_3d ( double t[3*3] );
double *triangle_barycentric_2d ( double t[2*3], double p[2] );
double *triangle_centroid_2d ( double t[2*3] );
double *triangle_centroid_3d ( double t[3*3] );
double *triangle_circumcenter_2d ( double t[2*3] );
double *triangle_circumcenter_2d_2 ( double t[2*3] );
double *triangle_circumcenter ( int n, double t[] );
void triangle_circumcircle_2d ( double t[2*3], double *r, double pc[2] );
void triangle_circumcircle_2d_2 ( double t[2*3], double *r, double pc[2] );
double triangle_circumradius_2d ( double t[2*3] );
void triangle_contains_line_exp_3d ( double t[3*3], double p1[3],
double p2[3], int *inside, double pint[3] );
void triangle_contains_line_par_3d ( double t[], double p0[], double pd[],
int *inside, double p[] );
int triangle_contains_point_2d_1 ( double t[2*3], double p[2] );
int triangle_contains_point_2d_2 ( double t[2*3], double p[2] );
int triangle_contains_point_2d_3 ( double t[2*3], double p[2] );
double triangle_diameter_2d ( double t[2*3] );
double *triangle_edge_length_2d ( double t[2*3] );
void triangle_gridpoints_2d ( double t[2*3], int sub_num, int grid_max,
int *grid_num, double p[] );
void triangle_incenter_2d ( double t[2*3], double pc[2] );
void triangle_incircle_2d ( double t[2*3], double pc[2], double *r );
double triangle_inradius_2d ( double t[2*3] );
int triangle_is_degenerate_nd ( int dim_num, double t[] );
void triangle_lattice_layer_point_next ( int c[], int v[], int *more );
void triangle_lattice_point_next ( int c[], int v[], int *more );
void triangle_line_imp_int_2d ( double t[2*3], double a, double b, double c,
int *int_num, double pint[] );
int triangle_orientation_2d ( double t[2*3] );
void triangle_orthocenter_2d ( double t[2*3], double p[2], int *flag );
double triangle_point_dist_2d ( double t[2*3], double p[2] );
double triangle_point_dist_3d ( double t[3*3], double p[3] );
double triangle_point_dist_signed_2d ( double t[2*3], double p[2] );
void triangle_point_near_2d ( double t[2*3], double p[2], double pn[2],
double *dist );
double triangle_quality_2d ( double t[2*3] );
int triangle_right_lattice_point_num_2d ( int a, int b );
void triangle_sample ( double t[2*3], int n, int *seed, double p[] );
int triangle_unit_lattice_point_num_2d ( int s );
void triangle_xsi_to_xy_2d ( double t[2*3], double xsi[3], double p[2] );
void triangle_xy_to_xsi_2d ( double t[2*3], double p[2], double xsi[3] );
void truncated_octahedron_shape_3d ( int point_num, int face_num,
int face_order_max, double point_coord[], int face_order[],
int face_point[] );
void truncated_octahedron_size_3d ( int *point_num, int *edge_num,
int *face_num, int *face_order_max );
void tube_2d ( double dist, int n, double p[], double p1[], double p2[] );
void tuple_next2 ( int n, int xmin[], int xmax[], int x[], int *rank );
void vector_directions_nd ( int dim_num, double v[], double angle[] );
void vector_rotate_2d ( double v1[2], double angle, double v2[2] );
void vector_rotate_3d ( double p1[3], double pa[3], double angle,
double p2[3] );
void vector_rotate_base_2d ( double p1[2], double pb[2], double angle,
double p2[2] );
double vector_separation_2d ( double v1[], double v2[] );
double vector_separation_3d ( double v1[], double v2[] );
double vector_separation_nd ( int n, double v1[], double v2[] );
void vector_unit_nd ( int n, double p[] );
int voxels_dist_l1_3d ( int v1[3], int v2[3] );
int voxels_dist_l1_nd ( int dim_num, int v1[], int v2[] );
void voxels_line_3d ( int p1[3], int p2[3], int n, int p[] );
void voxels_region_3d ( int maxlist, int nx, int ny, int nz, int ishow[],
int *list_num, int list[], int *nregion );
void voxels_step_3d ( int v1[3], int v2[3], int inc, int jnc, int knc,
int v3[3] );
void xy_to_polar ( double xy[2], double *r, double *t );
void xyz_to_radec ( double p[3], double *ra, double *dec );
void xyz_to_rtp ( double xyz[3], double *r, double *theta, double *phi );
void xyz_to_tp ( double xyz[3], double *theta, double *phi );