/// <summary> /// Returns a grid point at the given point. /// Assumes the point is within the bounds of the grid. /// </summary> /// <param name="point"></param> /// <param name="result"></param> public void GridPointAtUnsafe(Vec3d point, GridPoint3d result) { point = ToGridSpace(point); result.SetWeights( zMath.Fract(point.X, out int i0), zMath.Fract(point.Y, out int j0), zMath.Fract(point.Z, out int k0) ); j0 *= _nx; k0 *= _nxy; int i1 = i0 + 1; int j1 = j0 + _nx; int k1 = k0 + _nxy; var corners = result.Corners; corners[0] = i0 + j0 + k0; corners[1] = i1 + j0 + k0; corners[2] = i0 + j1 + k0; corners[3] = i1 + j1 + k0; corners[4] = i0 + j0 + k1; corners[5] = i1 + j0 + k1; corners[6] = i0 + j1 + k1; corners[7] = i1 + j1 + k1; }
/// <summary> /// Returns a grid point at the given point. /// Assumes the point is within the bounds of the grid. /// </summary> /// <param name="point"></param> /// <returns></returns> public GridPoint3d GridPointAtUnsafe(Vec3d point) { GridPoint3d result = new GridPoint3d(); GridPointAtUnsafe(point, result); return(result); }
/// <summary> /// Returns a grid point at the given point. /// </summary> /// <param name="point"></param> /// <param name="result"></param> public void GridPointAt(Vec3d point, GridPoint3d result) { point = ToGridSpace(point); result.SetWeights( zMath.Fract(point.X, out int i0), zMath.Fract(point.Y, out int j0), zMath.Fract(point.Z, out int k0) ); int i1 = WrapX(i0 + 1); int j1 = WrapY(j0 + 1) * _nx; int k1 = WrapZ(k0 + 1) * _nxy; i0 = WrapX(i0); j0 = WrapY(j0) * _nx; k0 = WrapZ(k0) * _nxy; var corners = result.Corners; corners[0] = i0 + j0 + k0; corners[1] = i1 + j0 + k0; corners[2] = i0 + j1 + k0; corners[3] = i1 + j1 + k0; corners[4] = i0 + j0 + k1; corners[5] = i1 + j0 + k1; corners[6] = i0 + j1 + k1; corners[7] = i1 + j1 + k1; }
/// <summary> /// /// </summary> /// <param name="point"></param> /// <returns></returns> public Vec3d CoordinateAt(GridPoint3d point) { var corners = point.Corners; var weights = point.Weights; var sum = new Vec3d(); for (int i = 0; i < 8; i++) { sum += CoordinateAt(corners[i]) * weights[i]; } return(sum); }
/// <inheritdoc /> public sealed override Vec3d ValueAt(GridPoint3d point) { return(FieldUtil.ValueAt(Values, point.Corners, point.Weights)); }
/// <summary> /// /// </summary> /// <param name="point"></param> /// <param name="amount"></param> public static void IncrementAt(this GridField3d <Vec3d> field, GridPoint3d point, Vec3d amount) { FieldUtil.IncrementAt(field, point.Corners, point.Weights, amount); }
/// <inheritdoc/> /// <summary> /// /// </summary> /// <param name="point"></param> /// <param name="value"></param> /// <returns></returns> public static void SetAt(this GridField3d <Vec3d> field, GridPoint3d point, Vec3d value) { FieldUtil.SetAt(field, point.Corners, point.Weights, value); }