コード例 #1
0
ファイル: FaceFieldDrawer.cs プロジェクト: lulzzz/IvyFEM
        private void MakeNormal()
        {
            uint ptCnt = VertexArray.PointCount;

            if (NormalArray == null)
            {
                NormalArray = new double[ptCnt * 3];
            }
            for (int i = 0; i < 3 * ptCnt; i++)
            {
                NormalArray[i] = 0;
            }
            for (int idp = 0; idp < DrawParts.Count; idp++)
            {
                FaceFieldDrawPart dp = DrawParts[idp];
                uint elemCnt         = dp.ElemCount;
                for (int iElem = 0; iElem < elemCnt; iElem++)
                {
                    uint[]          vertexs = dp.GetVertexs((uint)iElem);
                    OpenTK.Vector3d c0      = new OpenTK.Vector3d(
                        VertexArray.VertexCoordArray[vertexs[0] * 3],
                        VertexArray.VertexCoordArray[vertexs[0] * 3 + 1],
                        VertexArray.VertexCoordArray[vertexs[0] * 3 + 2]);
                    OpenTK.Vector3d c1 = new OpenTK.Vector3d(
                        VertexArray.VertexCoordArray[vertexs[1] * 3],
                        VertexArray.VertexCoordArray[vertexs[1] * 3 + 1],
                        VertexArray.VertexCoordArray[vertexs[1] * 3 + 2]);
                    OpenTK.Vector3d c2 = new OpenTK.Vector3d(
                        VertexArray.VertexCoordArray[vertexs[2] * 3],
                        VertexArray.VertexCoordArray[vertexs[2] * 3 + 1],
                        VertexArray.VertexCoordArray[vertexs[2] * 3 + 2]);
                    double[] n;
                    double   area;
                    CadUtils.UnitNormalAreaTri3D(out n, out area, c0, c1, c2);
                    NormalArray[vertexs[0] * 3 + 0] += n[0];
                    NormalArray[vertexs[0] * 3 + 1] += n[1];
                    NormalArray[vertexs[0] * 3 + 2] += n[2];
                    NormalArray[vertexs[1] * 3 + 0] += n[0];
                    NormalArray[vertexs[1] * 3 + 1] += n[1];
                    NormalArray[vertexs[1] * 3 + 2] += n[2];
                    NormalArray[vertexs[2] * 3 + 0] += n[0];
                    NormalArray[vertexs[2] * 3 + 1] += n[1];
                    NormalArray[vertexs[2] * 3 + 2] += n[2];
                }
            }
            for (int iPt = 0; iPt < ptCnt; iPt++)
            {
                double[] p = new double[3];
                p[0] = NormalArray[iPt * 3];
                p[1] = NormalArray[iPt * 3 + 1];
                p[2] = NormalArray[iPt * 3 + 2];
                double invLen = 1.0 / Math.Sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]);
                NormalArray[0] *= invLen;
                NormalArray[1] *= invLen;
                NormalArray[2] *= invLen;
            }
        }