Subversion Repositories Projects

Rev

Rev 1565 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1563 - 1
package dongfang.mkt.ui.offscreendisplay;
2
 
3
/*
4
 * u/l:         geotagged geo:lat=47.327450 geo:lon=8.521657
5
 * l/r:         geotagged geo:lat=47.321749 geo:lon=8.534403
6
 * house:       geotagged geo:lat=47.324614 geo:lon=8.528202
7
 */
8
 
1568 - 9
import java.awt.BasicStroke;
1563 - 10
import java.awt.Color;
1568 - 11
import java.awt.Font;
1563 - 12
import java.awt.Graphics;
1568 - 13
import java.awt.Graphics2D;
1563 - 14
import java.awt.Image;
15
import java.awt.Toolkit;
1568 - 16
import java.util.Formatter;
17
import java.util.Locale;
1563 - 18
 
19
import javax.swing.JPanel;
20
 
21
import dongfang.mkt.datatype.GPSPosition;
1568 - 22
import dongfang.mkt.frames.OSDDataResponseFrame;
1563 - 23
 
1568 - 24
public class MapImageView extends JPanel implements OSDDataConsumer {
1563 - 25
        private Image mapImage;
26
        private Image copterImage;
27
 
1568 - 28
        private static final int MAPWIDTH = (int)(1132);
29
        private static final int MAPHEIGHT = (int)(977);
1563 - 30
 
31
        // It is assumed the map is north/south oriented!
32
        private GPSPosition upperLeft;
33
        private GPSPosition lowerRight;
34
 
1568 - 35
        private GPSPosition copterPosition;
36
        private GPSPosition homePosition;
1563 - 37
 
1568 - 38
        private int noseDirection;
39
        private int flightDirection;
40
        private double speed;
41
        private double height;
42
 
43
        private static final double degToRadianFactor = 360 / 2 / Math.PI;
1563 - 44
 
45
        private double relativeX(GPSPosition pos) {
46
                double lon = pos.getLongitude();
47
                // The sign should be OK here (positive) both east and west.
48
                double span = lowerRight.getLongitude() - upperLeft.getLongitude();
49
                double offset = lon - upperLeft.getLongitude();
1568 - 50
                double result = offset / span;
51
                if (result<0) result = 0; else if(result>1) result=1;
52
                return result;
1563 - 53
        }
54
 
55
        private double relativeY(GPSPosition pos) {
56
                double lat = pos.getLatitude();
57
                // The sign should be OK here (positive) both east and west.
58
                double span = lowerRight.getLatitude() - upperLeft.getLatitude();
59
                double offset = lat - upperLeft.getLatitude();
1568 - 60
                double result = offset / span;
61
                if (result<0) result = 0; else if(result>1) result=1;
62
                return result;
1563 - 63
        }
64
 
65
        public void paintComponent(Graphics g) {
1568 - 66
                int size = 32;
67
                int noseDotSize = 10;
68
 
69
                Graphics2D g2d = (Graphics2D)g;
70
                g2d.setStroke(new BasicStroke(5));
71
 
1563 - 72
                // Draw our Image object.
1568 - 73
 
74
                g2d.drawImage(mapImage, 0, 0, MAPWIDTH, MAPHEIGHT, this); // at location
75
 
76
                if (homePosition != null) {
77
                        g.setColor(Color.blue);
78
                        int x = (int)(MAPWIDTH * relativeX(homePosition) + 0.5);
79
                        int y = (int)(MAPHEIGHT * relativeY(homePosition) + 0.5);
80
                        g.drawRect(x-size/2, y-size/2, size, size);
81
                }
82
 
83
                if (copterPosition != null) {
84
                        int x = (int)(MAPWIDTH * relativeX(copterPosition) + 0.5);
85
                        int y = (int)(MAPHEIGHT * relativeY(copterPosition) + 0.5);
86
 
87
                        //g2d.clearRect(x-100, y-100, 200, 200);
88
 
89
                        double speedfactor = 15;
90
 
91
                        int speedArrowX = x + (int)(speedfactor * speed * Math.cos((90 - flightDirection) / degToRadianFactor));
92
                        int speedArrowY = y - (int)(speedfactor * speed * Math.sin((90 - flightDirection) / degToRadianFactor));
93
 
94
                        int noseDotX = x + (int)(size/2 * Math.cos((90 - noseDirection) / degToRadianFactor));
95
                        int noseDotY = y - (int)(size/2 * Math.sin((90 - noseDirection) / degToRadianFactor));
96
                        int noseDotEndX = x + (int)(size * Math.cos((90 - noseDirection) / degToRadianFactor));
97
                        int noseDotEndY = y - (int)(size * Math.sin((90 - noseDirection) / degToRadianFactor));
98
 
99
                        g2d.setColor(Color.yellow);
100
                        g.drawLine(x, y, speedArrowX, speedArrowY);
101
 
102
                        g2d.setColor(Color.red);
103
                        g.drawArc(x-size/2, y-size/2, size, size, 0, 360);
104
 
105
                        //g2d.setStroke(new BasicStroke(5));
106
                        g.drawLine(noseDotX, noseDotY, noseDotEndX, noseDotEndY);
107
 
108
                        String heightFormatString = "%+10.1f";
109
                        StringBuilder sb = new StringBuilder();
110
                        Formatter formatter = new Formatter(sb, Locale.US);
111
                        formatter.format(heightFormatString, height);
112
 
113
                        g.setColor(Color.green);
114
                        Font f = g2d.getFont();
115
                        f = f.deriveFont(18.0f);
116
                        f = f.deriveFont(Font.BOLD);
117
                        g2d.setFont(f);
118
                        g.drawString(sb.toString(), x-120, y);
119
                }
1563 - 120
        }
121
 
1568 - 122
        public void update(OSDDataResponseFrame data, long timestamp) {
123
                if (data==null) return;
124
                copterPosition = data.getCurrentPosition();
125
                homePosition = data.getHomePosition();
126
                speed = data.getGroundSpeed();
127
                height = data.getHeightByPressure();
128
                noseDirection = data.getCompassHeading();
129
                flightDirection = data.getDirectionOfFlight();
130
 
131
                repaint();
132
        }
133
 
134
        public void init() {
1563 - 135
                GPSPosition upperLeft = new GPSPosition();
136
                GPSPosition lowerRight = new GPSPosition();
137
 
1568 - 138
                /*
139
                upperLeft.setLatitude(47.328355);
140
                upperLeft.setLongitude(8.518231);
1563 - 141
 
142
                // * l/r:               geotagged geo:lat=47.321749 geo:lon=8.534403
1568 - 143
                lowerRight.setLatitude(47.321532);
144
                lowerRight.setLongitude(8.530822);
1563 - 145
 
146
                // geotagged geo:lat=47.324614 geo:lon=8.528202
1565 - 147
                highlight.setLatitude(47.324714);
148
                highlight.setLongitude(8.528102);
1568 - 149
                */
150
                upperLeft.setLatitude(47.344577);
151
                upperLeft.setLongitude(8.529304);
152
 
153
                // * l/r:               geotagged geo:lat=47.321749 geo:lon=8.534403
154
                lowerRight.setLatitude(47.337576);
155
                lowerRight.setLongitude(8.542220);
1563 - 156
 
1568 - 157
                setSize(MAPWIDTH, MAPHEIGHT);
158
                this.upperLeft = upperLeft;
159
                this.lowerRight = lowerRight;
160
                mapImage = Toolkit.getDefaultToolkit().getImage("qth.jpg");
1563 - 161
        }
162
}