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 }