Exemplo n.º 1
0
//---------------------------------------------------------------
void IsoLine::drawIsoLine(GRIBOverlayFactory *pof, wxDC *dc, PlugIn_ViewPort *vp, bool bHiDef)
{
    int nsegs = trace.size();
    if(nsegs < 1)
        return;

    GetGlobalColor ( _T ( "UITX1" ), &isoLineColor );

#if wxUSE_GRAPHICS_CONTEXT
    wxGraphicsContext *pgc = NULL;
#endif

    if(dc) {
        wxPen ppISO ( isoLineColor, 2 );

#if wxUSE_GRAPHICS_CONTEXT
        wxMemoryDC *pmdc;
        pmdc= wxDynamicCast(dc, wxMemoryDC);
        pgc = wxGraphicsContext::Create(*pmdc);
        pgc->SetPen(ppISO);
#endif
        dc->SetPen(ppISO);
    } else { /* opengl */
#ifdef ocpnUSE_GL
        //      Enable anti-aliased lines, at best quality
        glEnable( GL_LINE_SMOOTH );
        glEnable( GL_BLEND );
        glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
        glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
        glLineWidth( 2 );

        glColor4ub(isoLineColor.Red(), isoLineColor.Green(), isoLineColor.Blue(),
                   255/*isoLineColor.Alpha()*/);
        glBegin( GL_LINES );
#endif
    }

    std::list<Segment *>::iterator it;

    //---------------------------------------------------------
    // Dessine les segments
    //---------------------------------------------------------
    for (it=trace.begin(); it!=trace.end(); it++)
    {
        Segment *seg = *it;

        /* skip segments that go the wrong way around the world */
        if(seg->px1+180 < vp->clon && seg->px2+180 > vp->clon)
            continue;
        if(seg->px1+180 > vp->clon && seg->px2+180 < vp->clon)
            continue;
        if(seg->px1-180 < vp->clon && seg->px2-180 > vp->clon)
            continue;
        if(seg->px1-180 > vp->clon && seg->px2-180 < vp->clon)
            continue;

        {
            wxPoint ab;
            GetCanvasPixLL(vp, &ab, seg->py1, seg->px1);
            wxPoint cd;
            GetCanvasPixLL(vp, &cd, seg->py2, seg->px2);

            if(dc) {
#if wxUSE_GRAPHICS_CONTEXT
                if(bHiDef && pgc)
                    pgc->StrokeLine(ab.x, ab.y, cd.x, cd.y);
                else
#endif
                    dc->DrawLine(ab.x, ab.y, cd.x, cd.y);
            } else { /* opengl */
#ifdef ocpnUSE_GL
                glVertex2d(ab.x, ab.y);
                glVertex2d(cd.x, cd.y);
#endif
            }
        }
    }

#if 0
    int text_sx, text_sy;
    dc.GetTextExtent(_T("10000"), &text_sx, &text_sy);
//      double m = text_sy / 2;
    int label_size = text_sx;
    int label_space = 400;
//      double coef = .01;
    int len = label_space/4;

    //    Allocate an array big enough
    wxPoint *pPoints = new wxPoint[nsegs+1];

    MySegListList::Node *listnode;
    listnode = m_SegListList.GetFirst();
    while(listnode)
    {
        MySegList *listsort = listnode->GetData();

        //    Fill in the array
        MySegList::Node *node;
        Segment *seg;

        node = listsort->GetFirst();
        if(node)
        {
            seg = node->GetData();
//                  wxPoint ab = vp->GetMercatorPixFromLL(seg->py1, seg->px1);
//                  wxPoint ab(0,0);
            wxPoint ab;
            GetCanvasPixLL(vp, &ab, seg->py1, seg->px1);
            pPoints[0] = ab;
        }
        int ip=1;

        while (node)
        {
            seg = node->GetData();
//                  wxPoint cd = vp->GetMercatorPixFromLL(seg->py2, seg->px2);
//                  wxPoint cd(0,0);
            wxPoint cd;
            GetCanvasPixLL(vp, &cd, seg->py2, seg->px2);
            pPoints[ip++] = cd;

            node=node->GetNext();
        }

        int np = listsort->GetCount() + 1;


        if(np > 1)
        {

            // Test code
            //          dc.DrawLines(np, pPoints);

            GenerateSpline(np, pPoints);

            //    Test Code
            //            dc.DrawLines(&ocpn_wx_spline_point_list, 0, 0 );

            bool bDrawing = true;
            wxPoint lstart;

            wxList::compatibility_iterator snode = ocpn_wx_spline_point_list.GetFirst();
            wxPoint *point0 = (wxPoint *)snode->GetData();
            snode=snode->GetNext();

            while (snode)
            {
                wxPoint *point = (wxPoint *)snode->GetData();

                ClipResult res = cohen_sutherland_line_clip_i ( &point0->x, &point0->y, &point->x, &point->y,
                                 0, vp->pix_width, 0, vp->pix_height );
                if ( res != Invisible )
                {
                    int dl = (int)sqrt(
                                 (double)((point0->x - point->x) * (point0->x - point->x))
                                 +(double)((point0->y - point->y) * (point0->y - point->y)));
                    if(bDrawing)
                    {
                        len += dl;
                        if(len > label_space)
                        {
                            bDrawing = false;
                            len = 0;
                            lstart = *point;
                        }
                    }
                    else
                    {
                        len += dl;
                        if(len > label_size)
                        {
                            bDrawing = true;
                            len = 0;
                        }
                    }
                }

                *point0 = *point;
                snode=snode->GetNext();
            }

            ClearSplineList();
        }

        listnode = listnode->GetNext();             // Next continuous chain

    }

    delete[] pPoints;

#endif

#if wxUSE_GRAPHICS_CONTEXT
    delete pgc;
#endif

    if(!dc) /* opengl */
        glEnd();
}
Exemplo n.º 2
0
//---------------------------------------------------------------
void IsoLine::drawIsoLine(GRIBOverlayFactory *pof, wxDC &dc, PlugIn_ViewPort *vp, bool bShowLabels, bool bHiDef)
{
      int nsegs = trace.size();
      if(nsegs < 1)
            return;

      GetGlobalColor ( _T ( "UITX1" ), &isoLineColor );
      wxPen ppISO ( isoLineColor, 2 );

#if wxUSE_GRAPHICS_CONTEXT
      wxMemoryDC *pmdc;
//      pmdc = dynamic_cast<wxMemoryDC*>(&dc);
      pmdc= wxDynamicCast(&dc, wxMemoryDC);
      wxGraphicsContext *pgc = wxGraphicsContext::Create(*pmdc);
      pgc->SetPen(ppISO);
#endif

      dc.SetPen(ppISO);



      std::list<Segment *>::iterator it;

    //---------------------------------------------------------
    // Dessine les segments
    //---------------------------------------------------------
    for (it=trace.begin(); it!=trace.end(); it++)
    {
        Segment *seg = *it;

        {
 //             wxPoint ab = vp->GetMercatorPixFromLL(seg->py1, seg->px1);
 //             wxPoint cd = vp->GetMercatorPixFromLL(seg->py2, seg->px2);
            wxPoint ab;
            GetCanvasPixLL(vp, &ab, seg->py1, seg->px1);
            wxPoint cd;
            GetCanvasPixLL(vp, &cd, seg->py2, seg->px2);


///            ClipResult res = cohen_sutherland_line_clip_i ( &ab.x, &ab.y, &cd.x, &cd.y,
///                         0, vp->pix_width, 0, vp->pix_height );
///            if ( res != Invisible )
             {
#if wxUSE_GRAPHICS_CONTEXT
                  if(bHiDef && pgc)
                        pgc->StrokeLine(ab.x, ab.y, cd.x, cd.y);
                  else 
                        dc.DrawLine(ab.x, ab.y, cd.x, cd.y);
#else
                  dc.DrawLine(ab.x, ab.y, cd.x, cd.y);
#endif
             }

        }
    }
//#endif

      int text_sx, text_sy;
      dc.GetTextExtent(_T("10000"), &text_sx, &text_sy);
//      double m = text_sy / 2;
      int label_size = text_sx;
      int label_space = 400;
//      double coef = .01;
      int len = label_space/4;

      //    Allocate an array big enough
      wxPoint *pPoints = new wxPoint[nsegs+1];

      MySegListList::Node *listnode;
      listnode = m_SegListList.GetFirst();
      while(listnode)
      {
            MySegList *listsort = listnode->GetData();

            //    Fill in the array
            MySegList::Node *node;
            Segment *seg;

            node = listsort->GetFirst();
            if(node)
            {
                  seg = node->GetData();
//                  wxPoint ab = vp->GetMercatorPixFromLL(seg->py1, seg->px1);
//                  wxPoint ab(0,0);
				  wxPoint ab;
				  GetCanvasPixLL(vp, &ab, seg->py1, seg->px1);
                  pPoints[0] = ab;
            }
            int ip=1;

            while (node)
            {
                  seg = node->GetData();
//                  wxPoint cd = vp->GetMercatorPixFromLL(seg->py2, seg->px2);
//                  wxPoint cd(0,0);
				  wxPoint cd;
				  GetCanvasPixLL(vp, &cd, seg->py2, seg->px2);
                  pPoints[ip++] = cd;

                  node=node->GetNext();
            }

            int np = listsort->GetCount() + 1;


            if(np > 1)
            {

      // Test code
      //          dc.DrawLines(np, pPoints);

                  GenerateSpline(np, pPoints);

      //    Test Code
      //            dc.DrawLines(&ocpn_wx_spline_point_list, 0, 0 );

                  bool bDrawing = true;
                  wxPoint lstart;

                  wxList::compatibility_iterator snode = ocpn_wx_spline_point_list.GetFirst();
                  wxPoint *point0 = (wxPoint *)snode->GetData();
                  snode=snode->GetNext();

                  while (snode)
                  {
                        wxPoint *point = (wxPoint *)snode->GetData();

                        ClipResult res = cohen_sutherland_line_clip_i ( &point0->x, &point0->y, &point->x, &point->y,
                                    0, vp->pix_width, 0, vp->pix_height );
                        if ( res != Invisible )
                        {
                              int dl = (int)sqrt(
                                            (double)((point0->x - point->x) * (point0->x - point->x))
                                          +(double)((point0->y - point->y) * (point0->y - point->y)));
                              if(bDrawing)
                              {
                                    len += dl;
                                    if(len > label_space)
                                    {
                                          bDrawing = false;
                                          len = 0;
                                          lstart = *point;
                                    }
                              }
                              else
                              {
                                    len += dl;
                                    if(len > label_size)
                                    {
                                          bDrawing = true;
                                          len = 0;
#if 0
                                          if(bShowLabels)
                                          {
                                                double label_angle = atan2((double)(lstart.y - point->y),
                                                    (double)(point->x - lstart.x)) * 180. / PI;
                                                wxString label;
                                                label.Printf(_T("%d"), (int)(value*coef+0.5));

                                                double xs = lstart.x - (m * sin(label_angle * PI / 180.));
                                                double ys = lstart.y - (m * cos(label_angle * PI / 180.));
                                                dc.DrawRotatedText(label, (int)xs, (int)ys, label_angle);
                                          }
#endif
                                    }
                              }

#if 0
//                              if(bDrawing || !bShowLabels)
                              {
                                    if(bHiDef)
                                          dc.StrokeLine(point0->x, point0->y, point->x, point->y);
                                    else
                                          dc.DrawLine(point0->x, point0->y, point->x, point->y);
                              }
#endif
                        }

                        *point0 = *point;
                        snode=snode->GetNext();
                  }

                  ClearSplineList();
            }

            listnode = listnode->GetNext();             // Next continuous chain

      }

      delete[] pPoints;

#if wxUSE_GRAPHICS_CONTEXT
      delete pgc;
#endif

}