git.lucas.co / hou-control
git clone https://git.lucas.co/hou-control.git

vex/include/sphere.h (2.6K)

 1 /*
 2 Create sphere
 3 Equator is latitude (horizontal)
 4 */
 5 
 6 int h_resolution = 12;
 7 int v_resolution = 6;
 8 int points[];
 9 
10 
11 function vector get_cartesian_position(float h_angle, v_angle){
12     vector position;
13     position.x = sin(v_angle)*cos(h_angle);
14     position.y = sin(v_angle)*sin(h_angle);
15     position.z = cos(v_angle);
16     return position;
17 }
18 
19 function void add_face(int points[]; int upper_left, upper_right, lower_right, lower_left){
20     int prim = addprim(geoself(), "poly");
21     addvertex(0, prim, points[lower_left]);
22     addvertex(0, prim, points[lower_right]);
23     addvertex(0, prim, points[upper_right]);
24     addvertex(0, prim, points[upper_left]);
25 
26 }
27 
28 
29 // Create sphere points
30 for (int v_index=0; v_index<=v_resolution; v_index++){
31     float v_angle=v_index*(M_PI/v_resolution);
32 
33     // Handle poles
34     if(v_index==0 || v_index==v_resolution){
35         vector position=get_cartesian_position(0, v_angle);
36         int pt = addpoint(0, position);
37         append(points, pt);
38     }
39 
40     // All horizontal circles
41     else{
42         for (int h_index=0; h_index<h_resolution; h_index++){
43             float h_angle=h_index*(2* M_PI/h_resolution);
44             vector position=get_cartesian_position(h_angle, v_angle);
45             int pt = addpoint(0, position);
46             append(points, pt);
47         }
48     }
49 }
50 
51 // Create polygons based on point indices
52 for (int v_index = 0; v_index < v_resolution; v_index++) {
53     for (int h_index = 0; h_index < h_resolution; h_index++) {
54         int lower_left, lower_right, upper_left, upper_right;
55 
56         // Upper pole
57         if (v_index == 0) {
58             upper_left = 0;
59             upper_right = upper_left;
60             lower_right = h_index + 1;
61             lower_left = (h_index + 1) % h_resolution + 1;
62         }
63         // Lower pole
64         else if (v_index == v_resolution - 1) {
65             int bottom_pole_index = len(points) - 1;
66             upper_left = bottom_pole_index - (h_resolution - h_index);
67             if(h_index==0){
68                 upper_right = bottom_pole_index - 1;
69             }
70             else{
71                 upper_right = upper_left - 1;
72                 }
73             lower_left = bottom_pole_index;
74             lower_right = lower_left;
75 
76         // Middle rows
77         } else {
78             lower_left = 1 + (v_index - 1) * h_resolution + h_index;
79             lower_right = lower_left + 1;
80             if (h_index == h_resolution - 1) {
81                 lower_right = 1 + (v_index - 1) * h_resolution;
82             }
83             upper_left = lower_left + h_resolution;
84             upper_right = lower_right + h_resolution;
85         }
86 
87         add_face(points, upper_left, upper_right, lower_right, lower_left);
88     }
89 }