Download source from Intersect.jar
![]() | ![]() |
|
| no intersection | rectangles intersect | rectangle contains another |
Intersect.javaimport javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Group;
//import javafx.scene.Cursor;
import javafx.scene.*;
import javafx.event.EventHandler;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import javafx.collections.*;
import javafx.geometry.Point2D;
import javafx.geometry.Bounds;
import javafx.scene.input.* ;
import javafx.scene.layout.Pane;
import java.lang.Math;
import javafx.scene.control.Button;
import javafx.event.ActionEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import java.util.ArrayList;
public class Intersect extends Application {
Group grp = new Group();
double xs;
double ys;
double xe;
double ye;
Rectangle r;
Rectangle r1=null;
Rectangle r2=null;
Rectangle r3=null;
myRect ra, rb;
public void start(Stage stage) {
// Create a border pane
BorderPane pane = new BorderPane();
Scene scene = new Scene(pane, 400, 400);
Pane mypane = new Pane();
pane.setCenter(mypane);
mypane.getChildren().add(grp);
grp.setTranslateX(scene.getWidth()/2);
grp.setTranslateY(scene.getHeight()/2);
double res = 96;
grp.setScaleX(res);
grp.setScaleY(res);
int N = 2;
Grid.draw(grp,N);
stage.setTitle("Intersecting Rectangles");
stage.setScene(scene);
stage.show();
grp.setOnMousePressed( e ->
{
xs = e.getX();
ys = e.getY();
if (r1!=null) r1.setFill(Color.TRANSPARENT);
r = new Rectangle(xs,ys,0,0);
r.setStroke(Color.BLACK);
r.setStrokeWidth(1/res);
r.setStrokeLineCap(StrokeLineCap.ROUND);
r.setFill(Color.TRANSPARENT);
grp.getChildren().add(r);
grp.getChildren().remove(r2);
grp.getChildren().remove(r3);
r3 = null;
}
);
grp.setOnMouseDragged( e ->
{
xe = e.getX();
ye = e.getY();
double width = xe - xs;
if (width>0) r.setX(xs);
else r.setX(xe);
r.setWidth(Math.abs(width));
double height = ye-ys;
if (height>0) r.setY(ys);
else r.setY(ye);
r.setHeight(Math.abs(height));
}
);
grp.setOnMouseReleased( e ->
{
if (r1==null) r1 = r;
else r2 = r;
if (r2==null) return;
ra = new myRect(r1);
rb = new myRect(r2);
r3 = myRect.intersection(ra,rb);
if (ra.contains(rb)) {
r2.setFill(Color.RED);
}
else if (rb.contains(ra)) {
r1.setFill(Color.RED);
}
else if (r3!=null) {
r3.setStrokeWidth(1/res);
r3.setStrokeLineCap(StrokeLineCap.ROUND);
r3.setStroke(Color.BLACK);
r3.setFill(Color.BLUE);
grp.getChildren().add(r3);
}
}
);
}
public static void main(String[] args) {
launch(args);
}
}
class myRect {
double xmin,ymin,xmax,ymax;
myRect(Rectangle r) {
xmin=r.getX();
ymin=r.getY();
xmax = xmin + r.getWidth();
ymax = ymin + r.getHeight();
}
public boolean contains(myRect r) {
if (r.xmin<xmin) return false;
if (r.xmax>xmax) return false;
if (r.ymin<ymin) return false;
if (r.ymax>ymax) return false;
return true;
}
static public Rectangle intersection(myRect a, myRect b) {
if (a.xmin > b.xmax) return null;
if (a.xmax < b.xmin) return null;
if (a.ymin > b.ymax) return null;
if (a.ymax < b.ymin) return null;
double x1 = Math.max(a.xmin,b.xmin);
double y1 = Math.max(a.ymin,b.ymin);
double x2 = Math.min(a.xmax,b.xmax);
double y2 = Math.min(a.ymax,b.ymax);
return new Rectangle(x1,y1,x2-x1,y2-y1);
}
}
Maintained by John Loomis, updated Sun Apr 08 15:04:55 2018