private Array<Vector2> makePoly(Texture texture, int d, int angle) {
Array<Vector2> points = new Array<Vector2>();
int w = texture.getWidth();
int h = texture.getHeight();
texture.getTextureData().prepare();
Pixmap spr = texture.getTextureData().consumePixmap();
// increase array size from 255 if needed
int[] vertex_x = new int[255 * 4], vertex_y = new int[255 * 4], vertex_k = new int[255 * 4];
int numPoints = 0, tx = 0, ty = 0, fy = -1, lx = 0, ly = 0;
vertex_x[0] = 0;
vertex_y[0] = 0;
vertex_k[0] = 1;
for (tx = 0; tx < w; tx += d)
for (ty = 0; ty < h; ty += 1)
if ((spr.getPixel(tx, ty) >> 24) != 0x00) {
vertex_x[numPoints] = tx;
vertex_y[numPoints] = h - ty;
vertex_k[numPoints] = 1;
numPoints++;
if (fy < 0) fy = ty;
lx = tx;
ly = ty;
break;
}
for (ty = 0; ty < h; ty += d)
for (tx = w - 1; tx >= 0; tx -= 1)
if ((spr.getPixel(tx, ty) >> 24) != 0x00 && ty > ly) {
vertex_x[numPoints] = tx;
vertex_y[numPoints] = h - ty;
vertex_k[numPoints] = 1;
numPoints++;
lx = tx;
ly = ty;
break;
}
for (tx = w - 1; tx >= 0; tx -= d)
for (ty = h - 1; ty >= 0; ty -= 1)
if ((spr.getPixel(tx, ty) >> 24) != 0x00 && tx < lx) {
vertex_x[numPoints] = tx;
vertex_y[numPoints] = h - ty;
vertex_k[numPoints] = 1;
numPoints++;
lx = tx;
ly = ty;
break;
}
for (ty = h - 1; ty >= 0; ty -= d)
for (tx = 0; tx < w; tx += 1)
if ((spr.getPixel(tx, ty) >> 24) != 0x00 && ty < ly && ty > fy) {
vertex_x[numPoints] = tx;
vertex_y[numPoints] = h - ty;
vertex_k[numPoints] = 1;
numPoints++;
lx = tx;
ly = ty;
break;
}
double ang1, ang2;
for (int i = 0; i < numPoints - 2; i++) {
ang1 = PointDirection(vertex_x[i], vertex_y[i], vertex_x[i + 1], vertex_y[i + 1]);
ang2 = PointDirection(vertex_x[i + 1], vertex_y[i + 1], vertex_x[i + 2], vertex_y[i + 2]);
if (Math.abs(ang1 - ang2) <= angle) vertex_k[i + 1] = 0;
}
ang1 = PointDirection(vertex_x[numPoints - 2], vertex_y[numPoints - 2], vertex_x[numPoints - 1], vertex_y[numPoints - 1]);
ang2 = PointDirection(vertex_x[numPoints - 1], vertex_y[numPoints - 1], vertex_x[0], vertex_y[0]);
if (Math.abs(ang1 - ang2) <= angle) vertex_k[numPoints - 1] = 0;
ang1 = PointDirection(vertex_x[numPoints - 1], vertex_y[numPoints - 1], vertex_x[0], vertex_y[0]);
ang2 = PointDirection(vertex_x[0], vertex_y[0], vertex_x[1], vertex_y[1]);
if (Math.abs(ang1 - ang2) <= angle) vertex_k[0] = 0;
/*int n=0;
for (int i=0;i<numPoints;i++)
if(vertex_k[i]==1)n++;
*/
for (int i = 0; i < numPoints; i++)
if (vertex_k[i] == 1) {
Vector2 point = new Vector2();
point.set(vertex_x[i], h - vertex_y[i]);
points.add(point);
}
texture.getTextureData().disposePixmap();
return points;
}
double PointDirection(double xfrom, double yfrom, double xto, double yto) {
return Math.atan2(yto - yfrom, xto - xfrom) * 180 / Math.PI;
}
使用:
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.StaticBody;
bodyDef.position.set(item.getX() - image.getWidth() / 2f, item.getY() - image.getHeight() / 2f);
//Body body = peReader.createBody(item.getName2(), world, bodyDef, 1, 1);
Array<Vector2> points = makePoly(Maker.getTexture("road1/" + item.getName2() + "" +
".png"), 2, 50);
Body body = world.createBody(bodyDef);
LogHelper.log(points.size);
if (points.size >= 3 && points.size <= 8) {
PolygonShape polygonShape = new PolygonShape();
polygonShape.set((Vector2[]) points.toArray(Vector2.class));
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = polygonShape;
body.createFixture(fixtureDef);
}
效果图: