[geos-devel] Fw: 3.0?

S Knox roxyknox at yahoo.co.uk
Fri Oct 31 04:26:45 EDT 2008


Skipped content of type multipart/alternative-------------- next part --------------
/**********************************************************************
 * $Id$
 *
 * GEOS - Geometry Engine Open Source
 * http://geos.refractions.net
 *
 * Copyright (C) 2001-2002 Vivid Solutions Inc.
 * Copyright (C) 2005 Refractions Research Inc.
 *
 * This is free software; you can redistribute and/or modify it under
 * the terms of the GNU Lesser General Public Licence as published
 * by the Free Software Foundation. 
 * See the COPYING file for more information.
 *
 **********************************************************************
 *
 * Last port: algorithm/HCoordinate.java rev. 1.17 (JTS-1.7)
 *
 **********************************************************************/

#include <geos/algorithm/HCoordinate.h>
#include <geos/algorithm/NotRepresentableException.h>
#include <geos/geom/Coordinate.h>
#include <geos/platform.h>

#include <memory>
#include <cmath> // for finite()
#include <iostream>
#include <iomanip>

// For MingW builds with __STRICT_ANSI__ (-ansi)
// See: http://geos.refractions.net/pipermail/geos-devel/2006-June/002342.html
#if defined(__GNUC__) && defined(_WIN32)
int __cdecl _finite (double);
#define finite(x) _finite(x)
#endif

#ifndef GEOS_DEBUG
#define GEOS_DEBUG 0
#endif

// Define to make -ffloat-store be effective for this class
//#define STORE_INTERMEDIATE_COMPUTATION_VALUES 1

using namespace std;
using namespace geos::geom;

namespace geos {
namespace algorithm { // geos.algorithm

/*public static*/
void
HCoordinate::intersection(const Coordinate &p1, const Coordinate &p2,
	const Coordinate &q1, const Coordinate &q2, Coordinate &ret)
{

#if GEOS_DEBUG
	cerr << __FUNCTION__ << ":" << endl
	     << setprecision(20)
	     << " p1: " << p1 << endl
	     << " p2: " << p2 << endl
	     << " q1: " << q1 << endl
	     << " q2: " << q2 << endl;
#endif

        HCoordinate hc1p1(p1);

#if GEOS_DEBUG
	cerr << "HCoordinate(p1): "
	     << hc1p1 << endl;
#endif

        HCoordinate hc1p2(p2);

#if GEOS_DEBUG
	cerr << "HCoordinate(p2): "
	     << hc1p2 << endl;
#endif

        HCoordinate l1(hc1p1, hc1p2);

#if GEOS_DEBUG
	cerr << "L1 - HCoordinate(HCp1, HCp2): "
	     << l1 << endl;
#endif

        HCoordinate hc2q1(q1);

#if GEOS_DEBUG
	cerr << "HCoordinate(q1): "
	     << hc2q1 << endl;
#endif

        HCoordinate hc2q2(q2);

#if GEOS_DEBUG
	cerr << "HCoordinate(q2): "
	     << hc2q2 << endl;
#endif

        HCoordinate l2(hc2q1, hc2q2);

#if GEOS_DEBUG
	cerr << "L2 - HCoordinate(HCq1, HCq2): "
	     << l2 << endl;
#endif

        HCoordinate intHCoord(l1, l2);

#if GEOS_DEBUG
	cerr << "HCoordinate(L1, L2): "
	     << intHCoord << endl;
#endif

        intHCoord.getCoordinate(ret);

}

/*public*/
HCoordinate::HCoordinate()
	:
	x(0.0),
	y(0.0),
	w(1.0)
{
}

/*public*/
HCoordinate::HCoordinate(long double _x, long double _y, long double _w)
	:
	x(_x),
	y(_y),
	w(_w)
{
}

/*public*/
HCoordinate::HCoordinate(const Coordinate& p)
	:
	x(p.x),
	y(p.y),
	w(1.0)
{
}

/*public*/
#ifndef STORE_INTERMEDIATE_COMPUTATION_VALUES

HCoordinate::HCoordinate(const HCoordinate &p1, const HCoordinate &p2)
	:
	x( p1.y*p2.w - p2.y*p1.w ),
	y( p2.x*p1.w - p1.x*p2.w ),
	w( p1.x*p2.y - p2.x*p1.y )
{
}

#else // def STORE_INTERMEDIATE_COMPUTATION_VALUES

HCoordinate::HCoordinate(const HCoordinate &p1, const HCoordinate &p2)
{
        long double xf1 = p1.y*p2.w;
        long double xf2 = p2.y*p1.w;
        x = xf1 - xf2;

        long double yf1 = p2.x*p1.w;
        long double yf2 = p1.x*p2.w;
        y = yf1 - yf2;

        long double wf1 = p1.x*p2.y;
        long double wf2 = p2.x*p1.y;
        w = wf1 - wf2;

#if GEOS_DEBUG
        cerr
             << " xf1: " << xf1 << endl
             << " xf2: " << xf2 << endl
             << " yf1: " << yf1 << endl
             << " yf2: " << yf2 << endl
             << " wf1: " << wf1 << endl
             << " wf2: " << wf2 << endl
             << "   x: " << x << endl
             << "   y: " << y << endl
             << "   w: " << w << endl;
#endif // def GEOS_DEBUG
}
#endif // def STORE_INTERMEDIATE_COMPUTATION_VALUES

/*public*/
long double
HCoordinate::getX() const
{
	long double a = x/w;

	// finite() also checks for NaN
	if ( ! finite(a) )
	{
		throw  NotRepresentableException();
	}
	return a;
}

/*public*/
long double
HCoordinate::getY() const
{
	long double a = y/w;

	// finite() also checks for NaN
	if ( ! finite(a) )
	{
		throw  NotRepresentableException();
	}
	return a;
}

/*public*/
void
HCoordinate::getCoordinate(Coordinate &ret) const
{
	ret=Coordinate(getX(), getY());
}

std::ostream& operator<< (std::ostream& o, const HCoordinate& c)
{
	return o << "(" << c.x << ", "
	         << c.y << ") [w: " << c.w << "]";
}

} // namespace geos.algorithm
} // namespace geos

/**********************************************************************
 * $Log$
 * Revision 1.24  2006/06/27 15:59:36  strk
 * * source/algorithm/HCoordinate.cpp: added support for MingW -ansi builds.
 *
 * Revision 1.23  2006/04/20 14:27:40  strk
 * HCoordinate class changed to use long double types internally, in order to improve computation precision
 *
 * Revision 1.22  2006/04/20 11:11:57  strk
 * source/algorithm/HCoordinate.cpp: added compile time define to force storage of intermediate computation values to variables (in order to make the -ffloat-store gcc switch effective). Disabled by default.
 *
 * Revision 1.21  2006/04/14 09:02:16  strk
 * Hadded output operator and debugging prints for HCoordinate.
 *
 * Revision 1.20  2006/04/04 11:37:00  strk
 * Port information + initialization lists in ctors
 *
 * Revision 1.19  2006/04/04 11:28:12  strk
 * NotRepresentable condition detected using finite() from <cmath>
 * rather then using FINITE() macro. Made ::intersection() body
 * more readable.
 *
 * Revision 1.18  2006/03/21 11:12:23  strk
 * Cleanups: headers inclusion and Log section
 *
 * Revision 1.17  2006/03/09 16:46:45  strk
 * geos::geom namespace definition, first pass at headers split
 **********************************************************************/



More information about the geos-devel mailing list