[geos-devel] QD (Quad-Double) Approach to Robustness
strk at refractions.net
strk at refractions.net
Wed Jun 14 14:36:26 EDT 2006
On Wed, Jun 14, 2006 at 11:16:09AM -0700, Martin Davis wrote:
> > Ok, but equality is actually used in JTS too.
> > Does Java have an automatic approximate equality ?
>
> I've been working under the assumption that Java uses a single FP model,
> so that it's safe to compare FP numbers.
>
> In any case, I'm not sure that JTS uses FP equals for anything other
> than checking whether two points are *exactly* the same. So this should
> be portable, I assume.
As far as you mean memory address comparison that would be portable
(pointers are integer values). Unfortunately we don't have garbage
collection for free in the C++ world, so in some places your identity
checks might have become value comparisons.
BTW, a quick grep on JTS sources for equals2D shows this is not true:
./algorithm/CGAlgorithms.java:197: } while (ring[iPrev].equals2D(hiPt) && iPrev != hiIndex);
./algorithm/CGAlgorithms.java:203: } while (ring[iNext].equals2D(hiPt) && iNext != hiIndex);
./algorithm/CGAlgorithms.java:214: if (prev.equals2D(hiPt) || next.equals2D(hiPt) || prev.equals2D(next))
./algorithm/LineIntersector.java:284: if (intPt[i].equals2D(pt)) {
./algorithm/LineIntersector.java:311: if (! ( intPt[i].equals2D(inputLines[inputLineIndex][0])
./algorithm/LineIntersector.java:312: || intPt[i].equals2D(inputLines[inputLineIndex][1]) )) {
./geom/Coordinate.java:134: public boolean equals2D(Coordinate other) {
./geom/Coordinate.java:159: return equals2D((Coordinate) other);
./geom/CoordinateList.java:141: if (last.equals2D(coord)) return;
./geom/LineString.java:146: return getCoordinateN(0).equals2D(getCoordinateN(getNumPoints() - 1));
./geomgraph/Edge.java:193: if (intPt.equals2D(nextPt)) {
./geomgraph/Edge.java:234: if (! pts[i].equals2D(e.pts[i])) {
./geomgraph/Edge.java:237: if (! pts[i].equals2D(e.pts[--iRev])) {
./geomgraph/Edge.java:253: if (! pts[i].equals2D(e.pts[i])) {
./geomgraph/EdgeIntersectionList.java:145: boolean useIntPt1 = ei1.dist > 0.0 || ! ei1.coord.equals2D(lastSegStartPt);
./noding/SegmentNode.java:57: isInterior = ! coord.equals2D(segString.getCoordinate(segmentIndex));
./noding/SegmentNode.java:81: if (coord.equals2D(other.coord)) return 0;
./noding/SegmentNodeList.java:69: Assert.isTrue(ei.coord.equals2D(intPt), "Found equal nodes with different coordinates");
./noding/SegmentNodeList.java:70:// if (! ei.coord.equals2D(intPt))
./noding/SegmentNodeList.java:126: if (p0.equals2D(p2)) {
./noding/SegmentNodeList.java:159: if (! ei0.coord.equals2D(ei1.coord)) return false;
./noding/SegmentNodeList.java:212: if (! pt0.equals2D(edgePts[0]))
./noding/SegmentNodeList.java:218: if (! ptn.equals2D(edgePts[edgePts.length - 1]))
./noding/SegmentNodeList.java:238: boolean useIntPt1 = ei1.isInterior() || ! ei1.coord.equals2D(lastSegStartPt);
./noding/SegmentString.java:157: if (intPt.equals2D(nextPt)) {
./noding/SegmentPointComparator.java:30: if (p0.equals2D(p1)) return 0;
--strk;
More information about the geos-devel
mailing list