ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/acismesh/geo_int_stra_plane.cpp
Revision: 1
Committed: Mon Jun 11 22:53:07 2007 UTC (17 years, 11 months ago)
File size: 2692 byte(s)
Log Message:

File Contents

# User Rev Content
1 1 /*****************************************************************
2    
3     geo_int_stra_plane.c Type:Func
4    
5     Intersection straight plane
6    
7     Date de creation : Tue Jul 8 09:36:37 1997
8    
9     Derniere version : Thu Jul 10 10:03:31 1997
10    
11    
12    
13     Vincent FRANCOIS
14    
15     *****************************************************************/
16    
17    
18    
19    
20    
21     /**************************/
22     /* include */
23     #include <stdio.h>
24     #include <string.h>
25     #include <math.h>
26     #include "const.h"
27     #include "memoire.h"
28     #include "struct.h"
29     #include "prototype.h"
30    
31    
32    
33     /**************************/
34     /* variables globales */
35    
36    
37    
38     /**************************/
39     /* programme principal */
40    
41     int geo_int_stra_plane(struct s_edge *edge,struct s_straight *straight,float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3,float *x,float *y,float *z)
42     {
43     struct s_par_straight *param;
44     float ox[4],oy[4],oz[4],deno,t,tt,ttt,delta,res[4];
45     int n1,n2;
46    
47     param=straight->param;
48     /* definition du plan */
49     ox[0]=x2-x1;ox[1]=y2-y1;ox[2]=z2-z1;
50     oy[0]=x3-x1;oy[1]=y3-y1;oy[2]=z3-z1;
51     PVEC(oz,ox,oy);
52     oz[3]=(-oz[0]*x1-oz[1]*y1-oz[2]*z1);
53    
54     /* resolution */
55     deno=oz[0]*param->dir[0]+oz[1]*param->dir[1]+oz[2]*param->dir[2];
56     if (EGAL(deno,0.0,0.0001)) return(0);
57     t=oz[0]*param->root[0]+oz[1]*param->root[1]+oz[2]*param->root[2]+oz[3];
58     t=(-t)/deno;
59    
60    
61     /* validation de la resolution */
62     if ((edge->t2>0.) && ((t<edge->t1) || (t>edge->t2+edge->t1))) return(0);
63     if ((edge->t2<0.) && ((t>edge->t1) || (t<edge->t2+edge->t1))) return(0);
64     *x=param->root[0]+t*param->dir[0];
65     *y=param->root[1]+t*param->dir[1];
66     *z=param->root[2]+t*param->dir[2];
67    
68     delta=ox[0]*oy[1]-ox[1]*oy[0];
69     if (EGAL(delta,0.0,0.0001))
70     {
71     delta=ox[0]*oy[2]-ox[2]*oy[0];
72     if (EGAL(delta,0.0,0.0001))
73     {
74     delta=ox[1]*oy[2]-ox[2]*oy[1];
75     n1=1;n2=2;
76     }
77     else
78     {
79     n1=0;n2=2;
80     }
81     }
82     else
83     {
84     n1=0;n2=1;
85     }
86     res[0]=*x-x1;res[1]=*y-y1;res[2]=*z-z1;
87    
88     tt=(res[n1]*oy[n2]-res[n2]*oy[n1])/delta;
89     ttt=(ox[n1]*res[n2]-ox[n2]*res[n1])/delta;
90     if ((tt<0.)||(tt>=1.)) return(0);
91     if ((ttt<0.)||(ttt>=1.)) return(0);
92     return(1);
93    
94    
95     }