| 367 |
|
|
| 368 |
|
|
| 369 |
|
|
| 370 |
+ |
static int |
| 371 |
+ |
compare(r1,r2,marge) |
| 372 |
+ |
TRAYON r1, r2; |
| 373 |
+ |
double marge; |
| 374 |
|
|
| 375 |
+ |
{ |
| 376 |
+ |
double arctg1, arctg2; |
| 377 |
+ |
|
| 378 |
+ |
arctg1 = atan2(Y(r1),X(r1)); |
| 379 |
+ |
arctg2 = atan2(Y(r2),X(r2)); |
| 380 |
+ |
if ((arctg1 - marge <= arctg2) && (arctg1 + marge >= arctg2)) return 1; |
| 381 |
+ |
else return 0; |
| 382 |
+ |
} |
| 383 |
+ |
|
| 384 |
+ |
|
| 385 |
+ |
|
| 386 |
+ |
|
| 387 |
|
static |
| 388 |
|
sortie(r) |
| 389 |
|
TRAYON r; |
| 522 |
|
|
| 523 |
|
|
| 524 |
|
|
| 509 |
– |
static int |
| 510 |
– |
compare(r1,r2,marge) |
| 511 |
– |
TRAYON r1, r2; |
| 512 |
– |
double marge; |
| 513 |
– |
|
| 514 |
– |
{ |
| 515 |
– |
double arctg1, arctg2; |
| 516 |
– |
|
| 517 |
– |
arctg1 = atan2(Y(r1),X(r1)); |
| 518 |
– |
arctg2 = atan2(Y(r2),X(r2)); |
| 519 |
– |
if ((arctg1 - marge <= arctg2) && (arctg1 + marge >= arctg2)) return 1; |
| 520 |
– |
else return 0; |
| 521 |
– |
} |
| 522 |
– |
|
| 523 |
– |
|
| 524 |
– |
|
| 525 |
|
#define ensuite(rayon,prob_passage,destination) r_suite = rayon; \ |
| 526 |
|
r_suite.e = prob_passage(rayon)*rayon.e; \ |
| 527 |
|
r_suite.dest = destination; \ |
| 633 |
|
|
| 634 |
|
|
| 635 |
|
|
| 636 |
– |
static double |
| 637 |
– |
l_get_val() |
| 638 |
– |
|
| 639 |
– |
{ |
| 640 |
– |
int val, dir, i, trouve, curseur; |
| 641 |
– |
int nb; |
| 642 |
– |
double valeur; |
| 643 |
– |
TRAYON *rayt, raynull; |
| 644 |
– |
|
| 645 |
– |
if (prismclock < 0 || prismclock < eclock) setprism(); |
| 646 |
– |
if (bidon == BADVAL) { |
| 647 |
– |
errno = EDOM; |
| 648 |
– |
return(0.0); |
| 649 |
– |
} |
| 650 |
– |
val = (int)(argument(1) + .5); |
| 651 |
– |
dir = (int)(argument(2) + .5); |
| 652 |
– |
nb = (int)(argument(3) + .5); |
| 653 |
– |
X(raynull) = bidon; |
| 654 |
– |
Y(raynull) = Z(raynull) = 0.; |
| 655 |
– |
raynull.e = 0.; |
| 656 |
– |
trouve = curseur = 0; |
| 657 |
– |
if ( !nosource && nb==2 ) nb=1; /* on est en train de tracer la source |
| 658 |
– |
a partir de sa seconde source virtuelle */ |
| 659 |
– |
#ifdef DEBUG |
| 660 |
– |
fprintf(stderr, " On considere le rayon no: %d\n", nb); |
| 661 |
– |
#endif |
| 662 |
– |
for(i=0; i < nbrayons &&!trouve; i++) |
| 663 |
– |
{ |
| 664 |
– |
if(ray[i].v[0] * dir * sens >= 0.) curseur ++; |
| 665 |
– |
if(curseur == nb) |
| 666 |
– |
{ |
| 667 |
– |
rayt = &ray[i]; |
| 668 |
– |
trouve = 1; |
| 669 |
– |
} |
| 670 |
– |
} |
| 671 |
– |
if(!trouve) rayt = &raynull; |
| 672 |
– |
switch(val) { |
| 673 |
– |
case 0 : valeur = rayt->v[0]; |
| 674 |
– |
break; |
| 675 |
– |
case 1 : valeur = rayt->v[1]; |
| 676 |
– |
break; |
| 677 |
– |
case 2 : valeur = rayt->v[2]; |
| 678 |
– |
break; |
| 679 |
– |
case 3 : valeur = rayt->e; |
| 680 |
– |
break; |
| 681 |
– |
default : errno = EDOM; return(0.0); |
| 682 |
– |
} |
| 683 |
– |
#ifdef DEBUG |
| 684 |
– |
fprintf(stderr, "get_val( %i, %i, %i) = %lf\n",val,dir,nb,valeur); |
| 685 |
– |
#endif |
| 686 |
– |
return valeur; |
| 687 |
– |
} |
| 688 |
– |
|
| 689 |
– |
|
| 636 |
|
static |
| 637 |
|
setprism() |
| 692 |
– |
|
| 638 |
|
{ |
| 639 |
|
double d; |
| 640 |
|
TRAYON r_initial,rsource; |
| 729 |
|
bidon = BADVAL; |
| 730 |
|
return; |
| 731 |
|
} |
| 732 |
+ |
|
| 733 |
+ |
|
| 734 |
+ |
static double |
| 735 |
+ |
l_get_val() |
| 736 |
+ |
|
| 737 |
+ |
{ |
| 738 |
+ |
int val, dir, i, trouve, curseur; |
| 739 |
+ |
int nb; |
| 740 |
+ |
double valeur; |
| 741 |
+ |
TRAYON *rayt, raynull; |
| 742 |
+ |
|
| 743 |
+ |
if (prismclock < 0 || prismclock < eclock) setprism(); |
| 744 |
+ |
if (bidon == BADVAL) { |
| 745 |
+ |
errno = EDOM; |
| 746 |
+ |
return(0.0); |
| 747 |
+ |
} |
| 748 |
+ |
val = (int)(argument(1) + .5); |
| 749 |
+ |
dir = (int)(argument(2) + .5); |
| 750 |
+ |
nb = (int)(argument(3) + .5); |
| 751 |
+ |
X(raynull) = bidon; |
| 752 |
+ |
Y(raynull) = Z(raynull) = 0.; |
| 753 |
+ |
raynull.e = 0.; |
| 754 |
+ |
trouve = curseur = 0; |
| 755 |
+ |
if ( !nosource && nb==2 ) nb=1; /* on est en train de tracer la source |
| 756 |
+ |
a partir de sa seconde source virtuelle */ |
| 757 |
+ |
#ifdef DEBUG |
| 758 |
+ |
fprintf(stderr, " On considere le rayon no: %d\n", nb); |
| 759 |
+ |
#endif |
| 760 |
+ |
for(i=0; i < nbrayons &&!trouve; i++) |
| 761 |
+ |
{ |
| 762 |
+ |
if(ray[i].v[0] * dir * sens >= 0.) curseur ++; |
| 763 |
+ |
if(curseur == nb) |
| 764 |
+ |
{ |
| 765 |
+ |
rayt = &ray[i]; |
| 766 |
+ |
trouve = 1; |
| 767 |
+ |
} |
| 768 |
+ |
} |
| 769 |
+ |
if(!trouve) rayt = &raynull; |
| 770 |
+ |
switch(val) { |
| 771 |
+ |
case 0 : valeur = rayt->v[0]; |
| 772 |
+ |
break; |
| 773 |
+ |
case 1 : valeur = rayt->v[1]; |
| 774 |
+ |
break; |
| 775 |
+ |
case 2 : valeur = rayt->v[2]; |
| 776 |
+ |
break; |
| 777 |
+ |
case 3 : valeur = rayt->e; |
| 778 |
+ |
break; |
| 779 |
+ |
default : errno = EDOM; return(0.0); |
| 780 |
+ |
} |
| 781 |
+ |
#ifdef DEBUG |
| 782 |
+ |
fprintf(stderr, "get_val( %i, %i, %i) = %lf\n",val,dir,nb,valeur); |
| 783 |
+ |
#endif |
| 784 |
+ |
return valeur; |
| 785 |
+ |
} |
| 786 |
+ |
|
| 787 |
|
|
| 788 |
|
setprismfuncs() |
| 789 |
|
{ |