下面列出了java.awt.geom.Path2D#getBounds2D ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
static void testGetBounds(Path2D pathA, Path2D pathB) {
final Rectangle rA = pathA.getBounds();
final Rectangle rB = pathB.getBounds();
if (!rA.equals(rB)) {
throw new IllegalStateException("Bounds are not equals [" + rA
+ "|" + rB + "] !");
}
final Rectangle2D r2dA = pathA.getBounds2D();
final Rectangle2D r2dB = pathB.getBounds2D();
if (!equalsRectangle2D(r2dA, r2dB)) {
throw new IllegalStateException("Bounds2D are not equals ["
+ r2dA + "|" + r2dB + "] !");
}
log("testGetBounds: passed.");
}
static void testGetBounds(Path2D pathA, Path2D pathB) {
final Rectangle rA = pathA.getBounds();
final Rectangle rB = pathB.getBounds();
if (!rA.equals(rB)) {
throw new IllegalStateException("Bounds are not equals [" + rA
+ "|" + rB + "] !");
}
final Rectangle2D r2dA = pathA.getBounds2D();
final Rectangle2D r2dB = pathB.getBounds2D();
if (!equalsRectangle2D(r2dA, r2dB)) {
throw new IllegalStateException("Bounds2D are not equals ["
+ r2dA + "|" + r2dB + "] !");
}
log("testGetBounds: passed.");
}
static void testGetBounds(Path2D pathA, Path2D pathB) {
final Rectangle rA = pathA.getBounds();
final Rectangle rB = pathB.getBounds();
if (!rA.equals(rB)) {
throw new IllegalStateException("Bounds are not equals [" + rA
+ "|" + rB + "] !");
}
final Rectangle2D r2dA = pathA.getBounds2D();
final Rectangle2D r2dB = pathB.getBounds2D();
if (!equalsRectangle2D(r2dA, r2dB)) {
throw new IllegalStateException("Bounds2D are not equals ["
+ r2dA + "|" + r2dB + "] !");
}
log("testGetBounds: passed.");
}
static void testGetBounds(Path2D pathA, Path2D pathB) {
final Rectangle rA = pathA.getBounds();
final Rectangle rB = pathB.getBounds();
if (!rA.equals(rB)) {
throw new IllegalStateException("Bounds are not equals [" + rA
+ "|" + rB + "] !");
}
final Rectangle2D r2dA = pathA.getBounds2D();
final Rectangle2D r2dB = pathB.getBounds2D();
if (!equalsRectangle2D(r2dA, r2dB)) {
throw new IllegalStateException("Bounds2D are not equals ["
+ r2dA + "|" + r2dB + "] !");
}
log("testGetBounds: passed.");
}
static void testGetBounds(Path2D pathA, Path2D pathB) {
final Rectangle rA = pathA.getBounds();
final Rectangle rB = pathB.getBounds();
if (!rA.equals(rB)) {
throw new IllegalStateException("Bounds are not equals [" + rA
+ "|" + rB + "] !");
}
final Rectangle2D r2dA = pathA.getBounds2D();
final Rectangle2D r2dB = pathB.getBounds2D();
if (!equalsRectangle2D(r2dA, r2dB)) {
throw new IllegalStateException("Bounds2D are not equals ["
+ r2dA + "|" + r2dB + "] !");
}
log("testGetBounds: passed.");
}
static void testGetBounds(Path2D pathA, Path2D pathB) {
final Rectangle rA = pathA.getBounds();
final Rectangle rB = pathB.getBounds();
if (!rA.equals(rB)) {
throw new IllegalStateException("Bounds are not equals [" + rA
+ "|" + rB + "] !");
}
final Rectangle2D r2dA = pathA.getBounds2D();
final Rectangle2D r2dB = pathB.getBounds2D();
if (!equalsRectangle2D(r2dA, r2dB)) {
throw new IllegalStateException("Bounds2D are not equals ["
+ r2dA + "|" + r2dB + "] !");
}
log("testGetBounds: passed.");
}
static void testGetBounds(Path2D pathA, Path2D pathB) {
final Rectangle rA = pathA.getBounds();
final Rectangle rB = pathB.getBounds();
if (!rA.equals(rB)) {
throw new IllegalStateException("Bounds are not equals [" + rA
+ "|" + rB + "] !");
}
final Rectangle2D r2dA = pathA.getBounds2D();
final Rectangle2D r2dB = pathB.getBounds2D();
if (!equalsRectangle2D(r2dA, r2dB)) {
throw new IllegalStateException("Bounds2D are not equals ["
+ r2dA + "|" + r2dB + "] !");
}
log("testGetBounds: passed.");
}
static void testGetBounds(Path2D pathA, Path2D pathB) {
final Rectangle rA = pathA.getBounds();
final Rectangle rB = pathB.getBounds();
if (!rA.equals(rB)) {
throw new IllegalStateException("Bounds are not equals [" + rA
+ "|" + rB + "] !");
}
final Rectangle2D r2dA = pathA.getBounds2D();
final Rectangle2D r2dB = pathB.getBounds2D();
if (!equalsRectangle2D(r2dA, r2dB)) {
throw new IllegalStateException("Bounds2D are not equals ["
+ r2dA + "|" + r2dB + "] !");
}
log("testGetBounds: passed.");
}
static void testGetBounds(Path2D pathA, Path2D pathB) {
final Rectangle rA = pathA.getBounds();
final Rectangle rB = pathB.getBounds();
if (!rA.equals(rB)) {
throw new IllegalStateException("Bounds are not equals [" + rA
+ "|" + rB + "] !");
}
final Rectangle2D r2dA = pathA.getBounds2D();
final Rectangle2D r2dB = pathB.getBounds2D();
if (!equalsRectangle2D(r2dA, r2dB)) {
throw new IllegalStateException("Bounds2D are not equals ["
+ r2dA + "|" + r2dB + "] !");
}
log("testGetBounds: passed.");
}
ProjectMetagonEditGrammarIconImage(ProjectMetagon pm,int span){
super(span,span,BufferedImage.TYPE_INT_RGB);
//init image
Path2D path=pm.getImagePath();
Graphics2D g=createGraphics();
g.setRenderingHints(UI.RENDERING_HINTS);
//fill background
g.setColor(UI.ELEMENTMENU_ICONBACKGROUND);
g.fillRect(0,0,span,span);
//glean metrics and transform
Rectangle2D pbounds=path.getBounds2D();
double pw=pbounds.getWidth(),ph=pbounds.getHeight(),scale;
int maxpolygonimagespan=span-(UI.ELEMENTMENU_ICONGEOMETRYINSET*2);
scale=(pw>ph)?maxpolygonimagespan/pw:maxpolygonimagespan/ph;
AffineTransform t=new AffineTransform();
t.scale(scale,-scale);//note y flip
double
xoffset=-pbounds.getMinX()+(((span-(pw*scale))/2)/scale),
yoffset=-pbounds.getMaxY()-(((span-(ph*scale))/2)/scale);
t.translate(xoffset,yoffset);
g.transform(t);
//fill metagon
//use color to distinguish protojig counts
int pjcount=pm.getJigCount();
if(pjcount<UI.GRAMMAR_EDITOR_METAGON_ICONS_FILLCOLOR.length)
g.setColor(UI.GRAMMAR_EDITOR_METAGON_ICONS_FILLCOLOR[pjcount]);
else
g.setColor(UI.GRAMMAR_EDITOR_METAGON_ICONS_FILLCOLOR[UI.GRAMMAR_EDITOR_METAGON_ICONS_FILLCOLOR.length-1]);
g.fill(path);
//stroke it
g.setColor(UI.ELEMENTMENU_ICON_STROKE);
g.setStroke(new BasicStroke(
(float)(UI.ELEMENTMENU_ICONPATHSTROKETHICKNESS/scale),
BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_ROUND,
0,null,0));
g.draw(path);}
/**
* Draws a path shape on the map.
* @param g2d the graphics2D context.
* @param color the color to display the path shape.
*/
private void drawPathShape(Path2D pathShape, Graphics2D g2d, Color color) {
// Save original graphics transforms.
AffineTransform saveTransform = g2d.getTransform();
// Determine bounds.
Rectangle2D bounds = pathShape.getBounds2D();
// Determine transform information.
double boundsPosX = bounds.getX() * scale;
double boundsPosY = bounds.getY() * scale;
double centerX = bounds.getWidth() * scale / 2D;
double centerY = bounds.getHeight() * scale / 2D;
double translationX = (-1D * bounds.getCenterX() * scale) - centerX - boundsPosX;
double translationY = (-1D * bounds.getCenterY() * scale) - centerY - boundsPosY;
double facingRadian = Math.PI;
// Apply graphic transforms for path shape.
AffineTransform newTransform = new AffineTransform();
newTransform.translate(translationX, translationY);
newTransform.rotate(facingRadian, centerX + boundsPosX, centerY + boundsPosY);
// Draw filled path shape.
newTransform.scale(scale, scale);
g2d.transform(newTransform);
g2d.setColor(color);
g2d.fill(pathShape);
// Restore original graphic transforms.
g2d.setTransform(saveTransform);
}
/**
* Gets the bounding rectangle around a local bounded object with facing.
*
* @param object the local bounded object.
* @return bounding rectangle.
*/
public static Rectangle2D getBoundingRectangle(LocalBoundedObject object) {
Rectangle2D rect = new Rectangle2D.Double(object.getXLocation() - (object.getWidth() / 2D),
object.getYLocation() - (object.getLength() / 2D), object.getWidth(), object.getLength());
Path2D path = getPathFromRectangleRotation(rect, object.getFacing());
return path.getBounds2D();
}
private void readBblData(FSDataInputStream fis) throws IOException {
try {
BufferedReader buff = new BufferedReader(new InputStreamReader(fis));
String line = buff.readLine();
ArrayList<Double> xPoints = new ArrayList<Double>();
ArrayList<Double> yPoints = new ArrayList<Double>();
while (line != null) {
String region = line.trim();
buff.readLine();
Integer nbPoints = Integer.parseInt(buff.readLine());
xPoints = new ArrayList<Double>(nbPoints);
yPoints = new ArrayList<Double>(nbPoints);
for (int i = 0; i < nbPoints; i++) {
String[] points = buff.readLine().split(" ");
xPoints.add(Double.parseDouble(points[0]));
yPoints.add(Double.parseDouble(points[1]));
}
// creating polygon
Path2D polygon = new Path2D.Double();
polygon.moveTo(xPoints.get(0), yPoints.get(0));
for (int i = 1; i < xPoints.size(); ++i) {
polygon.lineTo(xPoints.get(i), yPoints.get(i));
}
polygon.closePath();
Rectangle2D rect = polygon.getBounds2D();
double x = rect.getCenterX();
double y = rect.getCenterY();
int r = grid.getRegion(x, y);
if(r != -1) {
bblRegions.put(Long.parseLong(region), regionNames.get(r));
}
line = buff.readLine();
}
buff.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
} finally {
fis.close();
}
}
private void readBlockData(FSDataInputStream fis) throws IOException {
int id = 0;
try {
BufferedReader buff = new BufferedReader(new InputStreamReader(fis));
String line = buff.readLine();
ArrayList<Double> xPoints = new ArrayList<Double>();
ArrayList<Double> yPoints = new ArrayList<Double>();
while (line != null) {
buff.readLine();
Integer nbPoints = Integer.parseInt(buff.readLine());
xPoints = new ArrayList<Double>(nbPoints);
yPoints = new ArrayList<Double>(nbPoints);
for (int i = 0; i < nbPoints; i++) {
String[] points = buff.readLine().split(" ");
xPoints.add(Double.parseDouble(points[0]));
yPoints.add(Double.parseDouble(points[1]));
}
// creating polygon
Path2D polygon = new Path2D.Double();
polygon.moveTo(xPoints.get(0), yPoints.get(0));
for (int i = 1; i < xPoints.size(); ++i) {
polygon.lineTo(xPoints.get(i), yPoints.get(i));
}
polygon.closePath();
Rectangle2D rect = polygon.getBounds2D();
double x = rect.getCenterX();
double y = rect.getCenterY();
int r = grid.getRegion(x, y);
if(r != -1) {
blockRegions.put(id, nbhdRegionNames.get(r));
}
id++;
line = buff.readLine();
}
buff.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
} finally {
fis.close();
}
}
/**
* Checks if a path collides with an existing building, construction site, or
* vehicle at a location.
*
* @param object the object being checked (may be null if no object).
* @param path the path to check.
* @param coordinates the global coordinate location to check.
* @param useCache true if caching should be used.
* @return true if path doesn't collide with anything.
*/
private static boolean isPathCollisionFree(Object object, Path2D path, Coordinates coordinates, boolean useCache) {
boolean result = true;
// Check if obstacle area has been cached for this coordinate location if using
// cache.
boolean cached = false;
Area obstacleArea = null;
if (useCache && obstacleAreaCache.containsKey(coordinates)) {
if (marsClock == null)
marsClock = Simulation.instance().getMasterClock().getMarsClock();
String currentTimestamp = marsClock.getDateTimeStamp();
String cachedTimestamp = obstacleAreaTimestamps.get(coordinates);
if (currentTimestamp.equals(cachedTimestamp)) {
cached = true;
obstacleArea = obstacleAreaCache.get(coordinates);
}
}
if (!cached) {
// Add all obstacle areas at location together to create a total obstacle area.
Iterator<LocalBoundedObject> i = getAllLocalBoundedObjectsAtLocation(coordinates).iterator();
while (i.hasNext()) {
LocalBoundedObject lbo = i.next();
if (lbo != object) {
Rectangle2D objectRect = new Rectangle2D.Double(lbo.getXLocation() - (lbo.getWidth() / 2D),
lbo.getYLocation() - (lbo.getLength() / 2D), lbo.getWidth(), lbo.getLength());
Path2D objectPath = getPathFromRectangleRotation(objectRect, lbo.getFacing());
Area objectArea = new Area(objectPath);
if (obstacleArea == null) {
obstacleArea = objectArea;
} else {
obstacleArea.add(objectArea);
}
}
}
}
if (obstacleArea != null) {
// Check for intersection of obstacle and path bounding rectangles first
// (faster).
Rectangle2D pathBounds = path.getBounds2D();
Rectangle2D obstacleBounds = obstacleArea.getBounds2D();
if (pathBounds.intersects(obstacleBounds)) {
// If rectangles intersect, check for collision of path and obstacle areas
// (slower).
Area pathArea = new Area(path);
result = !doAreasCollide(pathArea, obstacleArea);
}
}
// Store cached obstacle area for location with current timestamp if needed.
if (useCache && !cached && (obstacleArea != null)) {
obstacleAreaCache.put(coordinates, obstacleArea);
// String currentTimestamp = marsClock.getDateTimeStamp();
obstacleAreaTimestamps.put(coordinates, marsClock.getDateTimeStamp());
}
return result;
}