मैंने इस वर्ग का उपयोग अपनी परियोजनाओं में से किसी एक आकार के अनुमान के अनुमान के लिए किया है। यह धीमी है लेकिन उच्च संकल्प में यह अभी भी पिक्सल गिनती की तुलना में तेजी हो सकता है (क्योंकि पिक्सल गिनती की लागत संकल्प के साथ quadratically होती है, लेकिन परिधि पर रेखा खंडों की संख्या रैखिक बढ़ता है।)
import static java.lang.Double.NaN;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.geom.FlatteningPathIterator;
import java.awt.geom.Line2D;
import java.awt.geom.PathIterator;
public abstract class Areas {
public static double approxArea(Area area, double flatness, int limit) {
PathIterator i =
new FlatteningPathIterator(area.getPathIterator(identity),
flatness,
limit);
return approxArea(i);
}
public static double approxArea(Area area, double flatness) {
PathIterator i = area.getPathIterator(identity, flatness);
return approxArea(i);
}
public static double approxArea(PathIterator i) {
double a = 0.0;
double[] coords = new double[6];
double startX = NaN, startY = NaN;
Line2D segment = new Line2D.Double(NaN, NaN, NaN, NaN);
while (! i.isDone()) {
int segType = i.currentSegment(coords);
double x = coords[0], y = coords[1];
switch (segType) {
case PathIterator.SEG_CLOSE:
segment.setLine(segment.getX2(), segment.getY2(), startX, startY);
a += hexArea(segment);
startX = startY = NaN;
segment.setLine(NaN, NaN, NaN, NaN);
break;
case PathIterator.SEG_LINETO:
segment.setLine(segment.getX2(), segment.getY2(), x, y);
a += hexArea(segment);
break;
case PathIterator.SEG_MOVETO:
startX = x;
startY = y;
segment.setLine(NaN, NaN, x, y);
break;
default:
throw new IllegalArgumentException("PathIterator contains curved segments");
}
i.next();
}
if (Double.isNaN(a)) {
throw new IllegalArgumentException("PathIterator contains an open path");
} else {
return 0.5 * Math.abs(a);
}
}
private static double hexArea(Line2D seg) {
return seg.getX1() * seg.getY2() - seg.getX2() * seg.getY1();
}
private static final AffineTransform identity =
AffineTransform.getQuadrantRotateInstance(0);
}
क्यों डबल [] coords = new double [6]; और एक और सूचकांक का उपयोग नहीं किया जाता है? –
आप बहुभुज चौराहे सूत्र घटता beizer को विस्तार करने के लिए सक्षम होना चाहिए। फिर आप सभी आकृतियों/क्षेत्रों के लिए सही क्षेत्रों को प्राप्त करने के लिए पथ इटरेटर्स का उपयोग कर सकते हैं। –