Skip to content

Commit b4003e2

Browse files
authored
Flip to opposite side (#8)
* Add flip to opposite side button * Allow flip of heading and velocity vectors
1 parent 8df0ba7 commit b4003e2

File tree

7 files changed

+83
-1
lines changed

7 files changed

+83
-1
lines changed

app/src/main/java/org/team2363/helixnavigator/document/DocumentActions.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@
4747
import javafx.scene.input.MouseEvent;
4848
import javafx.scene.input.ScrollEvent;
4949
import javafx.scene.transform.Rotate;
50+
import javafx.scene.transform.Scale;
51+
import javafx.scene.transform.Transform;
52+
import javafx.scene.transform.Translate;
5053

5154
public class DocumentActions {
5255

@@ -465,6 +468,17 @@ public void rotateSelection180() {
465468
}
466469
}
467470

471+
public void flipObjectsToOppositeSide() {
472+
if (documentManager.getIsDocumentOpen() && documentManager.getDocument().isPathSelected()) {
473+
HDocument document = documentManager.getDocument();
474+
HFieldImage fieldImage = document.getFieldImage();
475+
Scale mirrorTrans = new Scale(-1, 1);
476+
Translate flipTrans = new Translate(fieldImage.getFieldAreaWidth(), 0.0);
477+
Transform totalTrans = flipTrans.createConcatenation(mirrorTrans);
478+
documentManager.getDocument().getSelectedPath().transformSelectedElementsRelative(totalTrans);
479+
}
480+
}
481+
468482
private void insertWaypoint(int index, HWaypoint waypoint) {
469483
documentManager.getDocument().getSelectedPath().getWaypoints().add(index, waypoint);
470484
}

app/src/main/java/org/team2363/helixnavigator/document/field/image/HDefaultFieldImage.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,19 @@ public String getName() {
7171
return game;
7272
}
7373

74+
@Override
75+
public double getFieldAreaWidth() {
76+
Quantity<Length> widthQuan = Quantities.getQuantity(fieldSize.width, fieldUnit.unit);
77+
Quantity<Length> widthQuanConv = widthQuan.to(SI.METRE);
78+
return widthQuanConv.getValue().doubleValue();
79+
}
80+
@Override
81+
public double getFieldAreaHeight() {
82+
Quantity<Length> heightQuan = Quantities.getQuantity(fieldSize.height, fieldUnit.unit);
83+
Quantity<Length> heightQuanConv = heightQuan.to(SI.METRE);
84+
return heightQuanConv.getValue().doubleValue();
85+
}
86+
7487
@Override
7588
public double getImageRes() {
7689
return imageRes;

app/src/main/java/org/team2363/helixnavigator/document/field/image/HFieldImage.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ public interface HFieldImage {
1717
*/
1818
public String getName();
1919

20+
public double getFieldAreaWidth();
21+
public double getFieldAreaHeight();
22+
2023
/**
2124
* @return the resolution of image, in meters per pixel
2225
*/

app/src/main/java/org/team2363/helixnavigator/document/field/image/HReferenceFieldImage.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ public String getName() {
3030
return fieldImage.getName();
3131
}
3232

33+
@Override
34+
public double getFieldAreaWidth() {
35+
return fieldImage.getFieldAreaWidth();
36+
}
37+
38+
@Override
39+
public double getFieldAreaHeight() {
40+
return fieldImage.getFieldAreaHeight();
41+
}
42+
3343
@Override
3444
public double getImageRes() {
3545
return fieldImage.getImageRes();

app/src/main/java/org/team2363/helixnavigator/document/timeline/HCustomWaypoint.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import javafx.beans.property.SimpleBooleanProperty;
1818
import javafx.beans.property.SimpleDoubleProperty;
1919
import javafx.beans.property.SimpleIntegerProperty;
20+
import javafx.geometry.Point2D;
2021
import javafx.scene.transform.Transform;
2122

2223
public class HCustomWaypoint extends HWaypoint {
@@ -43,7 +44,22 @@ public HCustomWaypoint() {
4344
@Override
4445
public void transformRelative(Transform transform) {
4546
super.transformRelative(transform);
46-
double deltaAngle = Math.atan2(transform.getMyx(), transform.getMxx());
47+
48+
Point2D curBase = new Point2D(getX(), getY());
49+
Point2D curHeadTip = curBase.add(new Point2D(Math.cos(getHeading()), Math.sin(getHeading())));
50+
Point2D curVelocityTip = curBase.add(new Point2D(getVelocityX(), getVelocityY()));
51+
52+
Point2D newBase = transform.transform(curBase);
53+
Point2D newVelTip = transform.transform(curVelocityTip);
54+
Point2D newVelocity = newVelTip.subtract(newBase);
55+
56+
Point2D newHeadTip = transform.transform(curHeadTip);
57+
Point2D newHead = newHeadTip.subtract(newBase);
58+
59+
setVelocityX(newVelocity.getX());
60+
setVelocityY(newVelocity.getY());
61+
62+
double deltaAngle = Math.atan2(newHead.getY(), newHead.getX()) - getHeading();
4763
setHeading(getHeading() + deltaAngle);
4864
}
4965

app/src/main/java/org/team2363/helixnavigator/ui/menu/edit/EditMenu.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class EditMenu extends Menu {
2424
private final Rotate90ClockwiseMenuItem rotate90ClockwiseMenuItem;
2525
private final Rotate90CounterclockwiseMenuItem rotate90CounterclockwiseMenuItem;
2626
private final Rotate180MenuItem rotate180MenuItem;
27+
private final FlipToOppositeSideMenuItem flipToOppositeSideMenuItem;
2728

2829
public EditMenu(DocumentManager documentManager) {
2930
this.documentManager = documentManager;
@@ -41,6 +42,7 @@ public EditMenu(DocumentManager documentManager) {
4142
rotate90ClockwiseMenuItem = new Rotate90ClockwiseMenuItem(this.documentManager);
4243
rotate90CounterclockwiseMenuItem = new Rotate90CounterclockwiseMenuItem(this.documentManager);
4344
rotate180MenuItem = new Rotate180MenuItem(this.documentManager);
45+
flipToOppositeSideMenuItem = new FlipToOppositeSideMenuItem(this.documentManager);
4446

4547
getItems().add(undoMenuItem);
4648
getItems().add(redoMenuItem);
@@ -57,5 +59,6 @@ public EditMenu(DocumentManager documentManager) {
5759
getItems().add(rotate90ClockwiseMenuItem);
5860
getItems().add(rotate90CounterclockwiseMenuItem);
5961
getItems().add(rotate180MenuItem);
62+
getItems().add(flipToOppositeSideMenuItem);
6063
}
6164
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.team2363.helixnavigator.ui.menu.edit;
2+
3+
import org.team2363.helixnavigator.document.DocumentManager;
4+
5+
import javafx.event.ActionEvent;
6+
import javafx.scene.control.MenuItem;
7+
8+
public class FlipToOppositeSideMenuItem extends MenuItem {
9+
10+
private final DocumentManager documentManager;
11+
12+
public FlipToOppositeSideMenuItem(DocumentManager documentManager) {
13+
this.documentManager = documentManager;
14+
setText("Flip Objects to Opposite Side");
15+
// setAccelerator(KeyCombination.keyCombination("shortcut+RIGHT"));
16+
setOnAction(this::action);
17+
disableProperty().bind(this.documentManager.isDocumentOpenProperty().not());
18+
}
19+
20+
public void action(ActionEvent event) {
21+
documentManager.actions().flipObjectsToOppositeSide();
22+
}
23+
}

0 commit comments

Comments
 (0)