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 |
|
{ |