本文整理汇总了C++中Path::SetBackData方法的典型用法代码示例。如果您正苦于以下问题:C++ Path::SetBackData方法的具体用法?C++ Path::SetBackData怎么用?C++ Path::SetBackData使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Path
的用法示例。
在下文中一共展示了Path::SetBackData方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: set_shape
void SPOffset::set_shape() {
if ( this->originalPath == NULL ) {
// oops : no path?! (the offset object should do harakiri)
return;
}
#ifdef OFFSET_VERBOSE
g_print ("rad=%g\n", offset->rad);
#endif
// au boulot
if ( fabs(this->rad) < 0.01 ) {
// grosso modo: 0
// just put the source this as the offseted one, no one will notice
// it's also useless to compute the offset with a 0 radius
//XML Tree being used directly here while it shouldn't be.
const char *res_d = this->getRepr()->attribute("inkscape:original");
if ( res_d ) {
Geom::PathVector pv = sp_svg_read_pathv(res_d);
SPCurve *c = new SPCurve(pv);
g_assert(c != NULL);
this->setCurveInsync (c, TRUE);
this->setCurveBeforeLPE(c);
c->unref();
}
return;
}
// extra paraniac careful check. the preceding if () should take care of this case
if (fabs (this->rad) < 0.01) {
this->rad = (this->rad < 0) ? -0.01 : 0.01;
}
Path *orig = new Path;
orig->Copy ((Path *)this->originalPath);
if ( use_slow_but_correct_offset_method == false ) {
// version par outline
Shape *theShape = new Shape;
Shape *theRes = new Shape;
Path *originaux[1];
Path *res = new Path;
res->SetBackData (false);
// and now: offset
float o_width;
if (this->rad >= 0)
{
o_width = this->rad;
orig->OutsideOutline (res, o_width, join_round, butt_straight, 20.0);
}
else
{
o_width = -this->rad;
orig->OutsideOutline (res, -o_width, join_round, butt_straight, 20.0);
}
if (o_width >= 1.0)
{
// res->ConvertForOffset (1.0, orig, offset->rad);
res->ConvertWithBackData (1.0);
}
else
{
// res->ConvertForOffset (o_width, orig, offset->rad);
res->ConvertWithBackData (o_width);
}
res->Fill (theShape, 0);
theRes->ConvertToShape (theShape, fill_positive);
originaux[0] = res;
theRes->ConvertToForme (orig, 1, originaux);
Geom::OptRect bbox = this->desktopVisualBounds();
if ( bbox ) {
gdouble size = L2(bbox->dimensions());
gdouble const exp = this->transform.descrim();
if (exp != 0) {
size /= exp;
}
orig->Coalesce (size * 0.001);
//g_print ("coa %g exp %g item %p\n", size * 0.001, exp, item);
}
// if (o_width >= 1.0)
// {
// orig->Coalesce (0.1); // small treshhold, since we only want to get rid of small segments
// the curve should already be computed by the Outline() function
// orig->ConvertEvenLines (1.0);
// orig->Simplify (0.5);
// }
// else
//.........这里部分代码省略.........
开发者ID:NotBrianZach,项目名称:modalComposableProgrammableFuzzySearchingVectorGraphicEditing,代码行数:101,代码来源:sp-offset.cpp
示例2: Coalesce
// Variation on the fitting theme: try to merge path commands into cubic bezier patches.
// The goal is to reduce the number of path commands, especially when operations on path produce
// lots of small path elements; ideally you could get rid of very small segments at reduced visual cost.
void Path::Coalesce(double tresh)
{
if ( descr_flags & descr_adding_bezier ) {
CancelBezier();
}
if ( descr_flags & descr_doing_subpath ) {
CloseSubpath();
}
if (descr_cmd.size() <= 2) {
return;
}
SetBackData(false);
Path* tempDest = new Path();
tempDest->SetBackData(false);
ConvertEvenLines(0.25*tresh);
int lastP = 0;
int lastAP = -1;
// As the elements are stored in a separate array, it's no longer worth optimizing
// the rewriting in the same array.
// [[comme les elements sont stockes dans un tableau a part, plus la peine d'optimiser
// la réécriture dans la meme tableau]]
int lastA = descr_cmd[0]->associated;
int prevA = lastA;
Geom::Point firstP;
/* FIXME: the use of this variable probably causes a leak or two.
** It's a hack anyway, and probably only needs to be a type rather than
** a full PathDescr.
*/
PathDescr *lastAddition = new PathDescrMoveTo(Geom::Point(0, 0));
bool containsForced = false;
PathDescrCubicTo pending_cubic(Geom::Point(0, 0), Geom::Point(0, 0), Geom::Point(0, 0));
for (int curP = 0; curP < int(descr_cmd.size()); curP++) {
int typ = descr_cmd[curP]->getType();
int nextA = lastA;
if (typ == descr_moveto) {
if (lastAddition->flags != descr_moveto) {
FlushPendingAddition(tempDest,lastAddition,pending_cubic,lastAP);
}
lastAddition = descr_cmd[curP];
lastAP = curP;
FlushPendingAddition(tempDest, lastAddition, pending_cubic, lastAP);
// Added automatically (too bad about multiple moveto's).
// [fr: (tant pis pour les moveto multiples)]
containsForced = false;
PathDescrMoveTo *nData = dynamic_cast<PathDescrMoveTo *>(descr_cmd[curP]);
firstP = nData->p;
lastA = descr_cmd[curP]->associated;
prevA = lastA;
lastP = curP;
} else if (typ == descr_close) {
nextA = descr_cmd[curP]->associated;
if (lastAddition->flags != descr_moveto) {
PathDescrCubicTo res(Geom::Point(0, 0), Geom::Point(0, 0), Geom::Point(0, 0));
int worstP = -1;
if (AttemptSimplify(lastA, nextA - lastA + 1, (containsForced) ? 0.05 * tresh : tresh, res, worstP)) {
lastAddition = new PathDescrCubicTo(Geom::Point(0, 0),
Geom::Point(0, 0),
Geom::Point(0, 0));
pending_cubic = res;
lastAP = -1;
}
FlushPendingAddition(tempDest, lastAddition, pending_cubic, lastAP);
FlushPendingAddition(tempDest, descr_cmd[curP], pending_cubic, curP);
} else {
FlushPendingAddition(tempDest,descr_cmd[curP],pending_cubic,curP);
}
containsForced = false;
lastAddition = new PathDescrMoveTo(Geom::Point(0, 0));
prevA = lastA = nextA;
lastP = curP;
lastAP = curP;
} else if (typ == descr_forced) {
nextA = descr_cmd[curP]->associated;
if (lastAddition->flags != descr_moveto) {
PathDescrCubicTo res(Geom::Point(0, 0), Geom::Point(0, 0), Geom::Point(0, 0));
int worstP = -1;
if (AttemptSimplify(lastA, nextA - lastA + 1, 0.05 * tresh, res, worstP)) {
// plus sensible parce que point force
//.........这里部分代码省略.........