私は多くの 2D 浮動小数点ポリゴンを扱っています。あるものから別のものを減算する必要があるユース ケースを思いついたので、java.awt.geom.Area を使用すると考えました。4 つの点を持つ Area オブジェクトを作成します。
100.0, 50.0
150.0, 0.0
151.41421356237308, 2.8284271247461112
99.99999999999973, 54.242640687118936
そして、Area を作成するときにこれらのポイントをどのように並べるかに関係なく、次の結果が返されます。
SEG_MOVETO, 150.0, 0.0
SEG_LINETO, 100.0, 50.0
SEG_LINETO, 99.99999999999973, 54.24264068711893
SEG_LINETO, 99.99999999999974, 54.24264068711893
SEG_LINETO, 151.41421356237308, 2.8284271247461112
SEG_LINETO, 150.0, 0.0
SEG_CLOSE, 150.0, 0.0
ほぼ同一の二重99.99999999999973, 54.24264068711893
座標に注意してください。
それを回避する方法の手がかりは大歓迎です。コードは次のとおりです。
import java.awt.geom.Area;
import java.awt.geom.Path2D;
import java.awt.geom.PathIterator;
class Main {
public static final void main( String args[] ) {
double[] myPoly = {100.0, 50.0, 150.0, 0.0, 151.41421356237308, 2.8284271247461112, 99.99999999999973, 54.242640687118936};
final Area myArea = makeArea(myPoly);
System.out.println(areaToString(myArea));
}
private static Area makeArea(double coords[]) {
final Path2D path = new Path2D.Double();
path.moveTo(coords[0], coords[1]);
for (int i = 2; i < coords.length; i+=2) {
path.lineTo(coords[i], coords[i+1]);
}
path.closePath();
return new Area(path);
}
private static String areaToString(final Area area) {
final StringBuffer out = new StringBuffer("Area [\n");
double []pt = new double[6];
for (PathIterator pi = area.getPathIterator(null); !pi.isDone(); pi.next()) {
int type = pi.currentSegment(pt);
out.append(type).append(", ").append(pt[0]).append(", ").append(pt[1]).append("\n");
}
return out.append(']').toString();
}
}