I'm working with Graphics2D(java)
I'm trying move a random shape with mouse drag.
This random shape is stored in Area object of java.awt.geom.Area class.
I know how to select that area object, I just need to figure out how to actually move it to the new coordinates.
Shapes like ellipse and rectangle can be easily moved but how to move shapes like polygon or shapes that contain curve and no specific predefined structure.
In order to draw a rectangle using the Graphics class, you need the origin point and the width and height.
In order to draw an ellipse using the Graphics class, you need the origin point and the width and height.
Each of these simple figures is made up of an origin point and the dimensions of the figure.
Similarly, for any complex shape, you need an origin point. It's the origin point that "moves" when you move the shape with a mouse drag. In other words, the origin of the mouse move corresponds with the origin of the figure. As the mouse moves to new X and y coordinates, your origin moves to new x and y coordinates.
Let's say a rectangle has an origin of 10, 10. Let's say the origin of the mouse drag is 30, 30. As the mouse moves to new x and y coordinates, you change the origin of the rectangle. In this example, when the mouse has moved to 40, 40, the origin of the rectangle becomes 20, 20.
The rectangle and ellipse already have a draw method in the Graphics class. You'll probably have to write your own draw method for the complex shape.
Related
I'm checking for collisions between snooker balls using the Intersects call in the Rectangle class - each ball has a Rectangle which defines its hitbox.
How my code works is that I have rectangle representing the white ball's old position and a new one for its updated position. From here I need to check if there was a collision with another ball between the old position and the new position.
This is where I'm hoping for some assistance, what would be the best way to create a path / check if there's a possible collision between the old and new position?
Image representation
To test if two circles have collided, you can compare the distance between the center of both circles to the sum of the radiuses. If the distance is smaller, they have collided.
For Rectangles, you can use Rectangle.intersects(Rectangle)
I am writing a simple game, or so it seemed, that has a functionality of rotating a Rectangle as the mouse moves. This did not seem like a problem at first but it just became a problem. What the Rectangle should do is rotate around a point as the mouse moves around on the Panel.
If you look at the picture, when the mouse moves the Rectangle will rotate. I know you can use the rotate functionality with Graphics2D.
g2d.rotate(angle, centerx, centery);
This is not very help full because I can not get the coordinates of the moving rectangle. This rotates the full graphics! How will I be able to draw this Rectangle so that it does this. I don't have an idea as on how to start. Please help.
Some more code and context would be nice, but based on the current question: You could create a transformed shape. Particularly, Rectangle and Rectangle2D implement the Shape interface. And you can create an AffineTransform that represents the rotation that you are currently doing to your Graphics. So the relevant part of the code should roughly look like
Rectangle2D rectangle = ...
AffineTransform at = AffineTransform.getRotateInstance(
angle, centerx, centery);
Shape rotatedRectangle = at.createTransformedShape(rectangle);
g2d.draw(rotatedRectangle);
You mentioned "collision" in the title. If you intend to use this rectangle in some sort of collision detection, you should note that it is not directly possible to intersect two arbitrary Shape objects. Particulary, you can not intersect the Shape rotatedRectangle with another Shape otherRotatedRectangle, but only with a Rectangle otherRectangle. If this is an issue, you have several options, but this would rather fit into a dedicated question.
In my game the player uses a Rectangle for his bounding box, he can do this because I only need to rotate the player image and not the acctual rectangle but for a eletric beam that one of the bosses have I need to use a Shape because I need to rotate the acctual bounding box and not only the image. The problem is that because I have one Rectangle and one Shape I can't use rectangle.intersect(shape) nor rectangle.intersect((Rectangle)shape) so how would I be able to check the collision between the rectangle and the shape? or is there a way that I can rotate a rectangle on instead of a shape (I use the createTransformedShape instance of an AffineTransform to rotate the shape )?
Ok
I have the line and the component. The component itself is a JPanel. I draw shapes inside it. And adding the shape to the container. This shape can be any polygon. And drawing a curved line (this can be Line2D, CubicCurve2D or QuadCurve2D) in a container.
Now I need to draw an arrow shape on the container so that while moving a line this arrow would span around the shape.
There can be many curve lines connected to the center of the shape with different Control point. And the shape can be any regular polygon.
At least I need the intersection points of the rounded rectangle and the curve line below image.
Edit: I want to determine the intersection points of a curved line and an arbitrary regular polygon. Given polygon width, height, center points and the starting, ending and the control points of the line.
Edit: I can't post questions so I will edit this one. How can I zoom both JComponents and Graphics object? If it should done with AffineTransform then how should I transform event points on JComponents?
You can use BasicStroke and getStrokedShape(). Set thickness=e.g. 5 and get stroked shapes of the Polygon and Line. Then create 2 Area classes based on the stoked shapes and get intersection Shape.
If I draw some circles using Java2D. Is there a way display some text when I hover over any of the circles? i.e. I want to display the ID of that circle and some other stuff.
There are a number of ways to accomplish what you want. This is one solution. I assume that you are using Ellipse2D to create the circle. And I assume that you are drawing the circle on a JComponent like a JPanel.
So you declare the Ellipse.
Shape circle = new Ellispe2D.Double(x, y, width, height);
Then you implement MouseMotionListener to detect when the user moves the Mouse over the JPanel.
public void mouseMoved(MouseEvent e){
if(circle.contains(e.getPoint())){
//the mouse pointer is over the circle. So set a Message or whatever you want to do
msg = "You are over circle 1";
}else{
msg = "You are not over the circle";
}
}
Then in the paint() or paintComponent method (whichever one you are overriding to do the painting):
g2.fill(circle);
g2.drawString(msg, 10, 10); //write out the message
I don't know if You can do this directly. But You can use simple math to check cursors position: (x-a)^2+(y-b)^2=r^2 where x,y is cursors position a,b is circles center and r is radius.
You'll have to save all the centers and radius and test it against the current mouse position.
it's pretty simple operation. If the distance of the mouse position and the center of one of the circle is smaller then the radius, the mouse is inside it and you can draw the hover message you want.
there is a question here that shows the math: Equation for testing if a point is inside a circle
Hope that helps...
There is a Polygon class that might do it for you (the contains method), but none of the implementing classes is a circle :S