@@ 153,6 153,7 @@ public class Menu extends ScreenAdapter
names.add("IntersectSegmentConvexPolygonTest");
names.add("DragAndDropTutorial");
names.add("Box2DControllerTest");
names.add("MinimumTranslationVectorTest");
names.sort();
final List<String> tests = new List<>(skin);
@@ 0,0 1,81 @@
+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.GeometryUtils;
+import com.badlogic.gdx.math.Intersector;
+import com.badlogic.gdx.math.Intersector.MinimumTranslationVector;
+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;
+
+public class MinimumTranslationVectorTest extends ScreenAdapter {
+
+ private Viewport viewport = new ScreenViewport();
+ private ShapeRenderer sr = new ShapeRenderer();
+ private Polygon polygon = new Polygon(new float[] {0, 0, 250, 0, 250, 250, 0, 500}), polygon2 = new Polygon(new float[] {0, 0, 250, 0, 250, 500, 0, 250});
+ private MinimumTranslationVector mtv = new MinimumTranslationVector();
+ private Vector2 centroid = new Vector2();
+
+ @Override
+ public void show() {
+ Gdx.input.setInputProcessor(new InputAdapter() {
+ @Override
+ public boolean scrolled(int amount) {
+ ((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 {
+ viewport.unproject(centroid.set(screenX, screenY));
+ polygon.setPosition(centroid.x, centroid.y);
+ }
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public void resize(int width, int height) {
+ viewport.update(width, height, true);
+ }
+
+ @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());
+ if(Intersector.overlapConvexPolygons(polygon, polygon2, mtv)) {
+ sr.setColor(Color.RED);
+ GeometryUtils.polygonCentroid(polygon.getTransformedVertices(), 0, polygon.getTransformedVertices().length, centroid);
+ sr.line(centroid.x, centroid.y, centroid.x + mtv.normal.x * mtv.depth, centroid.y + mtv.normal.y * mtv.depth);
+ }
+ sr.setColor(Color.CYAN);
+ sr.polygon(polygon2.getTransformedVertices());
+ sr.end();
+ }
+
+ @Override
+ public void dispose() {
+ sr.dispose();
+ }
+
+}