Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.function.BiConsumer;
- import static java.lang.Math.floor;
- public class RaycastUtil {
- public enum Face {
- UP, DOWN, FRONT, BACK, RIGHT, LEFT;
- @Override
- public String toString() {
- return name();
- }
- }
- public static double fceil(double n) {
- return Math.floor(n) + 1.0;
- }
- //http://www.cse.yorku.ca/~amana/research/grid.pdf
- public static void line3D(double startX, double startY, double startZ, double endX, double endY, double endZ, BiConsumer<Vector3d, Face> callback) {
- //Block's cordinates
- int rx = (int) floor(startX);
- int rex = (int) floor(endX);
- int ry = (int) floor(startY);
- int rey = (int) floor(endY);
- int rz = (int) floor(startZ);
- int rez = (int) floor(endZ);
- if(rx == rex && ry == rey && rz == rez) {
- callback.accept(new Vector3d(rx, ry, rz), null);
- return;
- }
- double dx = endX - startX;
- double dy = endY - startY;
- double dz = endZ - startZ;
- int stepX = (int) Math.signum(dx);
- int stepY = (int) Math.signum(dy);
- int stepZ = (int) Math.signum(dz);
- double tMaxX = dx == 0 ? Double.POSITIVE_INFINITY : (fceil(startX) - startX) / dx * stepX;
- double tMaxY = dy == 0 ? Double.POSITIVE_INFINITY : (fceil(startY) - startY) / dy * stepY;
- double tMaxZ = dz == 0 ? Double.POSITIVE_INFINITY : (fceil(startZ) - startZ) / dz * stepZ;
- double tDeltaX = tMaxX * dx * stepX;
- double tDeltaY = tMaxY * dy * stepY;
- double tDeltaZ = tMaxZ * dz * stepZ;
- final Face faceX = stepX > 0 ? Face.LEFT : Face.RIGHT;
- final Face faceY = stepY > 0 ? Face.DOWN : Face.UP;
- final Face faceZ = stepZ > 0 ? Face.FRONT : Face.BACK;
- callback.accept(new Vector3d(rx, ry, rz), null);
- do {
- Face face;
- if(tMaxX < tMaxY) {
- if(tMaxX < tMaxZ) {
- tMaxX += tDeltaX;
- startX += stepX;
- rx += stepX;
- face = faceX;
- } else {
- tMaxZ += tDeltaZ;
- startZ += stepZ;
- rz += stepZ;
- face = faceZ;
- }
- } else {
- if(tMaxY < tMaxZ) {
- tMaxY += tDeltaY;
- startY += stepY;
- ry += stepY;
- face = faceY;
- } else {
- tMaxZ += tDeltaZ;
- startZ += stepZ;
- rz += stepZ;
- face = faceZ;
- }
- }
- callback.accept(new Vector3d(rx, ry, rz), face);
- } while(!(rx == rex && ry == rey && rz == rez));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement