Пример #1
0
        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);
        }
Пример #2
0
		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;
		}
Пример #3
0
        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);
        }