1953{
1954 int nphi = GetNumberOfRotationSteps();
1955 bool twopi = abs(dphi - 2 * M_PI) < 1e-6;
1956 int n = v.size();
1957 if (twopi) {
1958 int nv = n * nphi;
1959 int nf = nv;
1960 AllocateMemory(nv, nf);
1961
1962 auto vnum = [nphi, n](int iphi, int ip) {
1963 return (iphi % nphi) * n + (ip % n) + 1;
1964 };
1965
1966 int fcount = 1;
1967 double dfi = dphi / nphi;
1968 for (int i = 0; i < nphi; i++) {
1969 double fi = phi + i * dfi;
1970 double cf = cos(fi), sf = sin(fi);
1971 for (int j = 0; j < n; j++) pV[vnum(i, j)].set(v[j].r * cf, v[j].r * sf, v[j].z);
1972 for (int j = 0; j < n; j++) pF[fcount++ ] = G4Facet(vnum(i, j), 0, vnum(i, j + 1), 0, vnum(i + 1, j + 1), 0, vnum(i + 1, j), 0);
1973 }
1974 } else {
1975
1976 nphi = int(nphi * (dphi / (2 * M_PI)) + 0.5);
1977 nphi = nphi > 3 ? nphi : 3;
1978
1979
1980
1981 int nv = n * nphi;
1982 int nf = n * (nphi - 1) + 2 * t.size();
1983 AllocateMemory(nv, nf);
1984
1985 auto vnum = [n](int iphi, int ip) {
1986 return iphi * n + (ip % n) + 1;
1987 };
1988
1989 int fcount = 1;
1990 double dfi = dphi / (nphi - 1);
1991 for (int i = 0; i < nphi; i++) {
1992 double fi = phi + i * dfi;
1993 double cf = cos(fi), sf = sin(fi);
1994 for (int j = 0; j < n; j++) pV[vnum(i, j)].set(v[j].r * cf, v[j].r * sf, v[j].z);
1995 if (i == nphi - 1) break;
1996 for (int j = 0; j < n; j++) pF[fcount++] = G4Facet(vnum(i, j), 0, vnum(i, j + 1), 0, vnum(i + 1, j + 1), 0, vnum(i + 1, j), 0);
1997 }
1998
1999 for (const triangle_t& k : t) pF[fcount++] = G4Facet(vnum(0, k.i0), 0, vnum(0, k.i2), 0, vnum(0, k.i1), 0, 0, 0);
2000 int i = nphi - 1;
2001 for (const triangle_t& k : t) pF[fcount++] = G4Facet(vnum(i, k.i0), 0, vnum(i, k.i1), 0, vnum(i, k.i2), 0, 0, 0);
2002
2003 }
2004 SetReferences();
2005
2006}