public static void Torus(float ringRadius = 0.2f, float tubeRadius = 0.8f, int numc = 6, int numt = 12) { List<float> data = null; foreach (KeyValuePair<tshape, List<float>> kvp in torusData) { if (kvp.Key.rr == ringRadius && kvp.Key.tr == tubeRadius && kvp.Key.nc == numc && kvp.Key.nt == numt) { data = kvp.Value; } } if (data == null) { tshape key = new tshape(); key.rr = ringRadius; key.tr = tubeRadius; key.nc = numc; key.nt = numt; KeyValuePair<tshape, List<float>> newItem = new KeyValuePair<tshape, List<float>>(key, new List<float>()); torusData.Add(newItem); data = torusData[torusData.Count - 1].Value; int i, j, k; double s, t, x, y, z, twopi; twopi = 2.0 * (double)Math.PI; for (i = 0; i < numc; i++) { for (j = 0; j <= numt; j++) { for (k = 1; k >= 0; k--) { s = (i + k) % numc + 0.5; t = j % numt; x = (tubeRadius + ringRadius * Math.Cos(s * twopi / numc)) * Math.Cos(t * twopi / numt); y = (tubeRadius + ringRadius * Math.Cos(s * twopi / numc)) * Math.Sin(t * twopi / numt); z = ringRadius * Math.Sin(s * twopi / numc); float[] n = { (float)x, (float)y, (float)z }; n = Normalize(n); //GL.Normal3(n); data.Add(n[0]); data.Add(n[1]); data.Add(n[2]); //GL.Vertex3(x, y, z); data.Add((float)x); data.Add((float)y); data.Add((float)z); } } } } GL.Begin(PrimitiveType.QuadStrip); int a = 0; while (a < data.Count) { GL.Normal3(data[a++], data[a++], data[a++]); GL.Vertex3(data[a++], data[a++], data[a++]); } GL.End(); }
public static void Torus(float ringRadius = 0.2f, float tubeRadius = 0.8f, int numc = 6, int numt = 12) { List <float> data = null; foreach (KeyValuePair <tshape, List <float> > kvp in torusData) { if (kvp.Key.rr == ringRadius && kvp.Key.tr == tubeRadius && kvp.Key.nc == numc && kvp.Key.nt == numt) { data = kvp.Value; } } if (data == null) { tshape key = new tshape(); key.rr = ringRadius; key.tr = tubeRadius; key.nc = numc; key.nt = numt; KeyValuePair <tshape, List <float> > newItem = new KeyValuePair <tshape, List <float> >(key, new List <float>()); torusData.Add(newItem); data = torusData[torusData.Count - 1].Value; int i, j, k; double s, t, x, y, z, twopi; twopi = 2.0 * (double)Math.PI; for (i = 0; i < numc; i++) { for (j = 0; j <= numt; j++) { for (k = 1; k >= 0; k--) { s = (i + k) % numc + 0.5; t = j % numt; x = (tubeRadius + ringRadius * Math.Cos(s * twopi / numc)) * Math.Cos(t * twopi / numt); y = (tubeRadius + ringRadius * Math.Cos(s * twopi / numc)) * Math.Sin(t * twopi / numt); z = ringRadius * Math.Sin(s * twopi / numc); float[] n = { (float)x, (float)y, (float)z }; n = Normalize(n); //GL.Normal3(n); data.Add(n[0]); data.Add(n[1]); data.Add(n[2]); //GL.Vertex3(x, y, z); data.Add((float)x); data.Add((float)y); data.Add((float)z); } } } } GL.Begin(PrimitiveType.QuadStrip); int a = 0; while (a < data.Count) { GL.Normal3(data[a++], data[a++], data[a++]); GL.Vertex3(data[a++], data[a++], data[a++]); } GL.End(); }