Ejemplo n.º 1
0
        /// <summary>
        /// 全セルの軸並行境界ボリュームを取得する
        /// </summary>
        /// <returns>境界ボリューム列</returns>
        public List <Tuple <aabb, int> > GetCellAabb()
        {
            var result = new List <Tuple <aabb, int> >();
            var cr     = new rangei(vectori.Zero, _CellMax);
            var cells  = _Cells;
            var stride = _Division.X;
            var iy     = cr.Min.X + cr.Min.Y * stride;
            var invs   = _InvTransformScale;
            var invt   = _CellExtent - _TransformTranslate;
            var aabb2  = new aabb(vector.Zero, _CellExtent);

            for (int y = cr.Min.Y; y <= cr.Max.Y; iy += stride, y++)
            {
                aabb2.Center.Y  = y * invs.Y;
                aabb2.Center.Y += invt.Y;

                for (int x = cr.Min.X, ix = iy; x <= cr.Max.X; ix++, x++)
                {
                    aabb2.Center.X  = x * invs.X;
                    aabb2.Center.X += invt.X;

                    result.Add(new Tuple <aabb, int>(aabb2, ix));
                }
            }

            return(result);
        }
Ejemplo n.º 2
0
 public bool Intersects(volume range)
 {
     if (Max.X < range.Min.X || range.Max.X < Min.X)
     {
         return(false);
     }
     if (Max.Y < range.Min.Y || range.Max.Y < Min.Y)
     {
         return(false);
     }
     return(true);
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 指定された範囲に対応するセル範囲を取得する
        /// </summary>
        /// <param name="range">範囲</param>
        /// <returns>セル範囲</returns>
        rangei CellRange(range range)
        {
            var s = _TransformScale;
            var t = _TransformTranslate;

            range.Min.AddSelf(t);
            range.Min.MulSelf(s);
            range.Max.AddSelf(t);
            range.Max.MulSelf(s);

            var cr = new rangei(range);

            cr.Min.ElementWiseMaxSelf(0);
            cr.Max.ElementWiseMinSelf(_CellMax);
            return(cr);
        }
Ejemplo n.º 4
0
 public void MergeSelf(volume range)
 {
     Min.ElementWiseMinSelf(range.Min);
     Max.ElementWiseMaxSelf(range.Max);
 }
Ejemplo n.º 5
0
 public volume Merge(volume range)
 {
     return(new volume(vector.ElementWiseMin(Min, range.Min), vector.ElementWiseMax(Max, range.Max)));
 }
Ejemplo n.º 6
0
 public bool Contains(volume range)
 {
     return(Min <= range.Min && range.Max <= Max);
 }