/// <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); }
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); }
/// <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); }
public void MergeSelf(volume range) { Min.ElementWiseMinSelf(range.Min); Max.ElementWiseMaxSelf(range.Max); }
public volume Merge(volume range) { return(new volume(vector.ElementWiseMin(Min, range.Min), vector.ElementWiseMax(Max, range.Max))); }
public bool Contains(volume range) { return(Min <= range.Min && range.Max <= Max); }