00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <gdkmm.h>
00019 #include <iostream>
00020 #include <iomanip>
00021 #include <string>
00022
00023 #include "MapArea.h"
00024 #include "uvsim/guidance/FlightPlan.h"
00025 #include "uvsim/guidance/GeoCoord.h"
00026
00027 namespace uvsim
00028 {
00029 MapArea::MapArea(BaseObjectType* cobject,
00030 const Glib::RefPtr<Gtk::Builder>& glade)
00031 : Gtk::DrawingArea(cobject), m_glade(glade), m_zoom(1), m_panUD(0), m_panLR(0),
00032 relative_originX(0), relative_originY(0), relative_endX(0), relative_endY(0), scaleX(1), scaleY(1),
00033 image(Gdk::Pixbuf::create_from_file(std::string(DATADIR)+="/images/Map.png")),
00034 cr(get_window()->create_cairo_context()),
00035 flightPlan(m_pMainWindow->m_guide.getFlightPlan())
00036 {
00037 double temp;
00038
00039
00040 std::cout << "Constructing MapArea" << std::endl;
00041 std::cout << "Enter the Abscissa of the top-left corner of the map: ";
00042 std::cin >> relative_originX;
00043 std::cout << "Enter the Ordinate of the top-left corner of the map: ";
00044 std::cin >> relative_originY;
00045 std::cout << "Enter the Abscissa of the bottom-right corner of the map: ";
00046 std::cin >> relative_endX;
00047 std::cout << "Enter the Ordinate of the bottom-right corner of the map: ";
00048 std::cin >> relative_endY;
00049
00050
00051 if (relative_originX < relative_endX && relative_originY > relative_endY)
00052 {
00053
00054 image = image->Gdk::Pixbuf::rotate_simple(Gdk::PIXBUF_ROTATE_NONE);
00055 }
00056 else if (relative_originX < relative_endX && relative_originY < relative_endY)
00057 {
00058
00059 image = image->Gdk::Pixbuf::rotate_simple(Gdk::PIXBUF_ROTATE_COUNTERCLOCKWISE);
00060
00061 temp = relative_originY;
00062 relative_originY = relative_endY;
00063 relative_endY = temp;
00064 }
00065 else if (relative_originX > relative_endX && relative_originY < relative_endY)
00066 {
00067
00068 image = image->Gdk::Pixbuf::rotate_simple(Gdk::PIXBUF_ROTATE_UPSIDEDOWN);
00069
00070 temp = relative_originX;
00071 relative_originX = relative_endX;
00072 relative_endX = temp;
00073 temp = relative_originY;
00074 relative_originY = relative_endY;
00075 relative_endY = temp;
00076 }
00077 else if (relative_originX > relative_endX && relative_originY > relative_endY)
00078 {
00079
00080 image = image->Gdk::Pixbuf::rotate_simple(Gdk::PIXBUF_ROTATE_CLOCKWISE);
00081
00082 temp = relative_originX;
00083 relative_originX = relative_endX;
00084 relative_endX = temp;
00085 }
00086
00087 add_events( Gdk::POINTER_MOTION_MASK | Gdk::POINTER_MOTION_HINT_MASK |
00088 Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK );
00089 m_glade->get_widget_derived("mainWindow", m_pMainWindow);
00090 }
00091
00092 bool MapArea::on_expose_event(GdkEventExpose* event)
00093 {
00094 drawInitial();
00095 }
00096
00097 bool MapArea::on_motion_notify_event(GdkEventMotion* event)
00098 {
00099 double relative_y_map;
00100
00101 scaleX = abs(relative_endX - relative_originX) / image->get_width();
00102 scaleY = abs(relative_endY - relative_originY) / image->get_height();
00103
00104
00105
00106 relative_x = relative_originX + 1 / m_zoom * (event->x + m_panLR) * scaleX;
00107 relative_y = relative_originY + 1 / m_zoom * (event->y + m_panUD) * scaleY;
00108 relative_y_map = relative_originY - 1 / m_zoom * (event->y + m_panUD) * scaleY;
00109 std::cout << "x: " << relative_x << " y: " << relative_y_map << std::endl;
00110 }
00111
00112 bool MapArea::on_button_press_event(GdkEventButton* event)
00113 {
00114 std::cout << "Waypoint Added" << std::endl;
00115
00116 flightPlan = m_pMainWindow->m_guide.getFlightPlan();
00117
00118 flightPlan->push_back(GeoCoord(relative_x, relative_y, 190));
00119
00120 waypoint = *flightPlan;
00121
00122 std::cout << *flightPlan << std::endl;
00123 draw(waypoint);
00124 }
00125
00126 void MapArea::drawInitial()
00127 {
00128 double height = image -> get_height();
00129 double width = image -> get_width();
00130 double height_window = this->get_height();
00131 double width_window = this->get_width();
00132
00133 scaleX = abs(relative_endX - relative_originX) / width;
00134 scaleY = abs(relative_endY - relative_originY) / height;
00135
00136 this->get_window()->draw_pixbuf(this->get_style()->get_black_gc(),
00137 image->Gdk::Pixbuf::scale_simple(width * m_zoom, height * m_zoom,
00138 Gdk::INTERP_NEAREST),
00139 m_panLR,m_panUD,0,0, width_window,
00140 height_window,Gdk::RGB_DITHER_NORMAL,0,0);
00141
00142 flightPlan = m_pMainWindow->m_guide.getFlightPlan();
00143 waypoint = *flightPlan;
00144 draw(waypoint);
00145 }
00146
00147 void MapArea::draw(std::vector<GeoCoord> waypoint)
00148 {
00149 int counter;
00150
00151 for (counter = 0; counter < waypoint.size(); counter++)
00152 {
00153 cr = get_window()->create_cairo_context();
00154 cr->set_source_rgb(0.0,0.0,0.0);
00155 cr->set_line_width(3);
00156
00157
00158 cr->arc(((waypoint[counter].m_Latitude - relative_originX) / scaleX * m_zoom - m_panLR),
00159 ((waypoint[counter].m_Longitude - relative_originY) / scaleY * m_zoom - m_panUD),
00160 1, 0, 2 * M_PI);
00161
00162
00163 cr->move_to(((waypoint[counter].m_Latitude - relative_originX) / scaleX * m_zoom - m_panLR),
00164 ((waypoint[counter].m_Longitude - relative_originY) / scaleY * m_zoom - m_panUD));
00165
00166
00167 if ((counter + 1) != waypoint.size())
00168 {
00169 cr->line_to(((waypoint[counter + 1].m_Latitude - relative_originX) / scaleX * m_zoom - m_panLR),
00170 ((waypoint[counter + 1].m_Longitude - relative_originY) / scaleY * m_zoom - m_panUD));
00171 }
00172 cr->stroke();
00173 }
00174 }
00175
00176 void MapArea::drawRedCircle(std::vector<GeoCoord> waypoint)
00177 {
00178 int counter;
00179
00180 for (counter = 0; counter < waypoint.size(); counter++)
00181 {
00182 cr = get_window()->create_cairo_context();
00183 cr->set_source_rgb(1.0,0.0,0.0);
00184 cr->set_line_width(5);
00185
00186
00187 cr->arc(((waypoint[counter].m_Latitude - relative_originX) / scaleX * m_zoom - m_panLR),
00188 ((waypoint[counter].m_Longitude - relative_originY) / scaleY * m_zoom - m_panUD),
00189 5, 0, 2 * M_PI);
00190 cr->stroke();
00191 }
00192 }
00193
00194 void MapArea::drawRedCircle(GeoCoord waypoint)
00195 {
00196 cr = get_window()->create_cairo_context();
00197 cr->set_source_rgb(1.0,0.0,0.0);
00198 cr->set_line_width(5);
00199
00200
00201 cr->arc(((waypoint.m_Latitude - relative_originX) / scaleX * m_zoom - m_panLR),
00202 ((waypoint.m_Longitude - relative_originY) / scaleY * m_zoom - m_panUD),
00203 5, 0, 2 * M_PI);
00204 cr->stroke();
00205 }
00206
00207 }
00208