// ComputeTransform determines the block coordinate and beginning + ending voxel points // for the data corresponding to the given Block. func (v *Voxels) ComputeTransform(block *storage.TKeyValue, blockSize dvid.Point) (blockBeg, dataBeg, dataEnd dvid.Point, err error) { var ptIndex *dvid.IndexZYX ptIndex, err = DecodeTKey(block.K) if err != nil { return } // Get the bounding voxel coordinates for this block. minBlockVoxel := ptIndex.MinPoint(blockSize) maxBlockVoxel := ptIndex.MaxPoint(blockSize) // Compute the boundary voxel coordinates for the ExtData and adjust // to our block bounds. minDataVoxel := v.StartPoint() maxDataVoxel := v.EndPoint() begVolCoord, _ := minDataVoxel.Max(minBlockVoxel) endVolCoord, _ := maxDataVoxel.Min(maxBlockVoxel) // Adjust the DVID volume voxel coordinates for the data so that (0,0,0) // is where we expect this slice/subvolume's data to begin. dataBeg = begVolCoord.Sub(v.StartPoint()) dataEnd = endVolCoord.Sub(v.StartPoint()) // Compute block coord matching dataBeg blockBeg = begVolCoord.Sub(minBlockVoxel) return }