0
주어진 다각형을 주어진 거리와 같은 중심으로 다른 방향으로 그리는 자바 방법이 있는지 알고 싶습니다.Java 2D Polygon outside another
AffineTransform을 시도했지만 어떻게 작동하는지 실제로 알지 못합니다.
감사합니다.
주어진 다각형을 주어진 거리와 같은 중심으로 다른 방향으로 그리는 자바 방법이 있는지 알고 싶습니다.Java 2D Polygon outside another
AffineTransform을 시도했지만 어떻게 작동하는지 실제로 알지 못합니다.
감사합니다.
폴리곤의 중심 높이와 높이의 절반으로 변환해야합니다. http://paulbourke.net/geometry/polygonmesh/PolygonUtilities.java에서 오는 코드를 포함하여 다각형의 중심을 계산했습니다.
public void drawPolygon(){
Graphics2D g2 = bufferedImage.createGraphics();
Polygon poly=new Polygon();
poly.addPoint(100, 100);
poly.addPoint(200, 100);
poly.addPoint(200, 200);
poly.addPoint(150, 250);
poly.addPoint(100, 200);
poly.addPoint(100, 100);
g2.setColor(Color.blue);
g2.fillPolygon(poly);
g2.setColor(Color.red);
Point2D.Double []pts=new Point2D.Double[poly.npoints];
for (int i=0;i<poly.npoints;i++){
pts[i]=new Point2D.Double(poly.xpoints[i],poly.ypoints[i]);
}
Point2D centroid=centerOfMass(pts);
g2.translate(-centroid.getX(), -centroid.getY());
g2.scale(2, 2);
g2.drawPolygon(poly);
}
public static double area(Point2D[] polyPoints) {
int i, j, n = polyPoints.length;
double area = 0;
for (i = 0; i < n; i++) {
j = (i + 1) % n;
area += polyPoints[i].getX() * polyPoints[j].getY();
area -= polyPoints[j].getX() * polyPoints[i].getY();
}
area /= 2.0;
return (area);
}
/**
* Function to calculate the center of mass for a given polygon, according
* to the algorithm defined at
* http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/
*
* @param polyPoints
* array of points in the polygon
* @return point that is the center of mass
*/
public static Point2D centerOfMass(Point2D[] polyPoints) {
double cx = 0, cy = 0;
double area = area(polyPoints);
// could change this to Point2D.Float if you want to use less memory
Point2D res = new Point2D.Double();
int i, j, n = polyPoints.length;
double factor = 0;
for (i = 0; i < n; i++) {
j = (i + 1) % n;
factor = (polyPoints[i].getX() * polyPoints[j].getY()
- polyPoints[j].getX() * polyPoints[i].getY());
cx += (polyPoints[i].getX() + polyPoints[j].getX()) * factor;
cy += (polyPoints[i].getY() + polyPoints[j].getY()) * factor;
}
area *= 6.0f;
factor = 1/area;
cx *= factor;
cy *= factor;
res.setLocation(cx, cy);
return res;
}
GIS 세계에서 공통점이있는 또 다른 방법은 다각형을 버퍼링하는 것입니다. Java Topology Suite 라이브러리는이 기능을 제공하지만 스케일 팩터가 무엇인지 알아내는 것이 더 어려울 수도 있습니다.
이 게시물에서 성장 다각형에 대한 몇 가지 흥미로운 토론이 있습니다 An algorithm for inflating/deflating (offsetting, buffering) polygons
g2.translate (X, Y)이; g2.draw (다각형)는 변환에만 관심이있는 경우 변환 행렬을 사용하는 것보다 간단 할 수 있습니다. –
John, 미안, 나는 충분히 명확하지 않았다. 아이디어는 다른 하나의 외부에서 두 번째 다각형을 만들지 만 동일한 중심과 두 배의 크기를 사용하는 것입니다. 감사합니다. – Ramon
g2.scale (2,2); g2.draw (다각형); 그럴 경우. 변환, 축척, 전단, 회전 및 뒤집기를 하나의 작업으로 결합하려는 경우 AffineTransform과 변형 행렬을 사용합니다. –