本文整理汇总了C++中LLBBox::IntersectOut方法的典型用法代码示例。如果您正苦于以下问题:C++ LLBBox::IntersectOut方法的具体用法?C++ LLBBox::IntersectOut怎么用?C++ LLBBox::IntersectOut使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类LLBBox
的用法示例。
在下文中一共展示了LLBBox::IntersectOut方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Assemble
/* assembles lists of line strips from the given track recursively traversing
the subtracks data */
void Track::Assemble(std::list< std::list<wxPoint> > &pointlists, const LLBBox &box, double scale, int &last, int level, int pos)
{
if(pos == (int)SubTracks[level].size())
return;
SubTrack &s = SubTracks[level][pos];
if(box.IntersectOut(s.m_box))
return;
if(s.m_scale < scale) {
pos <<= level;
if(last < pos - 1) {
std::list<wxPoint> new_list;
pointlists.push_back(new_list);
}
if(last < pos)
AddPointToList(pointlists, pos);
last = wxMin(pos + (1<<level), TrackPoints.size() - 1);
AddPointToList(pointlists, last);
} else {
Assemble(pointlists, box, scale, last, level-1, pos<<1);
Assemble(pointlists, box, scale, last, level-1, (pos<<1)+1);
}
}
示例2: NoIntersection
// internal test to see if regions don't intersect (optimization)
bool LLRegion::NoIntersection(const LLRegion& region) const
{
if(Empty() || region.Empty())
return true;
LLBBox box = GetBox(), rbox = region.GetBox();
return box.IntersectOut(rbox) || NoIntersection(rbox) || region.NoIntersection(box);
}
示例3: DrawGL
void RoutePoint::DrawGL( ViewPort &vp, bool use_cached_screen_coords )
{
if( !m_bIsVisible )
return;
// Optimization, especially apparent on tracks in normal cases
if( m_IconName == _T("empty") && !m_bShowName && !m_bPtIsSelected ) return;
if(m_wpBBox.GetValid() &&
vp.view_scale_ppm == m_wpBBox_view_scale_ppm &&
vp.rotation == m_wpBBox_rotation) {
/* see if this waypoint can intersect with bounding box */
LLBBox vpBBox = vp.GetBBox();
if( vpBBox.IntersectOut( m_wpBBox ) ){
// Are Range Rings enabled?
if(m_bShowWaypointRangeRings && (m_iWaypointRangeRingsNumber > 0)){
double factor = 1.00;
if( m_iWaypointRangeRingsStepUnits == 1 ) // convert kilometers to NMi
factor = 1 / 1.852;
double radius = factor * m_iWaypointRangeRingsNumber * m_fWaypointRangeRingsStep / 60.;
LLBBox radar_box = m_wpBBox;
radar_box.EnLarge(radius * 2 );
if( vpBBox.IntersectOut( radar_box ) ){
return;
}
}
else
return;
}
}
wxPoint r;
wxRect hilitebox;
unsigned char transparency = 150;
double platform_pen_width = wxRound(wxMax(1.0, g_Platform->GetDisplayDPmm() / 2)); // 0.5 mm nominal, but not less than 1 pixel
if(use_cached_screen_coords && m_pos_on_screen)
r.x = m_screen_pos.m_x, r.y = m_screen_pos.m_y;
else
cc1->GetCanvasPointPix( m_lat, m_lon, &r );
if(r.x == INVALID_COORD)
return;
// Substitute icon?
wxBitmap *pbm;
if( ( m_bIsActive ) && ( m_IconName != _T("mob") ) )
pbm = pWayPointMan->GetIconBitmap( _T ( "activepoint" ) );
else
pbm = m_pbmIcon;
// If icon is corrupt, there is really nothing else to do...
if(!pbm->IsOk())
return;
int sx2 = pbm->GetWidth() / 2;
int sy2 = pbm->GetHeight() / 2;
// Calculate the mark drawing extents
wxRect r1( r.x - sx2, r.y - sy2, sx2 * 2, sy2 * 2 ); // the bitmap extents
wxRect r3 = r1;
if( m_bShowName ) {
if( !m_pMarkFont ) {
m_pMarkFont = FontMgr::Get().GetFont( _( "Marks" ) );
m_FontColor = FontMgr::Get().GetFontColor( _( "Marks" ) );
CalculateNameExtents();
}
if( m_pMarkFont ) {
wxRect r2( r.x + m_NameLocationOffsetX, r.y + m_NameLocationOffsetY,
m_NameExtents.x, m_NameExtents.y );
r3.Union( r2 );
}
}
hilitebox = r3;
hilitebox.x -= r.x;
hilitebox.y -= r.y;
hilitebox.x *= g_ChartScaleFactorExp;
hilitebox.y *= g_ChartScaleFactorExp;
hilitebox.width *= g_ChartScaleFactorExp;
hilitebox.height *= g_ChartScaleFactorExp;
float radius;
if( g_btouch ){
hilitebox.Inflate( 20 );
radius = 20.0f;
}
else{
hilitebox.Inflate( 4 );
radius = 4.0f;
}
/* update bounding box */
if(!m_wpBBox.GetValid() || vp.view_scale_ppm != m_wpBBox_view_scale_ppm || vp.rotation != m_wpBBox_rotation) {
//.........这里部分代码省略.........
示例4: Draw
void Route::Draw( ocpnDC& dc, ViewPort &vp, const LLBBox &box )
{
if( pRoutePointList->empty() )
return;
LLBBox test_box = GetBBox();
if( box.IntersectOut( test_box ) ) // Route is wholly outside window
return;
int width = g_route_line_width;
if( m_width != WIDTH_UNDEFINED ) width = m_width;
if( m_bVisible && m_bRtIsSelected ) {
wxPen spen = *g_pRouteMan->GetSelectedRoutePen();
spen.SetWidth( width );
dc.SetPen( spen );
dc.SetBrush( *g_pRouteMan->GetSelectedRouteBrush() );
}
else if ( m_bVisible )
{
wxPenStyle style = wxPENSTYLE_SOLID;
wxColour col;
if( m_style != wxPENSTYLE_INVALID ) style = m_style;
if( m_Colour == wxEmptyString ) {
col = g_pRouteMan->GetRoutePen()->GetColour();
} else {
for( unsigned int i = 0; i < sizeof( ::GpxxColorNames ) / sizeof(wxString); i++ ) {
if( m_Colour == ::GpxxColorNames[i] ) {
col = ::GpxxColors[i];
break;
}
}
}
dc.SetPen( *wxThePenList->FindOrCreatePen( col, width, style ) );
dc.SetBrush( *wxTheBrushList->FindOrCreateBrush( col, wxBRUSHSTYLE_SOLID ) );
}
if( m_bVisible && m_bRtIsActive )
{
wxPen spen = *g_pRouteMan->GetActiveRoutePen();
spen.SetWidth( width );
dc.SetPen( spen );
dc.SetBrush( *g_pRouteMan->GetActiveRouteBrush() );
}
wxPoint rpt1, rpt2;
if ( m_bVisible )
DrawPointWhich( dc, 1, &rpt1 );
wxRoutePointListNode *node = pRoutePointList->GetFirst();
RoutePoint *prp1 = node->GetData();
node = node->GetNext();
if ( !m_bVisible && prp1->m_bKeepXRoute )
prp1->Draw( dc );
while( node ) {
RoutePoint *prp2 = node->GetData();
if ( !m_bVisible && prp2->m_bKeepXRoute )
prp2->Draw( dc );
else if (m_bVisible)
prp2->Draw( dc, &rpt2 );
if ( m_bVisible )
{
// Handle offscreen points
bool b_2_on = vp.GetBBox().Contains( prp2->m_lat, prp2->m_lon );
bool b_1_on = vp.GetBBox().Contains( prp1->m_lat, prp1->m_lon );
//Simple case
if( b_1_on && b_2_on ) RenderSegment( dc, rpt1.x, rpt1.y, rpt2.x, rpt2.y, vp, true, m_hiliteWidth ); // with arrows
// In the cases where one point is on, and one off
// we must decide which way to go in longitude
// Arbitrarily, we will go the shortest way
double pix_full_circle = WGS84_semimajor_axis_meters * mercator_k0 * 2 * PI
* vp.view_scale_ppm;
double dp = pow( (double) ( rpt1.x - rpt2.x ), 2 ) + pow( (double) ( rpt1.y - rpt2.y ), 2 );
double dtest;
int adder;
if( b_1_on && !b_2_on ) {
if( rpt2.x < rpt1.x ) adder = (int) pix_full_circle;
else
adder = -(int) pix_full_circle;
dtest = pow( (double) ( rpt1.x - ( rpt2.x + adder ) ), 2 )
+ pow( (double) ( rpt1.y - rpt2.y ), 2 );
if( dp < dtest ) adder = 0;
RenderSegment( dc, rpt1.x, rpt1.y, rpt2.x + adder, rpt2.y, vp, true, m_hiliteWidth );
} else if( !b_1_on ) {
if( rpt1.x < rpt2.x ) adder = (int) pix_full_circle;
else
adder = -(int) pix_full_circle;
float rxd = rpt2.x - ( rpt1.x + adder );
float ryd = rpt1.y - rpt2.y;
//.........这里部分代码省略.........