Has anyone had time to examine this issue lately...
-----Original Message-----
From: Colley, Tony
Sent: Monday, March 04, 2002 17:01
To: Colley, Tony; 'Faine, Valeri'; 'Eddy Offermann '
Cc: 'roottalk@pcroot.cern.ch '
Subject: RE: [ROOT] graphing huge datasets -- possible fix
I modified the DrawPolyLine function in TGX11.cxx to split polylines with
too many points into drawable chunks. This would not handle the case where
someone wanted to draw a filled curve with too many points; but I don't need
really big filled curves anyway. This change enabled ROOT to successfully
handle a TGraph of 10^7 points (not quickly, by any means, but at least it
draws the graph and doesn't crash).
Here is a cvs diff output of my changes:
===================================================================
654a655,657
> #define MAX_DRAW_PTS 1000001
> #define MDP_MINUS_1 1000000
>
661d663
<
664c666,678
< if (n > 1) {
---
> if (n > MAX_DRAW_PTS) {
> int ibeg = 0;
> int iend = MDP_MINUS_1;
> while (iend < n) {
> DrawPolyLine( MAX_DRAW_PTS, &xyt[ibeg] );
> ibeg = iend;
> iend += MDP_MINUS_1;
> }
> if (ibeg < n) {
> int npt = n - ibeg;
> DrawPolyLine( npt, &xyt[ibeg] );
> }
> } else if (n > 1) {
=====================================================================
Here's an extract from TGX11.cxx showing the modifications:
=====================================================================
#define MAX_DRAW_PTS 1000001 // NEW
#define MDP_MINUS_1 1000000 // NEW
void TGX11::DrawPolyLine(int n, TPoint *xyt)
{
// Draw a line through all points.
// n : number of points
// xy : list of points
XPoint *xy = (XPoint*)xyt;
if (n > MAX_DRAW_PTS) { // NEW
int ibeg = 0; // NEW
int iend = MDP_MINUS_1; // NEW
while (iend < n) { // NEW
DrawPolyLine( MAX_DRAW_PTS, &xyt[ibeg] ); // NEW
ibeg = iend; // NEW
iend += MDP_MINUS_1; // NEW
} // NEW
if (ibeg < n) { // NEW
int npt = n - ibeg; // NEW
DrawPolyLine( npt, &xyt[ibeg] ); // NEW
} // NEW
} else if (n > 1) { // CHANGED
if (gLineStyle == LineSolid)
XDrawLines(fDisplay, gCws->drawing, *gGCline, xy, n,
CoordModeOrigin);
else {
int i;
XSetDashes(fDisplay, *gGCdash,
gDashOffset, gDashList, sizeof(gDashList));
XDrawLines(fDisplay, gCws->drawing, *gGCdash, xy, n,
CoordModeOrigin);
// calculate length of line to update dash offset
for (i = 1; i < n; i++) {
int dx = xy[i].x - xy[i-1].x;
int dy = xy[i].y - xy[i-1].y;
if (dx < 0) dx = - dx;
if (dy < 0) dy = - dy;
gDashOffset += dx > dy ? dx : dy;
}
gDashOffset %= gDashLength;
}
} else {
int px,py;
px=xy[0].x;
py=xy[0].y;
XDrawPoint(fDisplay, gCws->drawing,
gLineStyle == LineSolid ? *gGCline : *gGCdash, px, py);
}
}
=====================================================================
If this doesn't break something I didn't try, then I think it is a
reasonable way to fix the 2^20 data point limit.
+------------------------------------------------+
| Tony Colley ITT Industries A/CD |
| Modeling/Simulation Group Fort Wayne, IN USA |
+------------------------------------------------+
| Using ROOT 3.03/02 on RedHat Linux 7.2 |
| Last CVS update: 26 Feb 2002 at 2218 GMT |
+------------------------------------------------+
\I'm not responsible for anything below this line/
************************************
If this email is not intended for you, or you are not responsible for the
delivery of this message to the addressee, please note that this message may
contain ITT Privileged/Proprietary Information. In such a case, you may not
copy or deliver this message to anyone. You should destroy this message and
kindly notify the sender by reply email. Information contained in this
message that does not relate to the business of ITT is neither endorsed by
nor attributable to ITT.
************************************
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:46 MET