| |
| DIVISION BY ZERO in grid units: |
| |
| - There are two main conversion scenarios in grid: |
| |
| + converting a unit to a final location/dimension for drawing |
| (or for determining the boundary of a drawn object) |
| |
| - The grid graphics package converts all incoming units to INCHES |
| (then uses R graphics engine to convert to device coordinates) |
| |
| - Almost all conversions to INCHES involve multiplication only |
| |
| - The exception is "native" units, which require a division by |
| the range of the native scale. This creates the possibility |
| of division by zero if the range of the native scale is zero |
| (i.e., the scale limits are identical). |
| |
| SOLUTION: make it an error to set a scale with identical limits. |
| |
| + converting from one unit to another (within a viewport context) |
| |
| - Conversions, via convertUnit(), involve two steps: |
| conversion from the original unit TO inches and then |
| conversion FROM inches to the final unit. |
| |
| - Any division-by-zero in the conversion TO inches is avoided |
| by the solution above. |
| |
| - Division-by-zero in the conversion FROM inches can occur |
| IF the viewport has zero physical width or height |
| AND the final unit is relative ("npc" or "native"). |
| |
| SOLUTION: (i) IF original unit is also relative ... |
| (a) IF original unit is plain unit AND we are NOT |
| converting 'x' to 'y' (or vice versa) catch this |
| as special case and make it work. |
| (b) OTHERWISE (original unit is complex or we are |
| converting 'x' to 'y' or vice versa) |
| return zero. |
| (ii) IF original unit is absolute, throw an error |
| (because the conversion does not make sense) UNLESS the original |
| unit value is zero, in which case return zero. |
| |
| - NOTE that conversion FROM anything TO an absolute final unit |
| does not risk division-by-zero, even when viewport has zero |
| physical width or height. (The result is either zero, if |
| the original unit is relative, or an identity operation [in |
| terms of the physical result] if the original unit is absolute.) |
| |