Пример #1
0
        public BoundingBox3D GetBoundingBox(OpenTK.Matrix3d rot)
        {
            if (Drawers.Count == 0)
            {
                return(new BoundingBox3D(-0.5, 0.5, -0.5, 0.5, -0.5, 0.5));
            }
            BoundingBox3D bb = Drawers[0].GetBoundingBox(rot);

            for (int iDraw = 1; iDraw < Drawers.Count; iDraw++)
            {
                bb += Drawers[iDraw].GetBoundingBox(rot);
            }
            return(bb);
        }
Пример #2
0
 /// <summary>
 /// Z軸(001)を引数のベクトルvに回転させる行列を生成する
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public static M3d CreateRotationFromZ(V3d v)
 {
     v.Normalize();
     if (Math.Abs(v.Z - 1) < Th)
     {
         return(M3d.Identity);
     }
     else if (Math.Abs(v.Z + 1) < Th)
     {
         return(M3d.CreateRotationX(Math.PI));
     }
     else
     {
         return(M3d.CreateFromAxisAngle(V3d.Cross(v, Z), V3d.CalculateAngle(Z, v)));
     }
 }
Пример #3
0
        /// <summary>
        /// Z軸(001)を引数のベクトルvに回転させる行列を生成する
        /// </summary>
        /// <param name="v"></param>
        /// <returns></returns>
        public static M3d CreateRotationToZ(V3d v)
        {
            M3d rot;

            v.Normalize();
            if (Math.Abs(v.Z - 1) < Th)
            {
                rot = M3d.Identity;
            }
            else if (Math.Abs(v.Z + 1) < Th)
            {
                rot = M3d.CreateRotationX(Math.PI);
            }
            else
            {
                rot = M3d.CreateFromAxisAngle(V3d.Cross(Z, v), V3d.CalculateAngle(Z, v));
            }
            return(rot);
        }
Пример #4
0
        public override OpenTK.Matrix3d RotMatrix33()
        {
            var    rot = new OpenTK.Matrix3d();
            double ct  = Math.Cos(Theta);
            double st  = Math.Sin(Theta);

            rot[0, 0] = ct;
            rot[1, 0] = st;
            rot[2, 0] = 0.0;

            rot[0, 1] = -st;
            rot[1, 1] = ct;
            rot[2, 1] = 0.0;

            rot[0, 2] = 0.0;
            rot[1, 2] = 0.0;
            rot[2, 2] = 1.0;
            return(rot);
        }
Пример #5
0
 public BoundingBox3D GetBoundingBox(OpenTK.Matrix3d rot)
 {
     return(VertexArray.GetBoundingBox(rot));
 }
Пример #6
0
 public BoundingBox3D GetBoundingBox(OpenTK.Matrix3d rot)
 {
     //throw new NotImplementedException();
     return(new BoundingBox3D());
 }
Пример #7
0
        public BoundingBox3D GetBoundingBox(OpenTK.Matrix3d rot)
        {
            if (VertexCoordArray == null || VertexCoordArray.Length == 0)
            {
                return(new BoundingBox3D());
            }
            if (rot == null)
            {
                if (Dimension == 2)
                {
                    BoundingBox3D bb;
                    {
                        double x1 = VertexCoordArray[0];
                        double y1 = VertexCoordArray[1];
                        double z1 = 0.0;
                        bb = new BoundingBox3D(x1, x1, y1, y1, z1, z1);
                    }
                    for (uint iPt = 1; iPt < PointCount; iPt++)
                    {
                        double x1 = VertexCoordArray[iPt * 2];
                        double y1 = VertexCoordArray[iPt * 2 + 1];
                        double z1 = 0.0;
                        bb.MaxX = (x1 > bb.MaxX) ? x1 : bb.MaxX; bb.MinX = (x1 < bb.MinX) ? x1 : bb.MinX;
                        bb.MaxY = (y1 > bb.MaxY) ? y1 : bb.MaxY; bb.MinY = (y1 < bb.MinY) ? y1 : bb.MinY;
                        bb.MaxZ = (z1 > bb.MaxZ) ? z1 : bb.MaxZ; bb.MinZ = (z1 < bb.MinZ) ? z1 : bb.MinZ;
                    }
                    return(bb);
                }
                if (Dimension == 3)
                {
                    BoundingBox3D bb;
                    {
                        double x1 = VertexCoordArray[0];
                        double y1 = VertexCoordArray[1];
                        double z1 = 0.0;
                        bb = new BoundingBox3D(x1, x1, y1, y1, z1, z1);
                    }
                    for (uint iPt = 1; iPt < PointCount; iPt++)
                    {
                        double x1 = VertexCoordArray[iPt * 3];
                        double y1 = VertexCoordArray[iPt * 3 + 1];
                        double z1 = VertexCoordArray[iPt * 3 + 2];
                        bb.MaxX = (x1 > bb.MaxX) ? x1 : bb.MaxX; bb.MinX = (x1 < bb.MinX) ? x1 : bb.MinX;
                        bb.MaxY = (y1 > bb.MaxY) ? y1 : bb.MaxY; bb.MinY = (y1 < bb.MinY) ? y1 : bb.MinY;
                        bb.MaxZ = (z1 > bb.MaxZ) ? z1 : bb.MaxZ; bb.MinZ = (z1 < bb.MinZ) ? z1 : bb.MinZ;
                    }
                    return(bb);
                }
            }
            if (Dimension == 2)
            {
                double minX;
                double maxX;
                double minY;
                double maxY;
                double minZ;
                double maxZ;
                {
                    double x1 = VertexCoordArray[0];
                    double y1 = VertexCoordArray[1];
                    double z1 = 0.0;
                    minX = maxX = x1 * rot[0, 0] + y1 * rot[0, 1] + z1 * rot[0, 2];
                    minY = maxY = x1 * rot[1, 0] + y1 * rot[1, 1] + z1 * rot[1, 2];
                    minZ = maxZ = x1 * rot[2, 0] + y1 * rot[2, 1] + z1 * rot[2, 2];
                }
                for (uint iPt = 1; iPt < PointCount; iPt++)
                {
                    double x1 = VertexCoordArray[iPt * 2];
                    double y1 = VertexCoordArray[iPt * 2 + 1];
                    double z1 = 0.0;
                    double x2 = x1 * rot[0, 0] + y1 * rot[0, 1] + z1 * rot[0, 2];
                    double y2 = x1 * rot[1, 0] + y1 * rot[1, 1] + z1 * rot[1, 2];
                    double z2 = x1 * rot[2, 0] + y1 * rot[2, 1] + z1 * rot[2, 2];
                    maxX = (x2 > maxX) ? x2 : maxX; minX = (x2 < minX) ? x2 : minX;
                    maxY = (y2 > maxY) ? y2 : maxY; minY = (y2 < minY) ? y2 : minY;
                    maxZ = (z2 > maxZ) ? z2 : maxZ; minZ = (z2 < minZ) ? z2 : minZ;
                }

                double        c1X = (minX + maxX) * 0.5;
                double        c1Y = (minY + maxY) * 0.5;
                double        c1Z = (minZ + maxZ) * 0.5;
                double        c2X = c1X * rot[0, 0] + c1Y * rot[1, 0] + c1Z * rot[2, 0];
                double        c2Y = c1X * rot[0, 1] + c1Y * rot[1, 1] + c1Z * rot[2, 1];
                double        c2Z = c1X * rot[0, 2] + c1Y * rot[1, 2] + c1Z * rot[2, 2];
                double        hX  = (maxX - minX) * 0.5;
                double        hY  = (maxY - minY) * 0.5;
                double        hZ  = (maxZ - minZ) * 0.5;
                BoundingBox3D bb  = new BoundingBox3D(
                    c2X - hX, c2X + hX,
                    c2Y - hY, c2Y + hY,
                    c2Z - hZ, c2Z + hZ);
                return(bb);
            }
            if (Dimension == 3) // view axis alligned bounding box
            {
                double minX;
                double maxX;
                double minY;
                double maxY;
                double minZ;
                double maxZ;
                {
                    double x1 = VertexCoordArray[0];
                    double y1 = VertexCoordArray[1];
                    double z1 = VertexCoordArray[2];
                    minX = maxX = x1 * rot[0, 0] + y1 * rot[0, 1] + z1 * rot[0, 2];
                    minY = maxY = x1 * rot[1, 0] + y1 * rot[1, 1] + z1 * rot[1, 2];
                    minZ = maxZ = x1 * rot[2, 0] + y1 * rot[2, 1] + z1 * rot[2, 2];
                }
                for (uint iPt = 1; iPt < PointCount; iPt++)
                {
                    double x1 = VertexCoordArray[iPt * 3];
                    double y1 = VertexCoordArray[iPt * 3 + 1];
                    double z1 = VertexCoordArray[iPt * 3 + 2];
                    double x2 = x1 * rot[0, 0] + y1 * rot[0, 1] + z1 * rot[0, 2];
                    double y2 = x1 * rot[1, 0] + y1 * rot[1, 1] + z1 * rot[1, 2];
                    double z2 = x1 * rot[2, 0] + y1 * rot[2, 1] + z1 * rot[2, 2];
                    maxX = (x2 > maxX) ? x2 : maxX; minX = (x2 < minX) ? x2 : minX;
                    maxY = (y2 > maxY) ? y2 : maxY; minY = (y2 < minY) ? y2 : minY;
                    maxZ = (z2 > maxZ) ? z2 : maxZ; minZ = (z2 < minZ) ? z2 : minZ;
                }

                double        c1X = (minX + maxX) * 0.5;
                double        c1Y = (minY + maxY) * 0.5;
                double        c1Z = (minZ + maxZ) * 0.5;
                double        c2X = c1X * rot[0, 0] + c1Y * rot[1, 0] + c1Z * rot[2, 0];
                double        c2Y = c1X * rot[0, 1] + c1Y * rot[1, 1] + c1Z * rot[2, 1];
                double        c2Z = c1X * rot[0, 2] + c1Y * rot[1, 2] + c1Z * rot[2, 2];
                double        hX  = (maxX - minX) * 0.5;
                double        hY  = (maxY - minY) * 0.5;
                double        hZ  = (maxZ - minZ) * 0.5;
                BoundingBox3D bb  = new BoundingBox3D(
                    c2X - hX, c2X + hX,
                    c2Y - hY, c2Y + hY,
                    c2Z - hZ, c2Z + hZ);
                return(bb);
            }

            return(new BoundingBox3D());
        }
Пример #8
0
 /// <summary>
 /// 拡張メソッド.
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public static M4d ToMatrix4D(this M3d m) => new M4d(
     m.M11, m.M21, m.M31, 0,
     m.M12, m.M22, m.M32, 0,
     m.M13, m.M23, m.M33, 0,
     0, 0, 0, 1
     );
Пример #9
0
 /// <summary>
 /// 拡張メソッド.
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public static Matrix3D ToMatrix3D(this M3d m) => new Matrix3D(
     m.M11, m.M21, m.M31,
     m.M12, m.M22, m.M32,
     m.M13, m.M23, m.M33
     );
Пример #10
0
 /// <summary>
 /// 拡張メソッド.
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public static M3f ToM3f(this M3d m) => new M3f(
     (float)m.M11, (float)m.M12, (float)m.M13,
     (float)m.M21, (float)m.M22, (float)m.M23,
     (float)m.M31, (float)m.M32, (float)m.M33
     );
Пример #11
0
 /// <summary>
 /// 拡張メソッド.
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public static V3f Mult(this M3d m, V3f v) => new V3f(
     (float)(m.M11 * v.X + m.M12 * v.Y + m.M13 * v.Z),
     (float)(m.M21 * v.X + m.M22 * v.Y + m.M23 * v.Z),
     (float)(m.M31 * v.X + m.M32 * v.Y + m.M33 * v.Z)
     );
Пример #12
0
 /// <summary>
 /// 拡張メソッド.
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public static V3d Mult(this M3d m, V3d v) => new V3d(
     m.M11 * v.X + m.M12 * v.Y + m.M13 * v.Z,
     m.M21 * v.X + m.M22 * v.Y + m.M23 * v.Z,
     m.M31 * v.X + m.M32 * v.Y + m.M33 * v.Z
     );