mirror of
https://github.com/EngineHub/WorldEdit.git
synced 2024-12-27 05:00:08 +08:00
Add FlatRegion interface and an associated iterator
This commit is contained in:
parent
b2eb2741eb
commit
a23e9b857f
@ -32,7 +32,7 @@
|
||||
*
|
||||
* @author sk89q
|
||||
*/
|
||||
public class CuboidRegion extends AbstractRegion {
|
||||
public class CuboidRegion extends AbstractRegion implements FlatRegion {
|
||||
/**
|
||||
* Store the first point.
|
||||
*/
|
||||
@ -371,6 +371,16 @@ public void remove() {
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Vector2D> asFlatRegion() {
|
||||
return new Iterable<Vector2D>() {
|
||||
@Override
|
||||
public Iterator<Vector2D> iterator() {
|
||||
return new FlatRegionIterator(CuboidRegion.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation in the format
|
||||
* "(minX, minY, minZ) - (maxX, maxY, maxZ)".
|
||||
|
@ -20,6 +20,7 @@
|
||||
package com.sk89q.worldedit.regions;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import com.sk89q.worldedit.LocalWorld;
|
||||
import com.sk89q.worldedit.Vector;
|
||||
@ -31,7 +32,7 @@
|
||||
*
|
||||
* @author yetanotherx
|
||||
*/
|
||||
public class CylinderRegion extends AbstractRegion {
|
||||
public class CylinderRegion extends AbstractRegion implements FlatRegion {
|
||||
private Vector center;
|
||||
private Vector2D center2D;
|
||||
private Vector2D radius;
|
||||
@ -342,6 +343,16 @@ public boolean setY(int y) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Vector2D> asFlatRegion() {
|
||||
return new Iterable<Vector2D>() {
|
||||
@Override
|
||||
public Iterator<Vector2D> iterator() {
|
||||
return new FlatRegionIterator(CylinderRegion.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation in the format
|
||||
* "(centerX, centerY, centerZ) - (radiusX, radiusZ)"
|
||||
|
27
src/main/java/com/sk89q/worldedit/regions/FlatRegion.java
Normal file
27
src/main/java/com/sk89q/worldedit/regions/FlatRegion.java
Normal file
@ -0,0 +1,27 @@
|
||||
// $Id$
|
||||
/*
|
||||
* WorldEdit
|
||||
* Copyright (C) 2010, 2011 sk89q <http://www.sk89q.com> and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.sk89q.worldedit.regions;
|
||||
|
||||
import com.sk89q.worldedit.Vector2D;
|
||||
|
||||
public interface FlatRegion extends Region {
|
||||
|
||||
public Iterable<Vector2D> asFlatRegion();
|
||||
}
|
@ -0,0 +1,97 @@
|
||||
// $Id$
|
||||
/*
|
||||
* WorldEdit
|
||||
* Copyright (C) 2010, 2011 sk89q <http://www.sk89q.com> and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.sk89q.worldedit.regions;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import com.sk89q.worldedit.Vector;
|
||||
import com.sk89q.worldedit.Vector2D;
|
||||
|
||||
public class FlatRegionIterator implements Iterator<Vector2D> {
|
||||
|
||||
private Region region;
|
||||
private int y;
|
||||
private int minX;
|
||||
private int nextX;
|
||||
private int nextZ;
|
||||
private int maxX;
|
||||
private int maxZ;
|
||||
|
||||
public FlatRegionIterator(Region region) {
|
||||
this.region = region;
|
||||
|
||||
Vector min = region.getMinimumPoint();
|
||||
Vector max = region.getMaximumPoint();
|
||||
|
||||
this.y = min.getBlockY();
|
||||
|
||||
this.minX = min.getBlockX();
|
||||
|
||||
this.nextX = minX;
|
||||
this.nextZ = min.getBlockZ();
|
||||
|
||||
this.maxX = max.getBlockX();
|
||||
this.maxZ = max.getBlockZ();
|
||||
|
||||
forward();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return nextX != Integer.MIN_VALUE;
|
||||
}
|
||||
|
||||
private void forward() {
|
||||
while (hasNext() && !region.contains(new Vector(nextX, y, nextZ))) {
|
||||
forwardOne();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2D next() {
|
||||
if (!hasNext()) {
|
||||
throw new java.util.NoSuchElementException();
|
||||
}
|
||||
|
||||
Vector2D answer = new Vector2D(nextX, nextZ);
|
||||
|
||||
forwardOne();
|
||||
forward();
|
||||
|
||||
return answer;
|
||||
}
|
||||
|
||||
private void forwardOne() {
|
||||
if (++nextX <= maxX) {
|
||||
return;
|
||||
}
|
||||
nextX = minX;
|
||||
|
||||
if (++nextZ <= maxZ) {
|
||||
return;
|
||||
}
|
||||
nextX = Integer.MIN_VALUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
@ -37,7 +37,7 @@
|
||||
*
|
||||
* @author sk89q
|
||||
*/
|
||||
public class Polygonal2DRegion extends AbstractRegion {
|
||||
public class Polygonal2DRegion extends AbstractRegion implements FlatRegion {
|
||||
private List<BlockVector2D> points;
|
||||
private BlockVector min;
|
||||
private BlockVector max;
|
||||
@ -469,6 +469,16 @@ public Iterator<BlockVector> iterator() {
|
||||
return new RegionIterator(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Vector2D> asFlatRegion() {
|
||||
return new Iterable<Vector2D>() {
|
||||
@Override
|
||||
public Iterator<Vector2D> iterator() {
|
||||
return new FlatRegionIterator(Polygonal2DRegion.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string representation in the format
|
||||
* "(x1, z1) - ... - (xN, zN) * (minY - maxY)"
|
||||
|
Loading…
Reference in New Issue
Block a user