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