added SutherlandHodgmanTest
M core/src/net/dermetfan/someLibgdxTests/screens/Menu.java +1 -0
@@ 154,6 154,7 @@ public class Menu extends ScreenAdapter 
 		names.add("DragAndDropTutorial");
 		names.add("Box2DControllerTest");
 		names.add("MinimumTranslationVectorTest");
+		names.add("SutherlandHodgmanTest");
 		names.sort();
 
 		final List<String> tests = new List<>(skin);

          
A => core/src/net/dermetfan/someLibgdxTests/screens/SutherlandHodgmanTest.java +102 -0
@@ 0,0 1,102 @@ 
+package net.dermetfan.someLibgdxTests.screens;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.InputAdapter;
+import com.badlogic.gdx.ScreenAdapter;
+import com.badlogic.gdx.graphics.Color;
+import com.badlogic.gdx.graphics.GL20;
+import com.badlogic.gdx.graphics.OrthographicCamera;
+import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
+import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
+import com.badlogic.gdx.math.Polygon;
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.scenes.scene2d.utils.UIUtils;
+import com.badlogic.gdx.utils.viewport.ScreenViewport;
+import com.badlogic.gdx.utils.viewport.Viewport;
+import net.dermetfan.gdx.math.GeometryUtils;
+
+public class SutherlandHodgmanTest extends ScreenAdapter {
+
+	Viewport viewport = new ScreenViewport();
+	ShapeRenderer sr = new ShapeRenderer();
+
+	Polygon polygon = new Polygon(new float[] {0, 0, 250, 0, 250, 250, 0, 500} /* ccw */), clipPolygon = new Polygon(new float[] {0, 0, 0, 250, 250, 250, 250, 0} /* cw */);
+
+	public SutherlandHodgmanTest() {
+		Vector2 centroid = new Vector2();
+		com.badlogic.gdx.math.GeometryUtils.polygonCentroid(polygon.getVertices(), 0, polygon.getVertices().length, centroid);
+		polygon.setOrigin(centroid.x, centroid.y);
+		com.badlogic.gdx.math.GeometryUtils.polygonCentroid(clipPolygon.getVertices(), 0, clipPolygon.getVertices().length, centroid);
+		clipPolygon.setOrigin(centroid.x, centroid.y);
+	}
+
+	@Override
+	public void show() {
+		Gdx.input.setInputProcessor(new InputAdapter() {
+			@Override
+			public boolean keyTyped(char character) {
+				if(character == 'c') {
+					float[] clipped = GeometryUtils.clip(polygon.getTransformedVertices(), clipPolygon.getTransformedVertices());
+					GeometryUtils.reset(polygon);
+					polygon.setVertices(clipped);
+					Vector2 centroid = new Vector2();
+					com.badlogic.gdx.math.GeometryUtils.polygonCentroid(clipped, 0, clipped.length, centroid);
+					polygon.setOrigin(centroid.x, centroid.y);
+					return true;
+				}
+				return false;
+			}
+
+			@Override
+			public boolean scrolled(int amount) {
+				if(UIUtils.ctrl())
+					polygon.setRotation(polygon.getRotation() + amount * 5);
+				else if(UIUtils.shift())
+					clipPolygon.setRotation(clipPolygon.getRotation() + amount * 5);
+				else {
+					((OrthographicCamera) viewport.getCamera()).zoom += amount / 25f;
+					viewport.apply();
+				}
+				return true;
+			}
+
+			@Override
+			public boolean touchDragged(int screenX, int screenY, int pointer) {
+				if(UIUtils.right()) {
+					OrthographicCamera cam = (OrthographicCamera) viewport.getCamera();
+					cam.position.add(-Gdx.input.getDeltaX(pointer) * cam.zoom, Gdx.input.getDeltaY(pointer) * cam.zoom, 0);
+					viewport.apply();
+				} else {
+					Vector2 tmp = new Vector2();
+					viewport.unproject(tmp.set(screenX, screenY));
+					polygon.setPosition(tmp.x - polygon.getOriginX() * polygon.getScaleX(), tmp.y - polygon.getOriginY() * polygon.getScaleY());
+				}
+				return true;
+			}
+		});
+	}
+
+	@Override
+	public void resize(int width, int height) {
+		viewport.update(width, height);
+	}
+
+	@Override
+	public void render(float delta) {
+		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
+
+		sr.setProjectionMatrix(viewport.getCamera().combined);
+		sr.begin(ShapeType.Line);
+		sr.setColor(Color.WHITE);
+		sr.polygon(polygon.getTransformedVertices(), 0, polygon.getTransformedVertices().length);
+		sr.setColor(Color.CYAN);
+		sr.polygon(clipPolygon.getTransformedVertices(), 0, clipPolygon.getTransformedVertices().length);
+		sr.end();
+	}
+
+	@Override
+	public void dispose() {
+		sr.dispose();
+	}
+
+}