private PolygonIntegrals GetPolygonIntegrals(int polyNumber, int a, int b, int c) { ProjectionIntegrals pi = GetProjectionIntegrals(polyNumber, a, b); Vector3 n = _polygons[polyNumber].Normal; float w = -_polygons[polyNumber].Distance; float k1 = 1.0f / n.Get(c); float k2 = k1 * k1; float k3 = k2 * k1; float k4 = k3 * k1; PolygonIntegrals integrals = new PolygonIntegrals(); integrals.Fa = k1 * pi.Pa; integrals.Fb = k1 * pi.Pb; integrals.Fc = -k2 * (n.Get(a) * pi.Pa + n.Get(b) * pi.Pb + w * pi.P1); integrals.Faa = k1 * pi.Paa; integrals.Fbb = k1 * pi.Pbb; integrals.Fcc = k3 * (idMath.Square(n.Get(a)) * pi.Paa + 2 * n.Get(a) * n.Get(b) * pi.Pab + idMath.Square(n.Get(b)) * pi.Pbb + w * (2 * (n.Get(a) * pi.Pa + n.Get(b) * pi.Pb) + w * pi.P1)); integrals.Faaa = k1 * pi.Paaa; integrals.Fbbb = k1 * pi.Pbbb; integrals.Fccc = -k4 * (idMath.Cube(n.Get(a)) * pi.Paaa + 3 * idMath.Square(n.Get(a)) * n.Get(b) * pi.Paab + 3 * n.Get(a) * idMath.Square(n.Get(b)) * pi.Pabb + idMath.Cube(n.Get(b)) * pi.Pbbb + 3 * w * (idMath.Square(n.Get(a)) * pi.Paa + 2 * n.Get(a) * n.Get(b) * pi.Pab + idMath.Square(n.Get(b)) * pi.Pbb) + w * w * (3 * (n.Get(a) * pi.Pa + n.Get(b) * pi.Pb) + w * pi.P1)); integrals.Faab = k1 * pi.Paab; integrals.Fbbc = -k2 * (n.Get(a) * pi.Pabb + n.Get(b) * pi.Pbbb + w * pi.Pbb); integrals.Fcca = k3 * (idMath.Square(n.Get(a)) * pi.Paaa + 2 * n.Get(a) * n.Get(b) * pi.Paab + idMath.Square(n.Get(b)) * pi.Pabb + w * (2 * (n.Get(a) * pi.Paa + n.Get(b) * pi.Pab) + w * pi.Pa)); return(integrals); }
private ProjectionIntegrals GetProjectionIntegrals(int polyNumber, int a, int b) { ProjectionIntegrals integrals = new ProjectionIntegrals(); TraceModelPolygon polygon = _polygons[polyNumber]; int count = polygon.Edges.Length; for(int i = 0; i < count; i++) { int edgeNumber = polygon.Edges[i]; Vector3 v1 = _vertices[_edges[(int) idMath.Abs(edgeNumber)].V[(edgeNumber < 0) ? 1 : 0]]; Vector3 v2 = _vertices[_edges[(int) idMath.Abs(edgeNumber)].V[(edgeNumber > 0) ? 1 : 0]]; float a0 = v1.Get(a); float b0 = v1.Get(b); float a1 = v2.Get(a); float b1 = v2.Get(b); float da = a1 - a0; float db = b1 - b0; float a0_2 = a0 * a0; float a0_3 = a0_2 * a0; float a0_4 = a0_3 * a0; float b0_2 = b0 * b0; float b0_3 = b0_2 * b0; float b0_4 = b0_3 * b0; float a1_2 = a1 * a1; float a1_3 = a1_2 * a1; float b1_2 = b1 * b1; float b1_3 = b1_2 * b1; float C1 = a1 + a0; float Ca = a1 * C1 + a0_2; float Caa = a1 * Ca + a0_3; float Caaa = a1 * Caa + a0_4; float Cb = b1 * (b1 + b0) + b0_2; float Cbb = b1 * Cb + b0_3; float Cbbb = b1 * Cbb + b0_4; float Cab = 3 * a1_2 + 2 * a1 * a0 + a0_2; float Kab = a1_2 + 2 * a1 * a0 + 3 * a0_2; float Caab = a0 * Cab + 4 * a1_3; float Kaab = a1 * Kab + 4 * a0_3; float Cabb = 4 * b1_3 + 3 * b1_2 * b0 + 2 * b1 * b0_2 + b0_3; float Kabb = b1_3 + 2 * b1_2 * b0 + 3 * b1 * b0_2 + 4 * b0_3; integrals.P1 += db * C1; integrals.Pa += db * Ca; integrals.Paa += db * Caa; integrals.Paaa += db * Caaa; integrals.Pb += da * Cb; integrals.Pbb += da * Cbb; integrals.Pbbb += da * Cbbb; integrals.Pab += db * (b1 * Cab + b0 * Kab); integrals.Paab += db * (b1 * Caab + b0 * Kaab); integrals.Pabb += da * (a1 * Cabb + a0 * Kabb); } integrals.P1 *= (1.0f / 2.0f); integrals.Pa *= (1.0f / 6.0f); integrals.Paa *= (1.0f / 12.0f); integrals.Paaa *= (1.0f / 20.0f); integrals.Pb *= (1.0f / -6.0f); integrals.Pbb *= (1.0f / -12.0f); integrals.Pbbb *= (1.0f / -20.0f); integrals.Pab *= (1.0f / 24.0f); integrals.Paab *= (1.0f / 60.0f); integrals.Pabb *= (1.0f / -60.0f); return integrals; }
private ProjectionIntegrals GetProjectionIntegrals(int polyNumber, int a, int b) { ProjectionIntegrals integrals = new ProjectionIntegrals(); TraceModelPolygon polygon = _polygons[polyNumber]; int count = polygon.Edges.Length; for (int i = 0; i < count; i++) { int edgeNumber = polygon.Edges[i]; Vector3 v1 = _vertices[_edges[(int)idMath.Abs(edgeNumber)].V[(edgeNumber < 0) ? 1 : 0]]; Vector3 v2 = _vertices[_edges[(int)idMath.Abs(edgeNumber)].V[(edgeNumber > 0) ? 1 : 0]]; float a0 = v1.Get(a); float b0 = v1.Get(b); float a1 = v2.Get(a); float b1 = v2.Get(b); float da = a1 - a0; float db = b1 - b0; float a0_2 = a0 * a0; float a0_3 = a0_2 * a0; float a0_4 = a0_3 * a0; float b0_2 = b0 * b0; float b0_3 = b0_2 * b0; float b0_4 = b0_3 * b0; float a1_2 = a1 * a1; float a1_3 = a1_2 * a1; float b1_2 = b1 * b1; float b1_3 = b1_2 * b1; float C1 = a1 + a0; float Ca = a1 * C1 + a0_2; float Caa = a1 * Ca + a0_3; float Caaa = a1 * Caa + a0_4; float Cb = b1 * (b1 + b0) + b0_2; float Cbb = b1 * Cb + b0_3; float Cbbb = b1 * Cbb + b0_4; float Cab = 3 * a1_2 + 2 * a1 * a0 + a0_2; float Kab = a1_2 + 2 * a1 * a0 + 3 * a0_2; float Caab = a0 * Cab + 4 * a1_3; float Kaab = a1 * Kab + 4 * a0_3; float Cabb = 4 * b1_3 + 3 * b1_2 * b0 + 2 * b1 * b0_2 + b0_3; float Kabb = b1_3 + 2 * b1_2 * b0 + 3 * b1 * b0_2 + 4 * b0_3; integrals.P1 += db * C1; integrals.Pa += db * Ca; integrals.Paa += db * Caa; integrals.Paaa += db * Caaa; integrals.Pb += da * Cb; integrals.Pbb += da * Cbb; integrals.Pbbb += da * Cbbb; integrals.Pab += db * (b1 * Cab + b0 * Kab); integrals.Paab += db * (b1 * Caab + b0 * Kaab); integrals.Pabb += da * (a1 * Cabb + a0 * Kabb); } integrals.P1 *= (1.0f / 2.0f); integrals.Pa *= (1.0f / 6.0f); integrals.Paa *= (1.0f / 12.0f); integrals.Paaa *= (1.0f / 20.0f); integrals.Pb *= (1.0f / -6.0f); integrals.Pbb *= (1.0f / -12.0f); integrals.Pbbb *= (1.0f / -20.0f); integrals.Pab *= (1.0f / 24.0f); integrals.Paab *= (1.0f / 60.0f); integrals.Pabb *= (1.0f / -60.0f); return(integrals); }