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); }
/// <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))); } }
/// <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); }
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); }
public BoundingBox3D GetBoundingBox(OpenTK.Matrix3d rot) { return(VertexArray.GetBoundingBox(rot)); }
public BoundingBox3D GetBoundingBox(OpenTK.Matrix3d rot) { //throw new NotImplementedException(); return(new BoundingBox3D()); }
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()); }
/// <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 );
/// <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 );
/// <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 );
/// <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) );
/// <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 );