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; }
public HashSet <TopoVertex> SearchBox(RHBoundingBox box) { HashSet <TopoVertex> set = new HashSet <TopoVertex>(); if (leaf != null || left != null) { SearchBoxTraverse(box, set); } return(set); }
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; }
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)); } }
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; }
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; }
public void Add(RHBoundingBox box) { if (box.minPoint == null) return; Add(box.minPoint); Add(box.maxPoint); }
/// <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; }