View | Details | Raw Unified | Return to bug 61119
Collapse All | Expand All

(-)src/java/org/apache/poi/sl/draw/geom/ArcTanExpression.java (-1 / +1 lines)
Lines 37-43 Link Here
37
    public double evaluate(Context ctx){
37
    public double evaluate(Context ctx){
38
        double x = ctx.getValue(arg1);
38
        double x = ctx.getValue(arg1);
39
        double y = ctx.getValue(arg2);
39
        double y = ctx.getValue(arg2);
40
        return Math.atan(y / x);
40
        return Math.toDegrees(Math.atan2(y, x))*60000.;
41
    }
41
    }
42
42
43
}
43
}
(-)src/java/org/apache/poi/sl/draw/geom/ArcToCommand.java (-10 / +82 lines)
Lines 22-27 Link Here
22
import java.awt.geom.Arc2D;
22
import java.awt.geom.Arc2D;
23
import java.awt.geom.Path2D;
23
import java.awt.geom.Path2D;
24
import java.awt.geom.Point2D;
24
import java.awt.geom.Point2D;
25
import java.awt.geom.Rectangle2D;
25
26
26
import org.apache.poi.sl.draw.binding.CTPath2DArcTo;
27
import org.apache.poi.sl.draw.binding.CTPath2DArcTo;
27
28
Lines 51-68 Link Here
51
    public void execute(Path2D.Double path, Context ctx){
52
    public void execute(Path2D.Double path, Context ctx){
52
        double rx = ctx.getValue(wr);
53
        double rx = ctx.getValue(wr);
53
        double ry = ctx.getValue(hr);
54
        double ry = ctx.getValue(hr);
54
        double start = ctx.getValue(stAng) / 60000;
55
        double ooStart = ctx.getValue(stAng) / 60000.;
55
        double extent = ctx.getValue(swAng) / 60000;
56
        double ooExtent = ctx.getValue(swAng) / 60000.;
57
        Rectangle2D r = ctx.getShapeAnchor();
58
59
        // skew the angles for AWT output
60
        double awtStart = convertOoxml2AwtAngle(ooStart, rx, ry);
61
        double awtSweep = convertOoxml2AwtAngle(ooStart+ooExtent, rx, ry)-awtStart;
62
63
        // calculate the inverse angle - taken from the (reversed) preset definition
64
        double radStart = Math.toRadians(ooStart);
65
        double invStart = Math.atan2(rx * Math.sin(radStart), ry * Math.cos(radStart));
66
56
        Point2D pt = path.getCurrentPoint();
67
        Point2D pt = path.getCurrentPoint();
57
        double x0 = pt.getX() - rx - rx * Math.cos(Math.toRadians(start));
68
        // calculate top/left corner
58
        double y0 = pt.getY() - ry - ry * Math.sin(Math.toRadians(start));
69
        double x0 = pt.getX() - rx * Math.cos(invStart) - rx;
70
        double y0 = pt.getY() - ry * Math.sin(invStart) - ry;
59
71
60
        Arc2D arc = new Arc2D.Double(
72
        Arc2D arc = new Arc2D.Double(x0, y0, 2 * rx, 2 * ry, awtStart, awtSweep, Arc2D.OPEN);
61
                         x0,
62
                         y0,
63
                         2 * rx, 2 * ry,
64
                         -start, -extent, 
65
                         Arc2D.OPEN);
66
		path.append(arc, true);
73
		path.append(arc, true);
67
    }
74
    }
75
76
    /**
77
     * Arc2D angles are skewed, OOXML aren't ... so we need to unskew them
78
     *
79
     * a = height/width of bounding box
80
     * angle_ooxml = ATAN(a * TAN(angle_arc2d))
81
     *
82
     * Furthermore ooxml angle starts at the X-axis and increases clock-wise,
83
     * where as Arc2D api states
84
     * "45 degrees always falls on the line from the center of the ellipse to the upper right corner of the framing rectangle"
85
     * so we need to reverse it
86
     *
87
     * AWT:                      OOXML:
88
     *            |90/-270                     |270/-90 (16200000)
89
     *            |                            |
90
     * +/-180-----------0           +/-180-----------0
91
     *            |               (10800000)   |
92
     *            |270/-90                     |90/-270 (5400000)
93
     *
94
     * Furthermore ooxml angle is degree * 60000
95
     *
96
     * @see <a href="http://www.onlinemathe.de/forum/Problem-bei-Winkelberechnungen-einer-Ellipse">unskew angle</a>
97
     **/
98
    private double convertOoxml2AwtAngle(double ooAngle, double width, double height) {
99
        double aspect = (height / width);
100
        // reverse angle for awt
101
        double awtAngle = -ooAngle;
102
        // normalize angle, in case it's < -360 or > 360 degrees
103
        double awtAngle2 = awtAngle%360.;
104
        double awtAngle3 = awtAngle-awtAngle2;
105
        // because of tangens nature, the values left [90°-270°] and right [270°-90°] of the axis are mirrored/the same
106
        // and the result of atan2 need to be justified
107
        switch ((int)(awtAngle2 / 90)) {
108
            case -3:
109
                // -270 to -360
110
                awtAngle3 -= 360;
111
                awtAngle2 += 360;
112
                break;
113
            case -2:
114
            case -1:
115
                // -90 to -270
116
                awtAngle3 -= 180;
117
                awtAngle2 += 180;
118
                break;
119
            default:
120
            case 0:
121
                // -90 to 90
122
                break;
123
            case 2:
124
            case 1:
125
                // 90 to 270
126
                awtAngle3 += 180;
127
                awtAngle2 -= 180;
128
                break;
129
            case 3:
130
                // 270 to 360
131
                awtAngle3 += 360;
132
                awtAngle2 -= 360;
133
                break;
134
        }
135
136
        // skew
137
        awtAngle = Math.toDegrees(Math.atan2(Math.tan(Math.toRadians(awtAngle2)), aspect)) + awtAngle3;
138
        return awtAngle;
139
    }
68
}
140
}
(-)src/java/org/apache/poi/sl/draw/geom/CosExpression.java (-1 / +1 lines)
Lines 36-42 Link Here
36
36
37
    public double evaluate(Context ctx){
37
    public double evaluate(Context ctx){
38
        double x = ctx.getValue(arg1);
38
        double x = ctx.getValue(arg1);
39
        double y = ctx.getValue(arg2)/ 60000;
39
        double y = ctx.getValue(arg2)/ 60000.;
40
        return x * Math.cos(Math.toRadians(y));
40
        return x * Math.cos(Math.toRadians(y));
41
    }
41
    }
42
42
(-)src/java/org/apache/poi/sl/draw/geom/CosineArcTanExpression.java (-1 / +1 lines)
Lines 39-45 Link Here
39
        double x = ctx.getValue(arg1);
39
        double x = ctx.getValue(arg1);
40
        double y = ctx.getValue(arg2);
40
        double y = ctx.getValue(arg2);
41
        double z = ctx.getValue(arg3);
41
        double z = ctx.getValue(arg3);
42
        return x*Math.cos(Math.atan(z / y));
42
        return x*Math.cos(Math.atan2(z, y));
43
    }
43
    }
44
44
45
}
45
}
(-)src/java/org/apache/poi/sl/draw/geom/Formula.java (-14 / +24 lines)
Lines 80-86 Link Here
80
            @Override
80
            @Override
81
            double evaluate(Context ctx){
81
            double evaluate(Context ctx){
82
                Rectangle2D anchor = ctx.getShapeAnchor();
82
                Rectangle2D anchor = ctx.getShapeAnchor();
83
                return anchor.getY() + anchor.getHeight();
83
                return anchor.getMaxY();
84
            }
84
            }
85
85
86
         });
86
         });
Lines 117-123 Link Here
117
            @Override
117
            @Override
118
            double evaluate(Context ctx){
118
            double evaluate(Context ctx){
119
                Rectangle2D anchor = ctx.getShapeAnchor();
119
                Rectangle2D anchor = ctx.getShapeAnchor();
120
                return anchor.getX() + anchor.getWidth()/2.;
120
                return anchor.getCenterX();
121
            }
121
            }
122
122
123
         });
123
         });
Lines 217-223 Link Here
217
            @Override
217
            @Override
218
            double evaluate(Context ctx){
218
            double evaluate(Context ctx){
219
                Rectangle2D anchor = ctx.getShapeAnchor();
219
                Rectangle2D anchor = ctx.getShapeAnchor();
220
                return anchor.getX() + anchor.getWidth();
220
                return anchor.getMaxX();
221
            }
221
            }
222
222
223
         });
223
         });
Lines 296-302 Link Here
296
        builtInFormulas.put("t",  new Formula(){
296
        builtInFormulas.put("t",  new Formula(){
297
            @Override
297
            @Override
298
            double evaluate(Context ctx){
298
            double evaluate(Context ctx){
299
                return ctx.getShapeAnchor().getY();
299
                Rectangle2D anchor = ctx.getShapeAnchor();
300
                return anchor.getY();
300
            }
301
            }
301
         });
302
         });
302
303
Lines 305-311 Link Here
305
            @Override
306
            @Override
306
            double evaluate(Context ctx){
307
            double evaluate(Context ctx){
307
                Rectangle2D anchor = ctx.getShapeAnchor();
308
                Rectangle2D anchor = ctx.getShapeAnchor();
308
                return anchor.getY() + anchor.getHeight()/2.;
309
                return anchor.getCenterY();
309
            }
310
            }
310
         });
311
         });
311
312
Lines 313-319 Link Here
313
        builtInFormulas.put("w",  new Formula(){
314
        builtInFormulas.put("w",  new Formula(){
314
            @Override
315
            @Override
315
            double evaluate(Context ctx){
316
            double evaluate(Context ctx){
316
                return ctx.getShapeAnchor().getWidth();
317
                Rectangle2D anchor = ctx.getShapeAnchor();
318
                return anchor.getWidth();
317
            }
319
            }
318
         });
320
         });
319
321
Lines 321-327 Link Here
321
        builtInFormulas.put("wd2",  new Formula(){
323
        builtInFormulas.put("wd2",  new Formula(){
322
            @Override
324
            @Override
323
            double evaluate(Context ctx){
325
            double evaluate(Context ctx){
324
                return ctx.getShapeAnchor().getWidth()/2.;
326
                Rectangle2D anchor = ctx.getShapeAnchor();
327
                return anchor.getWidth()/2.;
325
            }
328
            }
326
         });
329
         });
327
330
Lines 329-335 Link Here
329
        builtInFormulas.put("wd3",  new Formula(){
332
        builtInFormulas.put("wd3",  new Formula(){
330
            @Override
333
            @Override
331
            double evaluate(Context ctx){
334
            double evaluate(Context ctx){
332
                return ctx.getShapeAnchor().getWidth()/3.;
335
                Rectangle2D anchor = ctx.getShapeAnchor();
336
                return anchor.getWidth()/3.;
333
            }
337
            }
334
         });
338
         });
335
339
Lines 337-343 Link Here
337
        builtInFormulas.put("wd4",  new Formula(){
341
        builtInFormulas.put("wd4",  new Formula(){
338
            @Override
342
            @Override
339
            double evaluate(Context ctx){
343
            double evaluate(Context ctx){
340
                return ctx.getShapeAnchor().getWidth()/4.;
344
                Rectangle2D anchor = ctx.getShapeAnchor();
345
                return anchor.getWidth()/4.;
341
            }
346
            }
342
         });
347
         });
343
348
Lines 345-351 Link Here
345
        builtInFormulas.put("wd5",  new Formula(){
350
        builtInFormulas.put("wd5",  new Formula(){
346
            @Override
351
            @Override
347
            double evaluate(Context ctx){
352
            double evaluate(Context ctx){
348
                return ctx.getShapeAnchor().getWidth()/5.;
353
                Rectangle2D anchor = ctx.getShapeAnchor();
354
                return anchor.getWidth()/5.;
349
            }
355
            }
350
         });
356
         });
351
357
Lines 353-359 Link Here
353
        builtInFormulas.put("wd6",  new Formula(){
359
        builtInFormulas.put("wd6",  new Formula(){
354
            @Override
360
            @Override
355
            double evaluate(Context ctx){
361
            double evaluate(Context ctx){
356
                return ctx.getShapeAnchor().getWidth()/6.;
362
                Rectangle2D anchor = ctx.getShapeAnchor();
363
                return anchor.getWidth()/6.;
357
            }
364
            }
358
         });
365
         });
359
366
Lines 361-367 Link Here
361
        builtInFormulas.put("wd8",  new Formula(){
368
        builtInFormulas.put("wd8",  new Formula(){
362
            @Override
369
            @Override
363
            double evaluate(Context ctx){
370
            double evaluate(Context ctx){
364
                return ctx.getShapeAnchor().getWidth()/8.;
371
                Rectangle2D anchor = ctx.getShapeAnchor();
372
                return anchor.getWidth()/8.;
365
            }
373
            }
366
         });
374
         });
367
375
Lines 369-375 Link Here
369
        builtInFormulas.put("wd10",  new Formula(){
377
        builtInFormulas.put("wd10",  new Formula(){
370
            @Override
378
            @Override
371
            double evaluate(Context ctx){
379
            double evaluate(Context ctx){
372
                return ctx.getShapeAnchor().getWidth()/10.;
380
                Rectangle2D anchor = ctx.getShapeAnchor();
381
                return anchor.getWidth()/10.;
373
            }
382
            }
374
         });
383
         });
375
384
Lines 377-383 Link Here
377
        builtInFormulas.put("wd32",  new Formula(){
386
        builtInFormulas.put("wd32",  new Formula(){
378
            @Override
387
            @Override
379
            double evaluate(Context ctx){
388
            double evaluate(Context ctx){
380
                return ctx.getShapeAnchor().getWidth()/32.;
389
                Rectangle2D anchor = ctx.getShapeAnchor();
390
                return anchor.getWidth()/32.;
381
            }
391
            }
382
         });
392
         });
383
    }
393
    }
(-)src/java/org/apache/poi/sl/draw/geom/SinArcTanExpression.java (-1 / +1 lines)
Lines 45-51 Link Here
45
        double x = ctx.getValue(arg1);
45
        double x = ctx.getValue(arg1);
46
        double y = ctx.getValue(arg2);
46
        double y = ctx.getValue(arg2);
47
        double z = ctx.getValue(arg3);
47
        double z = ctx.getValue(arg3);
48
        return x*Math.sin(Math.atan(z / y));
48
        return x*Math.sin(Math.atan2(z, y));
49
    }
49
    }
50
50
51
}
51
}
(-)src/java/org/apache/poi/sl/draw/geom/SinExpression.java (-1 / +1 lines)
Lines 42-48 Link Here
42
42
43
    public double evaluate(Context ctx){
43
    public double evaluate(Context ctx){
44
        double x = ctx.getValue(arg1);
44
        double x = ctx.getValue(arg1);
45
        double y = ctx.getValue(arg2) / 60000;
45
        double y = ctx.getValue(arg2) / 60000.;
46
        return x * Math.sin(Math.toRadians(y));
46
        return x * Math.sin(Math.toRadians(y));
47
    }
47
    }
48
48

Return to bug 61119