Print

Print


I'm looking at the code and can't see how this can happen unless the 
grid is larger than the resolution of the drawing area.  MASON uses AWT 
graphics, and so cuts things down to integers.  If you scale down to the 
point that, for example, the width of your sparse grid is less than the 
pixels in your drawing area, some of those cut-downs will be to zero width.


But if this is not the case, then I'm stumped. Here's the relevant code 
(in SparseGridPortrayal2D.java):

newinfo.draw.x = (int)(info.draw.x + (xScale) * loc.x);
newinfo.draw.y = (int)(info.draw.y + (yScale) * loc.y);
newinfo.draw.width = (int)(info.draw.x + (xScale) * (loc.x+1)) - 
newinfo.draw.x;
newinfo.draw.height = (int)(info.draw.y + (yScale) * (loc.y+1)) - 
newinfo.draw.y;

info.draw.x and y are the <x,y> coordinates of the top-left position of 
the drawing area in your window.  loc.x and loc.y are the location of 
the grid item to draw.  They're integers.  xScale and yScale are the 
width or height of the drawing area divided by the maximum extent of the 
grid (field.getWidth() etc.).  They're doubles.

If xScale is a value >= 1.0, then I believe width *must* be a number 
larger than 1.0, and thus cut down to an integer > 1, except for huge 
numbers which your screen resolution can't display anyway.  I think the 
math is right.

Sean

Pelle Evensen wrote:
> Sean Luke wrote:
>> Now that's interesting.  Is the problem just that you're seeing 0 
>> width and 0 height, or that this triggers something which freaks out?
>>
>> In any case, could you create a stack trace when this occurs?
> 
> If it's any help, the width is at most off by one, so if I have scale 1 
> => width = 0.0 or 1.0, scale 16 => width = 15.0 or 16.0. Like I said 
> earlier, this is only for *some* calls to draw. The version of MASON is 
> the CVS version from Monday some time and the JRE is 6_0_7.
> 
> Naughtiness; DrawInfo2D: DrawInfo2D[ Draw: 
> java.awt.geom.Rectangle2D$Double[x=88.0,y=9.0,w=0.0,h=0.0] Clip: 
> java.awt.geom.Rectangle2D$Double[x=0.0,y=0.0,w=500.0,h=400.0]]
> java.lang.Exception: Stack trace
>    at java.lang.Thread.dumpStack(Thread.java:1206)
>    at barterBugs.BasicAgentPortrayal.draw(BasicAgentPortrayal.java:99)
>    at 
> sim.portrayal.grid.SparseGridPortrayal2D.hitOrDraw(SparseGridPortrayal2D.java:229) 
> 
>    at sim.portrayal.FieldPortrayal2D.draw(FieldPortrayal2D.java:55)
>    at 
> sim.display.Display2D$InnerDisplay2D.paintUnbuffered(Display2D.java:513)
>    at sim.display.Display2D$InnerDisplay2D.paint(Display2D.java:395)
>    at 
> sim.display.Display2D$InnerDisplay2D.paintComponent(Display2D.java:328)
>    at 
> sim.display.Display2D$InnerDisplay2D.paintComponent(Display2D.java:304)
>    at javax.swing.JComponent.paint(JComponent.java:1027)
>    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5122)
>    at 
> javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:277) 
> 
>    at javax.swing.RepaintManager.paint(RepaintManager.java:1217)
>    at javax.swing.JComponent._paintImmediately(JComponent.java:5070)
>    at javax.swing.JComponent.paintImmediately(JComponent.java:4880)
>    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803)
>    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
>    at 
> javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
>    at 
> javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128) 
> 
>    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
>    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
>    at 
> java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
> 
>    at 
> java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
> 
>    at 
> java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
> 
>    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
>    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
>    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)