本文整理汇总了C++中LineBuffer::Centroid方法的典型用法代码示例。如果您正苦于以下问题:C++ LineBuffer::Centroid方法的具体用法?C++ LineBuffer::Centroid怎么用?C++ LineBuffer::Centroid使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类LineBuffer
的用法示例。
在下文中一共展示了LineBuffer::Centroid方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ProcessPoint
///////////////////////////////////////////////////////////////////////////////
// Called when applying a point style on a feature geometry. Point styles can
// be applied to all feature geometry types.
void SE_Renderer::ProcessPoint(SE_ApplyContext* ctx, SE_RenderPointStyle* style, RS_Bounds* bounds)
{
// the feature geometry we're applying the style on...
LineBuffer* featGeom = ctx->geometry;
double angleRad = 0.0;
if (style->angleControl == SE_AngleControl_FromGeometry)
{
switch (featGeom->geom_type())
{
case GeometryType_LineString:
case GeometryType_MultiLineString:
case GeometryType_Polygon:
case GeometryType_MultiPolygon:
{
double x0, y0;
featGeom->Centroid(LineBuffer::ctLine, &x0, &y0, &angleRad);
break;
}
}
}
angleRad += style->angleRad;
// also account for any viewport rotation
angleRad += GetWorldToScreenRotation();
SE_Matrix xform;
bool yUp = YPointsUp();
// see StylizationEngine::Stylize for a detailed explanation of these transforms
SE_Matrix xformbase;
xformbase.translate(style->offset[0], style->offset[1]);
xformbase.rotate(yUp? angleRad : -angleRad);
xformbase.premultiply(*ctx->xform);
// render the points
for (int i=0; i<featGeom->point_count(); ++i)
{
double x, y;
featGeom->get_point(i, x, y);
// transform to screen space - feature geometry is in [the original] mapping space
WorldToScreenPoint(x, y, x, y);
xform = xformbase;
xform.translate(x, y);
if (style->drawLast)
AddLabel(featGeom, style, xform, angleRad);
else
DrawSymbol(style->symbol, xform, angleRad, style->addToExclusionRegion);
}
if (bounds)
{
// get the symbol bounds after applying the transforms
bounds->minx = bounds->miny = +DBL_MAX;
bounds->maxx = bounds->maxy = -DBL_MAX;
for (int i=0; i<4; ++i)
{
RS_F_Point xfpt;
xformbase.transform(style->bounds[i].x, style->bounds[i].y, xfpt.x, xfpt.y);
bounds->add_point(xfpt);
}
}
}
示例2: Stylize
//.........这里部分代码省略.........
clip.minx -= clipOffsetWU;
clip.miny -= clipOffsetWU;
clip.maxx += clipOffsetWU;
clip.maxy += clipOffsetWU;
// clip geometry to given extents
LineBuffer* lbc = lb->Clip(clip, LineBuffer::ctAGF, m_lbPool);
if (lbc != lb)
{
// if the clipped buffer is NULL (completely clipped) just move on to
// the next feature
if (!lbc)
return;
// otherwise continue processing with the clipped buffer
lb = lbc;
if (lb != geometry)
spClipLB.reset(lb);
}
}
//-------------------------------------------------------
// do the StartFeature notification
//-------------------------------------------------------
RS_String tip; //TODO: this should be quick since we are not assigning
RS_String eurl;
const RS_String &theme = rule->GetLegendLabel();
if (tooltip && !tooltip->empty())
EvalString(*tooltip, tip);
if (url && !url->empty())
EvalString(*url, eurl);
// elevation settings
RS_ElevationType elevType = RS_ElevationType_RelativeToGround;
double zOffset = 0.0;
double zExtrusion = 0.0;
GetElevationParams(elevSettings, zOffset, zExtrusion, elevType);
renderer->StartFeature(features, initialPass,
tip.empty()? NULL : &tip,
eurl.empty()? NULL : &eurl,
theme.empty()? NULL : &theme,
zOffset, zExtrusion, elevType);
//-------------------------------------------------------
// apply the style to the geometry using the renderer
//-------------------------------------------------------
renderer->ProcessPolygon(lb, *fillStyle);
//-------------------------------------------------------
// do labeling if needed
//-------------------------------------------------------
MdfModel::Label* label = rule->GetLabel();
if (label && label->GetSymbol())
{
// Make sure the geometry is clipped if label clipping is specified.
// If bClip is true then the geometry is already clipped.
if (!bClip && bLabelClip)
{
// the clip region is the map request extents expanded by the offset
RS_Bounds clip = renderer->GetBounds();
clip.minx -= clipOffsetWU;
clip.miny -= clipOffsetWU;
clip.maxx += clipOffsetWU;
clip.maxy += clipOffsetWU;
LineBuffer* lbc = lb->Clip(clip, LineBuffer::ctAGF, m_lbPool);
if (lbc != lb)
{
// if the clipped buffer is NULL (completely clipped) just move on to
// the next feature
if (!lbc)
return;
// otherwise continue processing with the clipped buffer
lb = lbc;
if (lb != geometry)
spClipLB.reset(lb);
}
}
double cx = std::numeric_limits<double>::quiet_NaN();
double cy = std::numeric_limits<double>::quiet_NaN();
double dummy;
// multi should work for simple polygons too
lb->Centroid(LineBuffer::ctArea, &cx, &cy, &dummy);
if (!_isnan(cx) && !_isnan(cy))
AddLabel(cx, cy, 0.0, false, label, RS_OverpostType_AllFit, true, renderer, lb);
}
// free clipped line buffer if the geometry was clipped
if (spClipLB.get())
LineBufferPool::FreeLineBuffer(m_lbPool, spClipLB.release());
}
示例3: Stylize
//.........这里部分代码省略.........
// clip geometry to given extents
LineBuffer* lbc = lb->Clip(clip, LineBuffer::ctAGF, m_lbPool);
if (lbc != lb)
{
// if the clipped buffer is NULL (completely clipped) just move on to
// the next feature
if (!lbc)
return;
// otherwise continue processing with the clipped buffer
lb = lbc;
if (lb != geometry)
spClipLB.reset(lb);
}
}
//-------------------------------------------------------
// do the StartFeature notification
//-------------------------------------------------------
RS_String tip; //TODO: this should be quick since we are not assigning
RS_String eurl;
const RS_String &theme = rule->GetLegendLabel();
if (tooltip && !tooltip->empty())
EvalString(*tooltip, tip);
if (url && !url->empty())
EvalString(*url, eurl);
// elevation settings
RS_ElevationType elevType = RS_ElevationType_RelativeToGround;
double zOffset = 0.0;
double zExtrusion = 0.0;
GetElevationParams(elevSettings, zOffset, zExtrusion, elevType);
renderer->StartFeature(features, initialPass,
tip.empty()? NULL : &tip,
eurl.empty()? NULL : &eurl,
theme.empty()? NULL : &theme,
zOffset, zExtrusion, elevType);
//-------------------------------------------------------
// apply the style to the geometry using the renderer
//-------------------------------------------------------
for (int i=0; i<nSyms; ++i)
{
if (ppStrokes[i])
renderer->ProcessPolyline(lb, *ppStrokes[i]);
}
//-------------------------------------------------------
// do labeling if needed
//-------------------------------------------------------
MdfModel::Label* label = rule->GetLabel();
if (label && label->GetSymbol())
{
// Make sure the geometry is clipped if label clipping is specified.
// If bClip is true then the geometry is already clipped.
if (!bClip && bLabelClip)
{
// the clip region is the map request extents expanded by the offset
RS_Bounds clip = renderer->GetBounds();
clip.minx -= clipOffsetWU;
clip.miny -= clipOffsetWU;
clip.maxx += clipOffsetWU;
clip.maxy += clipOffsetWU;
LineBuffer* lbc = lb->Clip(clip, LineBuffer::ctAGF, m_lbPool);
if (lbc != lb)
{
// if the clipped buffer is NULL (completely clipped) just move on to
// the next feature
if (!lbc)
return;
// otherwise continue processing with the clipped buffer
lb = lbc;
if (lb != geometry)
spClipLB.reset(lb);
}
}
double cx = std::numeric_limits<double>::quiet_NaN();
double cy = std::numeric_limits<double>::quiet_NaN();
double slope_rad = 0.0;
// multi should work for simple polylines too
lb->Centroid(LineBuffer::ctLine, &cx, &cy, &slope_rad);
if (!_isnan(cx) && !_isnan(cy))
AddLabel(cx, cy, slope_rad, true, label, RS_OverpostType_AllFit, true, renderer, label->GetSymbol()->IsAdvancedPlacement()? lb : NULL);
}
// free clipped line buffer if the geometry was clipped
if (spClipLB.get())
LineBufferPool::FreeLineBuffer(m_lbPool, spClipLB.release());
}
示例4: Default
void SE_PositioningAlgorithms::Default(SE_ApplyContext* applyCtx,
SE_RenderStyle* rstyle)
{
// the style needs to contain at least one primitive
SE_RenderPrimitiveList& prims = rstyle->symbol;
if (prims.size() == 0)
return;
SE_Renderer* se_renderer = applyCtx->renderer;
LineBuffer* geometry = applyCtx->geometry;
SE_Matrix& xform = *applyCtx->xform;
double cx = 0.0;
double cy = 0.0;
double offsetX = 0.0;
double offsetY = 0.0;
double angleRad = 0.0;
switch (rstyle->type)
{
case SE_RenderStyle_Point:
{
SE_RenderPointStyle* rpStyle = (SE_RenderPointStyle*)rstyle;
// get the feature centroid (no angle for point centroids)
geometry->Centroid(LineBuffer::ctPoint, &cx, &cy, NULL);
// account for the point usage angle control and offset
angleRad = rpStyle->angleRad;
offsetX = rpStyle->offset[0];
offsetY = rpStyle->offset[1];
break;
}
case SE_RenderStyle_Line:
{
SE_RenderLineStyle* rlStyle = (SE_RenderLineStyle*)rstyle;
// get the feature centroid and angle
double fAngleRad;
geometry->Centroid(LineBuffer::ctLine, &cx, &cy, &fAngleRad);
// account for the angle control
angleRad = rlStyle->angleRad;
if (rlStyle->angleControl == SE_AngleControl_FromGeometry)
angleRad += fAngleRad;
break;
}
case SE_RenderStyle_Area:
{
SE_RenderAreaStyle* raStyle = (SE_RenderAreaStyle*)rstyle;
// get the feature centroid (no angle for area centroids)
geometry->Centroid(LineBuffer::ctArea, &cx, &cy, NULL);
// account for the angle control
angleRad = raStyle->angleRad;
break;
}
}
// don't add a label if we can't compute the centroid
if (_isnan(cx) || _isnan(cy))
return;
// need to convert centroid to screen units
se_renderer->WorldToScreenPoint(cx, cy, cx, cy);
// also account for any viewport rotation
angleRad += se_renderer->GetWorldToScreenRotation();
// see StylizationEngine::Stylize for a detailed explanation of these transforms
bool yUp = se_renderer->YPointsUp();
SE_Matrix xformLabel;
xformLabel.translate(offsetX, offsetY);
xformLabel.rotate(yUp? angleRad : -angleRad);
xformLabel.premultiply(xform);
xformLabel.translate(cx, cy);
se_renderer->AddLabel(geometry, rstyle, xformLabel, angleRad);
}
示例5: EightSurrounding
void SE_PositioningAlgorithms::EightSurrounding(SE_ApplyContext* applyCtx,
SE_RenderStyle* rstyle,
double mm2su)
{
SE_Renderer* se_renderer = applyCtx->renderer;
LineBuffer* geometry = applyCtx->geometry;
// eight surrounding labeling only applies to point feature geometry
switch (geometry->geom_type())
{
case GeometryType_Point:
case GeometryType_MultiPoint:
break;
default:
return;
}
// eight surrounding labeling only works with point styles
if (rstyle->type != SE_RenderStyle_Point)
return;
// the style needs to contain at least one primitive
SE_RenderPrimitiveList& prims = rstyle->symbol;
if (prims.size() == 0)
return;
SE_RenderPointStyle* rpstyle = (SE_RenderPointStyle*)rstyle;
// get actual feature point and transform to screen space
// TODO: in the case of a multi-point feature we get the average of all the points;
// generating candidate labels around this point doesn't make a whole lot of
// sense
double cx = 0.0;
double cy = 0.0;
geometry->Centroid(LineBuffer::ctPoint, &cx, &cy, NULL);
// don't add a label if we can't compute the centroid
if (_isnan(cx) || _isnan(cy))
return;
se_renderer->WorldToScreenPoint(cx, cy, cx, cy);
// Get the extent of the last drawn point symbol so that we know how much to offset
// the label. This call assumes the symbol draws right before the label.
// TODO: remove this assumption
const RS_F_Point* cfpts = se_renderer->GetLastSymbolExtent();
RS_F_Point fpts[4];
if(cfpts[0].x == 0 && cfpts[0].y == 0 &&
cfpts[1].x == 0 && cfpts[1].y == 0 &&
cfpts[2].x == 0 && cfpts[2].y == 0 &&
cfpts[3].x == 0 && cfpts[3].y == 0)
{
for (int i=0; i<4; ++i)
{
fpts[i].x = cx;
fpts[i].y = cy;
}
}
else
memcpy(fpts, cfpts, 4*sizeof(RS_F_Point));
double dx = fpts[1].x - fpts[0].x;
double dy = fpts[1].y - fpts[0].y;
double symbol_rot_rad = atan2(dy, dx);
// factor out position and rotation
SE_Matrix ixform;
ixform.translate(-cx, -cy); // factor out point position
ixform.rotate(-symbol_rot_rad); // factor out rotation
for (int i=0; i<4; ++i)
ixform.transform(fpts[i].x, fpts[i].y);
bool yUp = se_renderer->YPointsUp();
if (!yUp)
symbol_rot_rad = -symbol_rot_rad;
// unrotated bounds
RS_Bounds symbol_bounds(fpts[0].x, fpts[0].y, fpts[2].x, fpts[2].y);
double symbol_width = symbol_bounds.width(); // symbol width in screen units
double symbol_height = symbol_bounds.height(); // symbol height in screen units
// offset the label from the symbol's edge
double offset = POINT_LABEL_OFFSET_MM * mm2su; // offset in screen units
// make sure we have at least one pixel's worth of offset
double screenUnitsPerPixel = MILLIMETERS_PER_INCH * se_renderer->GetScreenUnitsPerMillimeterDevice() / se_renderer->GetDpi();
if (offset < screenUnitsPerPixel)
offset = screenUnitsPerPixel;
// compute how far label needs to be offset from center point of symbol
double w2 = 0.5 * symbol_width;
double h2 = 0.5 * symbol_height;
double ch = 0.0; // vertical center point
double cw = 0.0; // horizontal center point
w2 += offset;
h2 += offset;
bool useBounds = symbol_bounds.IsValid();
//.........这里部分代码省略.........
示例6: Stylize
//.........这里部分代码省略.........
mdefRot = cachedStyle->rotation();
renderer->ProcessMarker(lb, *cachedStyle, pfs->IsAllowOverpost(), &bounds);
}
else
{
RS_MarkerDef mdef;
ObtainStyle(psym, mdef);
mdefW = mdef.width();
mdefH = mdef.height();
mdefU = mdef.units();
mdefRot = mdef.rotation();
renderer->ProcessMarker(lb, mdef, pfs->IsAllowOverpost(), &bounds);
}
}
//-------------------------------------------------------
// do labeling if needed
//-------------------------------------------------------
MdfModel::Label* label = rule->GetLabel();
if (label && label->GetSymbol())
{
// NOTE: clipping of geometry for labeling (the RequiresLabelClipping
// option) does not need to be done for points.
// TODO: compute label position
double cx = std::numeric_limits<double>::quiet_NaN();
double cy = std::numeric_limits<double>::quiet_NaN();
double dummy;
// multi should work for simple polygons also
lb->Centroid(LineBuffer::ctPoint, &cx, &cy, &dummy);
if (!_isnan(cx) && !_isnan(cy))
{
// if there was no point symbol, the label is the symbol,
// so we send without overposting and at the center point
if (!psym || !psym->GetSymbol() || pfs->IsDisplayAsText())
{
AddLabel(cx, cy, 0.0, false, label, RS_OverpostType_All, !pfs->IsAllowOverpost(), renderer, lb);
}
else
{
MdfModel::TextSymbol* text = label->GetSymbol();
RS_String txt;
EvalString(text->GetText(), txt);
if (!txt.empty())
{
RS_TextDef def;
ConvertTextDef(text, def);
// if there's a symbol there are 8 possible positions to place the label
// around the symbol
// NOTE: at this point we know that mdef has been initialized with
// whatever was in psym->GetSymbol() and that expressions have
// been evaluated
double op_pts[16];
// offset the label from the symbol's edge
double offset = 0.001 * POINT_LABEL_OFFSET_MM; // in meters