Ignore:
Timestamp:
2010-05-14T22:53:44+02:00 (14 years ago)
Author:
bastiK
Message:

fixed #4935 - Wireframe painting broken for high zoom

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/SimplePaintVisitor.java

    r3201 r3243  
    4646
    4747    public boolean inactive;
    48 
    49     protected static final double PHI = Math.toRadians(20);
    5048
    5149    /**
     
    470468    }
    471469
     470    private static final double PHI = Math.toRadians(20);
     471    private static final double cosPHI = Math.cos(PHI);
     472    private static final double sinPHI = Math.sin(PHI);
     473
    472474    protected void drawSegment(GeneralPath path, Point p1, Point p2, boolean showDirection) {
    473         if (isSegmentVisible(p1, p2)) {
     475        boolean drawIt = false;
     476        if (Main.isOpenjdk) {
     477            /**
     478             * Work around openjdk bug. It leads to drawing artefacts when zooming in a lot. (#4289, #4424)
     479             * (It looks like int overflow when clipping.) We do custom clipping.
     480             */
     481            Rectangle bounds = g.getClipBounds();
     482            bounds.grow(100, 100);                  // avoid arrow heads at the border
     483            LineClip clip = new LineClip();
     484            drawIt = clip.cohenSutherland(p1.x, p1.y, p2.x, p2.y, bounds.x, bounds.y, bounds.x+bounds.width, bounds.y+bounds.height);
     485            p1 = clip.getP1();
     486            p2 = clip.getP2();
     487        } else {
     488            drawIt = isSegmentVisible(p1, p2);
     489        }
     490        if (drawIt) {
    474491            path.moveTo(p1.x, p1.y);
    475492            path.lineTo(p2.x, p2.y);
    476493
    477494            if (showDirection) {
    478                 double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI;
    479                 path.lineTo((int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI)));
    480                 path.moveTo((int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI)));
     495                final double l =  10. / p1.distance(p2);
     496
     497                final double sx = l * (p1.x - p2.x);
     498                final double sy = l * (p1.y - p2.y);
     499
     500                path.lineTo (p2.x + (int) Math.round(cosPHI * sx - sinPHI * sy), p2.y + (int) Math.round(sinPHI * sx + cosPHI * sy));
     501                path.moveTo (p2.x + (int) Math.round(cosPHI * sx + sinPHI * sy), p2.y + (int) Math.round(- sinPHI * sx + cosPHI * sy));
    481502                path.lineTo(p2.x, p2.y);
    482503            }
Note: See TracChangeset for help on using the changeset viewer.