예제 #1
0
void
YUV2RGB(RGB& in,RGB& out){
  out[0]=(double)(1.0*in[0]+1.402*in[2]);
  out[1]=(double)(1.0*in[0]-0.34413*in[1]-0.71414*in[2]);
  out[2]=(double)(1.0*in[0]+1.772*in[1]);
  for(int c=0;c<3;c++)
    out[c]=lmt(out[c]);
}
예제 #2
0
/*
 Update a single route segment lengths
 Also, compute total route length by summing segment distances.
 */
void Route::UpdateSegmentDistance( RoutePoint *prp0, RoutePoint *prp, double planspeed )
{
    double slat1 = prp0->m_lat, slon1 = prp0->m_lon;
    double slat2 = prp->m_lat, slon2 = prp->m_lon;

//    Calculate the absolute distance from 1->2

    double dd;
    // why are we using mercator rather than great circle here?? [sean 8-11-2015]
    DistanceBearingMercator( slat1, slon1, slat2, slon2, 0, &dd );

//    And store in Point 2
    prp->m_seg_len = dd;

    m_route_length += dd;

//    If Point1 Description contains VMG, store it for Properties Dialog in Point2
//    If Point1 Description contains ETD, store it in Point1

    if( planspeed > 0. ) {
        double vmg = 0.0;
        wxDateTime etd;

        if( prp0->m_MarkDescription.Find( _T("VMG=") ) != wxNOT_FOUND ) {
            wxString s_vmg = ( prp0->m_MarkDescription.Mid(
                                   prp0->m_MarkDescription.Find( _T("VMG=") ) + 4 ) ).BeforeFirst( ';' );
            if( !s_vmg.ToDouble( &vmg ) ) vmg = planspeed;
        }

        double legspeed = planspeed;
        if( vmg > 0.1 && vmg < 1000. ) legspeed = vmg;
        if( legspeed > 0.1 && legspeed < 1000. ) {
            m_route_time += 3600. * dd / legspeed;
            prp->m_seg_vmg = legspeed;
        }

        prp0->m_seg_etd = wxInvalidDateTime;
        if( prp0->m_MarkDescription.Find( _T("ETD=") ) != wxNOT_FOUND ) {
            wxString s_etd = ( prp0->m_MarkDescription.Mid(
                                   prp0->m_MarkDescription.Find( _T("ETD=") ) + 4 ) ).BeforeFirst( ';' );
            const wxChar *parse_return = etd.ParseDateTime( s_etd );
            if( parse_return ) {
                wxString tz( parse_return );

                if( tz.Find( _T("UT") ) != wxNOT_FOUND ) prp0->m_seg_etd = etd;
                else
                    if( tz.Find( _T("LMT") ) != wxNOT_FOUND ) {
                        prp0->m_seg_etd = etd;
                        long lmt_offset = (long) ( ( prp0->m_lon * 3600. ) / 15. );
                        wxTimeSpan lmt( 0, 0, (int) lmt_offset, 0 );
                        prp0->m_seg_etd -= lmt;
                    } else
                        prp0->m_seg_etd = etd.ToUTC();
            }
        }
    }
}
예제 #3
0
wxString timestamp2s(wxDateTime ts, int tz_selection, long LMT_offset, int format)
{
    wxString s = _T("");
    wxString f;
    if (format == INPUT_FORMAT) f = _T("%m/%d/%Y %H:%M");
    else if (format == TIMESTAMP_FORMAT) f = _T("%m/%d/%Y %H:%M:%S");
    else f = _T(" %m/%d %H:%M");
    switch (tz_selection) {
    case 0: s.Append(ts.Format(f));
        if (format != INPUT_FORMAT) s.Append(_T(" UT"));
        break;
    case 1: s.Append(ts.FromUTC().Format(f)); break;
    case 2:
        wxTimeSpan lmt(0,0,(int)LMT_offset,0);
        s.Append(ts.Add(lmt).Format(f));
        if (format != INPUT_FORMAT) s.Append(_T(" LMT"));
    }
    return(s);
}
예제 #4
0
wxDateTime RoutePoint::GetETD()
{
    if( m_seg_etd.IsValid() ) {
        if(!GetETA().IsValid() || m_seg_etd > GetETA()) {
            return m_seg_etd;
        } else {
            return GetETA();
        }
    } else {
        if( m_MarkDescription.Find( _T("ETD=") ) != wxNOT_FOUND ) {
            wxDateTime etd = wxInvalidDateTime;
            wxString s_etd = ( m_MarkDescription.Mid(m_MarkDescription.Find( _T("ETD=") ) + 4 ) ).BeforeFirst( ';' );
            const wxChar *parse_return = etd.ParseDateTime( s_etd );
            if( parse_return ) {
                wxString tz( parse_return );
                
                if( tz.Find( _T("UT") ) != wxNOT_FOUND ) {
                    m_seg_etd = etd;
                }
                else {
                    if( tz.Find( _T("LMT") ) != wxNOT_FOUND ) {
                        m_seg_etd = etd;
                        long lmt_offset = (long) ( ( m_lon * 3600. ) / 15. );
                        wxTimeSpan lmt( 0, 0, (int) lmt_offset, 0 );
                        m_seg_etd -= lmt;
                    } else {
                        m_seg_etd = etd.ToUTC();
                    }
                }
                if( etd.IsValid() && (!GetETA().IsValid() || etd > GetETA()) ) {
                    m_MarkDescription.Replace( s_etd, wxEmptyString);
                    m_seg_etd = etd;
                    return m_seg_etd;
                } else {
                    return GetETA();
                }
            }
        }
    }
    return wxInvalidDateTime;
}
예제 #5
0
파일: Route.cpp 프로젝트: kheyse/OpenCPN
/*
 Update the route segment lengths, storing each segment length in <destination> point.
 Also, compute total route length by summing segment distances.
 */
void Route::UpdateSegmentDistances( double planspeed )
{
    wxPoint rpt, rptn;
    float slat1, slon1, slat2, slon2;

    double route_len = 0.0;
    double route_time = 0.0;

    wxRoutePointListNode *node = pRoutePointList->GetFirst();

    if( node ) {
        RoutePoint *prp0 = node->GetData();
        slat1 = prp0->m_lat;
        slon1 = prp0->m_lon;

        node = node->GetNext();

        while( node ) {
            RoutePoint *prp = node->GetData();
            slat2 = prp->m_lat;
            slon2 = prp->m_lon;

//    Calculate the absolute distance from 1->2

            double brg, dd;
            DistanceBearingMercator( slat1, slon1, slat2, slon2, &brg, &dd );

//    And store in Point 2
            prp->m_seg_len = dd;

            route_len += dd;

            slat1 = slat2;
            slon1 = slon2;

//    If Point1 Description contains VMG, store it for Properties Dialog in Point2
//    If Point1 Description contains ETD, store it in Point1

            if( planspeed > 0. ) {
                double vmg = 0.0;
                wxDateTime etd;

                if( prp0->m_MarkDescription.Find( _T("VMG=") ) != wxNOT_FOUND ) {
                    wxString s_vmg = ( prp0->m_MarkDescription.Mid(
                            prp0->m_MarkDescription.Find( _T("VMG=") ) + 4 ) ).BeforeFirst( ';' );
                    if( !s_vmg.ToDouble( &vmg ) ) vmg = planspeed;
                }

                double legspeed = planspeed;
                if( vmg > 0.1 && vmg < 1000. ) legspeed = vmg;
                if( legspeed > 0.1 && legspeed < 1000. ) {
                    route_time += dd / legspeed;
                    prp->m_seg_vmg = legspeed;
                }

                prp0->m_seg_etd = wxInvalidDateTime;
                if( prp0->m_MarkDescription.Find( _T("ETD=") ) != wxNOT_FOUND ) {
                    wxString s_etd = ( prp0->m_MarkDescription.Mid(
                            prp0->m_MarkDescription.Find( _T("ETD=") ) + 4 ) ).BeforeFirst( ';' );
                    const wxChar *parse_return = etd.ParseDateTime( s_etd );
                    if( parse_return ) {
                        wxString tz( parse_return );

                        if( tz.Find( _T("UT") ) != wxNOT_FOUND ) prp0->m_seg_etd = etd;
                        else
                            if( tz.Find( _T("LMT") ) != wxNOT_FOUND ) {
                                prp0->m_seg_etd = etd;
                                long lmt_offset = (long) ( ( prp0->m_lon * 3600. ) / 15. );
                                wxTimeSpan lmt( 0, 0, (int) lmt_offset, 0 );
                                prp0->m_seg_etd -= lmt;
                            } else
                                prp0->m_seg_etd = etd.ToUTC();
                    }
                }
            }

            prp0 = prp;

            node = node->GetNext();
        }
    }

    m_route_length = route_len;
    m_route_time = route_time * 3600.;
}
예제 #6
0
int
main(int argc,char** argv){
  BMP fin (argv[1]);
  BMP fout;fout.init(fin.w,fin.h);
  
  double  (*in  )[8];
  double  (*out )[8];
  double  (*out2)[8];
  fftw_plan p ;
  int i,j,idx;
 
  in  = (double (*)[8])fftw_malloc( sizeof(double) * 8*8);
  out = (double (*)[8])fftw_malloc( sizeof(double) * 8*8);
  out2= (double (*)[8])fftw_malloc( sizeof(double) * 8*8);

 
  for(int c=0;c<3;c++){
    for(int by=0;by<fin.h/8;by++)
      for(int bx=0;bx<fin.w/8;bx++){
	for(int dy=0;dy<8;dy++)
	  for(int dx=0;dx<8;dx++){
	    int x=bx*8+dx;
	    int y=by*8+dy;
	    in[   dy][   dx]=fin(x,y)[c];
	  }


	p = fftw_plan_r2r_2d( 8,8,
			      (double*)in, (double*)out,
			      FFTW_REDFT10,FFTW_REDFT10,
			      FFTW_ESTIMATE );
      
	fftw_execute(p);


	for(int dy=0;dy<8;dy++)
	  for(int dx=0;dx<8;dx++){
	    out[   dy][   dx]/=8*8*4;
	  }
      
	for(int dy=0;dy<8;dy++)
	  for(int dx=0;dx<8;dx++){
	    //	    out[   dy][   dx]=round(out[   dy][   dx]/(qt[dy][dx]*quality));
	    out[   dy][   dx]=round(out[   dy][   dx]/2);
	  }

	for(int dy=0;dy<8;dy++)
	  for(int dx=0;dx<8;dx++){
	    //	    out[   dy][   dx]*=qt[dy][dx]*quality;
	    out[   dy][   dx]*=2;
	  }

      
	// for(int dy=0;dy<8;dy++)
	//   for(int dx=0;dx<8;dx++){
	//     printf("%04d\n",(int)out[   dy][   dx]);
	//   }
      
	p = fftw_plan_r2r_2d( 8,8,
			      (double*)out, (double*)out2,
			      FFTW_REDFT01,FFTW_REDFT01,
			      FFTW_ESTIMATE );
	fftw_execute(p);

      


	for(int dy=0;dy<8;dy++)
	  for(int dx=0;dx<8;dx++){
	    int x=bx*8+dx;
	    int y=by*8+dy;
	    fout(x,y)[c]=lmt(out2[   dy][   dx]);
	  }



      }
  }

  fout.write(argv[2]);
 
  fftw_destroy_plan(p);
  fftw_free(in);
  fftw_free(out);
  fftw_free(out2);
 
  return true;
}