亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? raytrace.cc

?? 一個機器人平臺
?? CC
字號:
/* *  Stage : a multi-robot simulator. *  Copyright (C) 2001, 2002 Richard Vaughan, Andrew Howard and Brian Gerkey. * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */// ==================================================================// Filename:	raytrace.cc// $Id: raytrace.cc,v 1.10 2002/11/01 19:12:30 rtv Exp $// RTV// ==================================================================#include "raytrace.hh"extern CWorld* world;CEntity* g_nullp = 0;CLineIterator::CLineIterator( double x, double y, double a, double b, 			      double ppm, CMatrix* matrix, LineIteratorMode pmode ){     m_matrix = matrix;  m_ppm = ppm;           m_x = x * m_ppm;  m_y = y * m_ppm;  m_ent = 0;  m_index = 0;  switch( pmode )  {    case PointToBearingRange:    {      double range = b;      double bearing = a;	      m_angle = bearing;      m_max_range = m_remaining_range = range * m_ppm;    }    break;    case PointToPoint:    {      double x1 = a;      double y1 = b;	      //printf( "From %.2f,%.2f to %.2f,%.2f\n", x,y,x1,y1 );      m_angle = atan2( y1-y, x1-x );      m_max_range = m_remaining_range = hypot( x1-x, y1-y ) * m_ppm;    }    break;    default:      puts( "Stage Warning: unknown LineIterator mode" );  }  //printf( "angle = %.2f remaining_range = %.2f\n", m_angle, m_remaining_range );  //fflush( stdout );};CEntity* CLineIterator::GetNextEntity( void ){  //PrintArray( m_ent );  if( m_remaining_range <= 0 ) return 0;  //printf( "current ptr: %p index: %d\n", m_ent[m_index], index );  if( !(m_ent && m_ent[m_index]) ) // if the ent array is null or empty    {      //printf( "before %d,%d\n", (int)m_x, (int)m_y );      // get a new array of pointers      m_ent = RayTrace( m_x, m_y, m_angle, m_remaining_range );      //PrintArray( m_ent );      //printf( "after %d,%d\n", (int)m_x, (int)m_y );      m_index = 0; // back to the start of the array    }    assert( m_ent != 0 ); // should be a valid array, even if empty   //PrintArray( m_ent );  //printf( "returning %p (index: %d) at: %d %d rng: %d\n",    //  m_ent[m_index], m_index, (int)m_x, (int)m_y, (int)m_remaining_range );  return m_ent[m_index++]; // return the next CEntity* (it may be null)}inline CEntity** CLineIterator::RayTrace( double &px, double &py, double pth, 				   double &remaining_range ){  int range = 0;    //printf( "Ray from %.2f,%.2f angle: %.2f remaining_range %.2f\n",   //  px, py, RTOD(pth), remaining_range );    // hops along each axis 1 cell at a time  double cospth = cos( pth );  double sinpth = sin( pth );    CEntity** ent = 0;    // Look along scan line for obstacles  for( range = 0; range < remaining_range; range++ )  {    px += cospth;    py += sinpth;          // stop this ray if we're out of bounds    if( px < 0 )     {       px = 0;       remaining_range = 0.0;    }    if( px >= m_matrix->width )     {       px = m_matrix->width-1;       remaining_range = 0.0;    }    if( py < 0 )     {       py = 0;       remaining_range = 0.0;    }    if( py >= m_matrix->height )     {       py = m_matrix->height-1;       remaining_range = 0.0;    }          //printf( "looking in %d,%d\n", (int)px, (int)py );          ent = m_matrix->get_cell( (int)px,(int)py );    if( !ent[0] && px+1 < m_matrix->width)       ent = m_matrix->get_cell( (int)px+1,(int)py );      	  if( ent[0] ) break;// we hit something!  }    remaining_range -= (double)range+1; // we have this much left to go    //if( ent && ent[0] )  //printf( "Hit %p (%d) at %.2f,%.2f with %.2f to go\n",   //    ent[0], ent[0]->type_num, px, py, remaining_range );  //else  //printf( "hit nothing. remaining range = %.2f\n", remaining_range );  // fflush( stdout );    return ent; // we hit these entities}; void CLineIterator::PrintArray( CEntity** ent ){  printf( "Array: " );    if( !ent )   {    printf( "(null)\n" );     return;  }    //puts( "foo" );  printf( "[ " );  int p = 0;  while( ent[p] ) printf( "%p ", (ent[p++]) );    printf( " ]\n" );    //fflush( stdout );}// an isoceles triangle is specified from it's point, by the bearing// and length of it's left side, and by the angle between the equal// sides. the triangle is scanned from point to base in increasingly// long lines perpendicular to the base. skip give the distance// increment between scan lines.CTriangleAreaIterator::CTriangleAreaIterator( double x, double y, 		       double bearing, double range, double angle,		       double skip,		       double ppm, CMatrix* matrix ){  //printf( "new CTriangleAreaIterator( %.2f, %.2f, %.2f, %.2f, %.2f )\n",  //  x, y, bearing, range, angle, skip );     m_matrix = matrix;  m_ppm = ppm;           m_x = x;  m_y = y;  m_angle = angle;  m_bearing = bearing;  m_skip = skip;  m_max_range = range;  m_range_so_far = 0;   // the angle of the lines to iterate over is   // perpendicular to the center line of the triangle.  m_li_angle = (m_bearing -angle/2.0) - M_PI_2;  li = 0; // initially null line iterator  assert( m_skip > 0 );}CTriangleAreaIterator::~CTriangleAreaIterator( void ){  if( li ) delete li;}CEntity* CTriangleAreaIterator::GetNextEntity( void ){  CEntity* ent;  while( m_range_so_far < m_max_range )  {    // if there's an iterator and it's still working, use it.    if( li && (ent = li->GetNextEntity()))      return ent;          // otherwise we need to create a new iterator    // after deleting the old one of course    if( li ) delete li;           //printf( "x: %.2f y: %.2f + skip: %.2f = ", m_x, m_y, m_skip );    // move from the current position down the left edge of the triangle    m_x += m_skip * cos(m_bearing);    m_y += m_skip * sin(m_bearing);    //printf( "x: %.2f y: %.2f ", m_x, m_y );          m_range_so_far += m_skip;          //printf( "range so far: %.2f\n", m_range_so_far );        // figure the length of the scan line    double li_len = m_range_so_far * sin( m_angle );          //printf( "new CLineIterator( %.2f, %.2f, %.2f, %.2f )\n",    //      m_x, m_y, m_li_angle, li_len );           li = new CLineIterator( m_x, m_y, m_li_angle, li_len,                             m_ppm, m_matrix, PointToBearingRange );  }  return 0;}double CTriangleAreaIterator::GetRange( void ){  // find the height of the triangle so far  return( m_range_so_far * cos( m_angle/2.0 ) );}CRectangleIterator::CRectangleIterator( double x, double y, double th,					double w, double h,  					double ppm, CMatrix* matrix ){  // calculate the corners of our body  double cx = (w/2.0) * cos(th);  double cy = (h/2.0) * cos(th);  double sx = (w/2.0) * sin(th);  double sy = (h/2.0) * sin(th);    corners[0][0] = x + cx - sy;  corners[0][1] = y + sx + cy;      corners[1][0] = x - cx - sy;  corners[1][1] = y - sx + cy;      corners[2][0] = x - cx + sy;  corners[2][1] = y - sx - cy;     corners[3][0] = x + cx + sy;  corners[3][1] = y + sx - cy;      lits[0] = new CLineIterator( corners[0][0], corners[0][1],                                corners[1][0], corners[1][1],                               ppm, matrix, PointToPoint );    lits[1] = new CLineIterator( corners[1][0], corners[1][1],                                corners[2][0], corners[2][1],                               ppm, matrix, PointToPoint );  lits[2] = new CLineIterator( corners[2][0], corners[2][1],                                corners[3][0], corners[3][1],                               ppm, matrix, PointToPoint );    lits[3] = new CLineIterator( corners[3][0], corners[3][1],                                corners[0][0], corners[0][1],                               ppm, matrix, PointToPoint );  } CRectangleIterator::~CRectangleIterator( void ){  for( int f=0; f<4; f++ )    if( lits[f] ) delete lits[f];}CEntity* CRectangleIterator::GetNextEntity( void ){  CEntity* ent = 0;    for( int i=0; i<4; i++ )  {    if (!lits[i])      continue;    if( (ent = lits[i]->GetNextEntity()) == 0 )    {      delete lits[i]; // don't need that line any more      lits[i] = 0; // mark it as deleted    }    else      break; // we'll take this entity  }    return ent;}// a circle iterator is an arc iterator with a 2PI scan rangeCCircleIterator::CCircleIterator( double x, double y, double r, 				  double ppm, CMatrix* matrix )  : CArcIterator( x, y, 0, r, M_PI*2.0, ppm, matrix ){}CArcIterator::CArcIterator( double x, double y, double th,			    double scan_r, double scan_th, 			      double ppm, CMatrix* matrix ){     m_matrix = matrix;  m_ppm = ppm;         m_center_x = x * m_ppm;  m_center_y = y * m_ppm;  m_angle = th - scan_th/2.0;  m_radius = scan_r * m_ppm;  m_max_angle = m_angle + scan_th; // this is the angle length of the scan in radians  m_ent = 0;  m_index = 0;  m_px = 0;  m_py = 0;  // the angle increment - moves us by 1 pixel  m_dangle = atan2( 1, m_radius );  //printf( "Construct circle iterator: x=%.2f y=%.2f r=%.2f a=%.2f dangle=%.2f \n",  //  m_center_x, m_center_y, m_radius, m_angle, m_dangle );};CEntity* CArcIterator::GetNextEntity( void ){  if( m_angle >= m_max_angle ) return 0; // done!    //printf( "current ptr: %p index: %d\n", m_ent[m_index], index );  if( !(m_ent && m_ent[m_index]) ) // if the ent array is null or empty  {    //printf( "before %d,%d\n", (int)m_x, (int)m_y );    // get a new array of pointers    m_ent = ArcTrace( m_angle );    //PrintArray( m_ent );    //printf( "after %d,%d\n", (int)m_x, (int)m_y );    m_index = 0; // back to the start of the array  }    assert( m_ent != 0 ); // should be a valid array, even if empty   //PrintArray( m_ent );  //printf( "returning %p (index: %d) at: %d %d rng: %d\n",    //m_ent[m_index], m_index, (int)m_x, (int)m_y, (int)m_angle );  return m_ent[m_index++]; // return the next CEntity* (it may be null)  }CEntity** CArcIterator::ArcTrace( double &remaining_angle ){  CEntity** ent = 0;     while( remaining_angle < m_max_angle )  {     m_px = m_center_x + m_radius * cos( remaining_angle );    m_py = m_center_y + m_radius * sin( remaining_angle );         //printf( "looking in %d,%d  angle: %.2f\n",     //     (int)px, (int)py, remaining_angle );         remaining_angle += m_dangle;         // bounds check    if( m_px < 0 || m_px >= m_matrix->width-1 ||         m_py < 0 || m_py >= m_matrix->height )     {      // if we're out of bounds, then return a pointer to NULL,      // indicating free space      ent = &g_nullp;    }    else    {      ent = m_matrix->get_cell( (int)m_px,(int)m_py );      if( !ent[0] )//&& (px+1 < m_matrix->width) )         ent = m_matrix->get_cell( (int)m_px+1,(int)m_py );    }    if( ent[0] ) break;// we hit something!  }   //if( ent && ent[0] )  //printf( "Hit %p at %.2f,%.2f with %.2f to go\n",   //   ent[0], px, py, remaining_angle );  //else  //printf( "hit nothing. remaining angle = %.2f\n", remaining_angle );  //fflush( stdout );   return ent; // we hit these entities}void CArcIterator::PrintArray( CEntity** ent ){  printf( "Array: " );    if( !ent )   {    printf( "(null)\n" );     return;  }    //puts( "foo" );    printf( "[ " );  int p = 0;  while( ent[p] ) printf( "%p ", (ent[p++]) );    printf( " ]\n" );    //fflush( stdout );}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区伦理| 精品乱人伦一区二区三区| 7799精品视频| 中文字幕一区av| 国模冰冰炮一区二区| 欧美日韩大陆在线| 亚洲欧美另类小说| 波多野结衣在线一区| 26uuu另类欧美亚洲曰本| 亚洲1区2区3区视频| 日本高清不卡一区| 国产精品美女久久久久久久 | 99国产欧美另类久久久精品| 日韩免费福利电影在线观看| 午夜欧美大尺度福利影院在线看| 972aa.com艺术欧美| 欧美激情一区二区三区在线| 麻豆91在线播放免费| 欧美一区二区精美| 男女激情视频一区| 欧美日本韩国一区二区三区视频| 亚洲精品老司机| 欧美亚洲国产一区在线观看网站 | 国产精品美女久久久久久| 一区二区三区电影在线播| va亚洲va日韩不卡在线观看| 国产欧美日韩视频在线观看| 国产伦精品一区二区三区免费 | 亚洲欧洲美洲综合色网| 成人激情视频网站| 国产精品国产三级国产普通话蜜臀 | 午夜av区久久| 欧美喷潮久久久xxxxx| 香蕉久久一区二区不卡无毒影院| 欧美亚男人的天堂| 五月天精品一区二区三区| 欧美剧情片在线观看| 天天综合日日夜夜精品| 91精品久久久久久久99蜜桃| 日韩精品久久久久久| 日韩欧美美女一区二区三区| 久久国产麻豆精品| 久久精品免视看| 91在线码无精品| 天天爽夜夜爽夜夜爽精品视频| 91精品综合久久久久久| 精品在线免费视频| 亚洲国产高清在线观看视频| 色婷婷狠狠综合| 日韩国产欧美在线观看| 久久婷婷国产综合国色天香| 成人av资源在线观看| 亚洲高清免费视频| 26uuu亚洲| 99re这里只有精品视频首页| 亚洲国产精品久久一线不卡| 精品国产伦一区二区三区观看方式 | 色av一区二区| 美女高潮久久久| 自拍偷拍欧美激情| 91精品国产综合久久精品app | 国内成人自拍视频| 亚洲欧美另类久久久精品2019| 91精品国产综合久久久久久久久久| 久久99久久久久| 亚洲欧美日韩综合aⅴ视频| 欧美一区二区福利视频| 99久久99久久精品免费观看| 日韩国产欧美在线观看| 国产精品国产三级国产a| 欧美精品 国产精品| 成人免费毛片片v| 日韩高清在线一区| 亚洲天堂精品视频| 久久一夜天堂av一区二区三区 | 不卡的电影网站| 裸体一区二区三区| 亚洲精品乱码久久久久久久久| 欧美mv日韩mv亚洲| 欧美三级电影一区| 不卡免费追剧大全电视剧网站| 日韩电影一区二区三区四区| 亚洲欧美视频一区| 中文天堂在线一区| 精品国产制服丝袜高跟| 欧美美女bb生活片| 91麻豆国产香蕉久久精品| 黄一区二区三区| 肉肉av福利一精品导航| 亚洲一区二区三区在线播放| 欧美高清在线视频| 久久久国际精品| 精品粉嫩超白一线天av| 欧美美女一区二区| 欧美日韩高清不卡| 欧美性一级生活| 欧美亚洲国产一区在线观看网站| 9久草视频在线视频精品| 国产成人精品免费视频网站| 精品一区免费av| 麻豆成人av在线| 卡一卡二国产精品| 久久99热这里只有精品| 欧美bbbbb| 精品无人码麻豆乱码1区2区| 免费观看91视频大全| 日韩精品乱码av一区二区| 日韩制服丝袜av| 蜜臀精品久久久久久蜜臀 | 99久久久无码国产精品| 粉嫩av一区二区三区在线播放| 国产米奇在线777精品观看| 国产在线乱码一区二区三区| 国产一区二区三区不卡在线观看 | 国产女主播视频一区二区| 精品对白一区国产伦| 国产欧美日韩久久| 国产精品久久影院| 亚洲精品免费在线| 偷拍亚洲欧洲综合| 蓝色福利精品导航| 国产一区 二区| 99精品视频中文字幕| 91视视频在线观看入口直接观看www | 欧美日韩的一区二区| 欧美片在线播放| 精品久久久久久无| 国产精品久久久久永久免费观看| 17c精品麻豆一区二区免费| 亚洲综合一二三区| 久久99精品久久只有精品| 懂色一区二区三区免费观看| 99riav久久精品riav| 欧美巨大另类极品videosbest| 日韩美女主播在线视频一区二区三区| www成人在线观看| 亚洲精品国产一区二区三区四区在线| 性做久久久久久| 国产iv一区二区三区| 91福利国产精品| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 欧美日韩视频在线观看一区二区三区| 在线播放国产精品二区一二区四区 | 精品久久免费看| 中文字幕精品一区二区三区精品 | 8x8x8国产精品| 国产女主播在线一区二区| 一级女性全黄久久生活片免费| 日韩av网站在线观看| 成人av在线电影| 欧美一区二区三区啪啪| 欧美国产精品专区| 喷水一区二区三区| jlzzjlzz欧美大全| 精品日产卡一卡二卡麻豆| 日韩理论在线观看| 精品一区二区三区免费播放| 日本乱人伦一区| 久久久国产精品麻豆| 亚洲成av人在线观看| 成人avav在线| 久久影音资源网| 日韩精品欧美精品| 91国产免费观看| 国产日产欧美精品一区二区三区| 亚洲观看高清完整版在线观看| 国产成人在线视频网址| 日韩欧美激情在线| 一区二区三区欧美久久| 成人高清av在线| 26uuu久久综合| 免费欧美在线视频| 欧美三日本三级三级在线播放| 中文av一区二区| 国产另类ts人妖一区二区| 日韩欧美国产综合一区| 亚洲一级片在线观看| 91亚洲永久精品| 国产精品天天看| 豆国产96在线|亚洲| 国产亚洲欧美日韩在线一区| 日韩高清欧美激情| 欧美日本国产视频| 亚洲福利一二三区| 91激情五月电影| 亚洲欧美激情在线| 日本久久一区二区三区| 自拍偷拍亚洲综合| 97国产一区二区| 亚洲天堂2014| 在线精品视频一区二区| 亚洲欧美电影院| 色综合激情久久| 亚洲精品免费电影| 欧美在线视频日韩| 亚洲成在线观看| 欧美顶级少妇做爰| 久久精品国产999大香线蕉| 欧美一区二区美女| 精品在线你懂的|