# Amount of blocks in a ProtectedRegion (WorldGuard)

Discussion in 'Spigot Plugin Development' started by GermanElectronix, May 28, 2015.

1. ### GermanElectronix

Hello,

currently I'm working on a plots plugin with per-block-prices.
To calculate these prices I have to know how many blocks (including AIR) there are in a
com.sk89q.worldguard.protection.regions.ProtectedRegion
Does anyone know how to realize this?

• Like x 1
• Agree x 1

4. ### DarkSeraphim

@GermanElectronix you can probably still compute the surface from the points, and multiply it with the height. How? No clue, google probably knows .

5. ### GermanElectronix

Actually I just need the area. I already found this method:
Code (Text):
int blocks = ProtectedRegion.volume() / 256;
It's working for cuboid but for polygonal regions it returns 0. I could calculate the area with vectors, but I have no idea how I could do that ^^

#5
Last edited: May 28, 2015

7. ### GermanElectronix

That's not working for me. It returns wrong values.
Code (Text):
ProtectedRegion reg;
float sum_but_no_result=0;

for(int i=0; i<(reg.getPoints().size()-1); i++) {
sum_but_no_result += reg.getPoints().get(i).getBlockX() * reg.getPoints().get(i + 1).getBlockZ() + reg.getPoints().get(i).getBlockZ() * reg.getPoints().get(i + 1).getBlockX();
}
sum_but_no_result += reg.getPoints().get(reg.getPoints().size()-1).getBlockX() * reg.getPoints().get(0).getBlockZ() + reg.getPoints().get(reg.getPoints().size()-1).getBlockZ() * reg.getPoints().get(0).getBlockX();
float sum = (Math.abs(sum_but_no_result) / 2.0f) / 256;

System.out.println("BLOCKS: " + String.valueOf(sum));

8. ### DarkSeraphim

@GermanElectronix you could always pick an arbitrary point in the polygon, split the polygon up in triangles, compute the area of each triangle and sum the results.

Or (and this is probably a pretty precise but slow method) recursively find all blocks in a slice of the polygon (so where all y is equal).
Code (pseudo (Unknown Language)):
// This assumes the initial call uses a block inside the polygon
findArea(block, visited)
found = 1
for each neighbour
if visited contains neighbour
continue
add neighbour to visited
found = found + findArea(neighbour, visited)
return found
Note: Java wise, visited should be a HashSet for best performance

#8
Last edited: May 28, 2015
9. ### GermanElectronix

I finally found a way to compute the area of polygons (learned at school ^^):
Code (Text):
public static int getArea(final List<BlockVector2D> points){
int[] x = new int[points.size()];
int[] z = new int[points.size()];
for(int i = 0; i<points.size(); i++){
x[i] = points.get(i).getBlockX();
z[i] = points.get(i).getBlockZ();
}
int firstSum = 0;
for(int i = 0; i<points.size()-1; i++)
firstSum = x[i]*z[i+1];
int secondSum = 0;
for(int i = 0; i<points.size()-1; i++)
secondSum = z[i]*x[i+1];
firstSum -= secondSum;
return firstSum / 2;
}
The problem is, that this method is returning wrong values. Maybe, ProtectedRegion.getPoints(); is returning an unsorted list?