Пример #1
0
 public bool IntersectsBox(RHBoundingBox box)
 {
     if (minPoint == null || box.minPoint == null) return false;
     bool xOverlap = Overlap(minPoint.x, maxPoint.x, box.minPoint.x, box.maxPoint.x);
     bool yOverlap = Overlap(minPoint.y, maxPoint.y, box.minPoint.y, box.maxPoint.y);
     bool zOverlap = Overlap(minPoint.z, maxPoint.z, box.minPoint.z, box.maxPoint.z);
     return xOverlap && yOverlap && zOverlap;
 }
Пример #2
0
        public HashSet <TopoVertex> SearchBox(RHBoundingBox box)
        {
            HashSet <TopoVertex> set = new HashSet <TopoVertex>();

            if (leaf != null || left != null)
            {
                SearchBoxTraverse(box, set);
            }
            return(set);
        }
Пример #3
0
 private void SearchBoxTraverse(RHBoundingBox box, HashSet <TopoVertex> set)
 {
     if (IsLeaf)
     {
         foreach (TopoVertex v in leaf.vertices)
         {
             if (box.ContainsPoint(v.pos))
             {
                 set.Add(v);
             }
         }
         return;
     }
 }
 private void SearchBoxTraverse(RHBoundingBox box,HashSet<TopoVertex> set)
 {
     if (IsLeaf)
     {
         foreach (TopoVertex v in leaf.vertices)
         {
             if (box.ContainsPoint(v.pos))
                 set.Add(v);
         }
         return;
     }
 }
 public HashSet<TopoVertex> SearchBox(RHBoundingBox box)
 {
     HashSet<TopoVertex> set = new HashSet<TopoVertex>();
     if(leaf!=null || left!=null)
         SearchBoxTraverse(box,set);
     return set;
 }
Пример #6
0
        public void FitBoundingBox(RHBoundingBox box)
        {
            float bedRadius = (float)(1.5 * Math.Sqrt((ps.PrintAreaDepth * ps.PrintAreaDepth + ps.PrintAreaHeight * ps.PrintAreaHeight + ps.PrintAreaWidth * ps.PrintAreaWidth) * 0.25));
            RHVector3 shift = new RHVector3(-ps.BedLeft - 0.5 * ps.PrintAreaWidth, -ps.BedFront - 0.5 * ps.PrintAreaDepth, -0.5 * ps.PrintAreaHeight);
            viewCenter = box.Center.asVector3();
            distance = defaultDistance;
            int loops = 5;
            while (loops > 0)
            {
                loops--;
                angle = 15.0 * Math.PI / 180;
                double ratio = (double)control.gl.Width / (double)control.gl.Height;
                Vector3 camPos = CameraPosition;
                Matrix4 lookAt = Matrix4.LookAt(camPos.X, camPos.Y, camPos.Z, viewCenter.X, viewCenter.Y, viewCenter.Z, 0, 0, 1.0f);
                Matrix4 persp;
                Vector3 dir = new Vector3();
                Vector3.Subtract(ref viewCenter, ref camPos, out dir);
                dir.Normalize();
                float dist;
                Vector3.Dot(ref dir, ref camPos, out dist);
                dist = -dist;

                float nearDist = Math.Max(1, dist - bedRadius);
                float farDist = Math.Max(bedRadius * 2, dist + bedRadius);
                float nearHeight = 2.0f * (float)Math.Tan(angle) * dist;

                if (control.toolParallelProjection.Checked)
                {
                    persp = Matrix4.CreateOrthographic(nearHeight * (float)ratio, nearHeight, nearDist, farDist);
                    loops = 0;
                }
                else
                {
                    persp = Matrix4.CreatePerspectiveFieldOfView((float)(angle * 2.0), (float)ratio, nearDist, farDist);
                }
                Matrix4 trans = Matrix4.Mult(lookAt, persp);
                RHVector3 min = new RHVector3(0, 0, 0);
                RHVector3 max = new RHVector3(0, 0, 0);
                Vector4 pos;
                RHBoundingBox bb = new RHBoundingBox();
                pos = Vector4.Transform(box.minPoint.asVector4(), trans);
                bb.Add(new RHVector3(pos));
                pos = Vector4.Transform(box.maxPoint.asVector4(), trans);
                bb.Add(new RHVector3(pos));
                Vector4 pnt = new Vector4((float)box.xMin, (float)box.yMax, (float)box.zMin, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                pnt = new Vector4((float)box.xMin, (float)box.yMax, (float)box.zMin, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                pnt = new Vector4((float)box.xMax, (float)box.yMax, (float)box.zMin, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                pnt = new Vector4((float)box.xMin, (float)box.yMax, (float)box.zMax, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                pnt = new Vector4((float)box.xMin, (float)box.yMin, (float)box.zMax, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                pnt = new Vector4((float)box.xMax, (float)box.yMin, (float)box.zMax, 1);
                pos = Vector4.Transform(pnt, trans);
                bb.Add(new RHVector3(pos));
                double fac = Math.Max(Math.Abs(bb.xMin), Math.Abs(bb.xMax));
                fac = Math.Max(fac, Math.Abs(bb.yMin));
                fac = Math.Max(fac, Math.Abs(bb.yMax));
                distance *= fac * 1.03;
                if (distance < 1) angle = Math.Atan(distance * Math.Tan(15.0 * Math.PI / 180.0));
            }
        }
Пример #7
0
 public RHBoundingBox ObjectsBoundingBox()
 {
     RHBoundingBox b = new RHBoundingBox();
     foreach (PrintModel model in Main.main.objectPlacement.ListObjects(false))
     {
         b.Add(model.bbox.minPoint);
         b.Add(model.bbox.maxPoint);
     }
     if (b.minPoint == null) return PrinterBoundingBox();
     return b;
 }
Пример #8
0
 public RHBoundingBox PrinterBoundingBox()
 {
     RHBoundingBox b = new RHBoundingBox();
     b.Add(ps.BedLeft, ps.BedFront, -0.0 * ps.PrintAreaHeight);
     b.Add(ps.BedLeft + ps.PrintAreaWidth, ps.BedFront + ps.PrintAreaDepth, 1.0 * ps.PrintAreaHeight);
     return b;
 }
Пример #9
0
 public void Add(RHBoundingBox box)
 {
     if (box.minPoint == null) return;
     Add(box.minPoint);
     Add(box.maxPoint);
 }
Пример #10
0
 /// <summary>
 /// Convert the box range into bitpattern for a fast intersection test.
 /// 
 /// </summary>
 /// <param name="box"></param>
 /// <returns></returns>
 public int RangeToBits(RHBoundingBox box)
 {
     double dx = (maxPoint.x - minPoint.x) / 10;
     double dy = (maxPoint.y - minPoint.y) / 10;
     double dz = (maxPoint.z - minPoint.z) / 10;
     int p = 0;
     int i;
     double px = minPoint.x;
     double px2 = px+dx;
     double vx = box.minPoint.x;
     double vx2 = box.maxPoint.x;
     double py = minPoint.y;
     double py2 = py + dy;
     double vy = box.minPoint.y;
     double vy2 = box.maxPoint.y;
     double pz = minPoint.z;
     double pz2 = pz + dz;
     double vz = box.minPoint.z;
     double vz2 = box.maxPoint.z;
     for (i = 0; i < 10; i++)
     {
         if (Overlap(px, px2, vx, vx2)) p |= 1 << i;
         if (Overlap(py, py2, vy, vy2)) p |= 1 << (10+i);
         if (Overlap(pz, pz2, vz, vz2)) p |= 1 << (20+i);
         px = px2;
         px2 += dx;
         py = py2;
         py2 += dy;
         pz = pz2;
         pz2 += dz;
     }
     return p;
 }