本文整理汇总了C++中QPainterPath::angleAtPercent方法的典型用法代码示例。如果您正苦于以下问题:C++ QPainterPath::angleAtPercent方法的具体用法?C++ QPainterPath::angleAtPercent怎么用?C++ QPainterPath::angleAtPercent使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类QPainterPath
的用法示例。
在下文中一共展示了QPainterPath::angleAtPercent方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: angleAtPercent
void tst_QPainterPath::angleAtPercent()
{
for (int angle = 0; angle < 360; ++angle) {
QLineF line = QLineF::fromPolar(100, angle);
QPainterPath path;
path.moveTo(line.p1());
path.lineTo(line.p2());
QCOMPARE(path.angleAtPercent(0.5), line.angle());
}
}
示例2: drawLabel
void PrimitivePainter::drawLabel(QPainterPath* R, QPainter* thePainter, qreal PixelPerM, QString str, QString strBg) const
{
if (!DrawLabel)
return;
if (str.isEmpty() && strBg.isEmpty())
return;
thePainter->save();
if (getLabelArea()) {
QPointF C(R->boundingRect().center());
drawPointLabel(C, str, strBg, thePainter, PixelPerM);
thePainter->restore();
return;
}
LineParameters lp = labelBoundary();
qreal WW = PixelPerM*lp.Proportional+lp.Fixed;
if (WW < 10) return;
//qreal WWR = qMax(PixelPerM*R->widthOf()*BackgroundScale+BackgroundOffset, PixelPerM*R->widthOf()*ForegroundScale+ForegroundOffset);
QPainterPath textPath;
QPainterPath tranformedRoadPath = *R;
QFont font = getLabelFont();
if (!str.isEmpty()) {
QRegion rg = thePainter->clipRegion();
font.setPixelSize(int(WW));
QFontMetrics metrics(font);
if (font.pixelSize() >= 5 && tranformedRoadPath.length() > metrics.width(str)) {
thePainter->setFont(font);
int repeat = int((tranformedRoadPath.length() / ((metrics.width(str) * LABEL_PATH_DISTANCE))) - 0.5);
int numSegment = repeat+1;
qreal lenSegment = tranformedRoadPath.length() / numSegment;
qreal startSegment = 0;
QPainterPath textPath;
do {
QRegion rg = thePainter->clipRegion();
qreal curLen = startSegment + ((lenSegment - metrics.width(str)) / 2);
int modIncrement = 1;
qreal modAngle = 0;
int modY = 0;
if (cos(angToRad(tranformedRoadPath.angleAtPercent((startSegment+(lenSegment/2))/tranformedRoadPath.length()))) < 0) {
modIncrement = -1;
modAngle = 180.0;
curLen += metrics.width(str);
}
for (int i = 0; i < str.length(); ++i) {
qreal t = tranformedRoadPath.percentAtLength(curLen);
QPointF pt = tranformedRoadPath.pointAtPercent(t);
qreal angle = tranformedRoadPath.angleAtPercent(t);
modY = (metrics.ascent()/2)-3;
QMatrix m;
m.translate(pt.x(), pt.y());
m.rotate(-angle+modAngle);
QPainterPath charPath;
charPath.addText(0, modY, font, str.mid(i, 1));
charPath = charPath * m;
textPath.addPath(charPath);
qreal incremenet = metrics.width(str[i]);
curLen += (incremenet * modIncrement);
}
startSegment += lenSegment;
} while (--repeat >= 0);
if (getLabelHalo()) {
thePainter->setPen(QPen(Qt::white, font.pixelSize()/6));
thePainter->drawPath(textPath);
}
thePainter->setPen(Qt::NoPen);
thePainter->setBrush(LabelColor);
thePainter->drawPath(textPath);
thePainter->setClipRegion(rg);
}
}
if (DrawLabelBackground && !strBg.isEmpty()) {
QRegion rg = thePainter->clipRegion();
font.setPixelSize(int(WW));
QFontMetrics metrics(font);
int repeat = int((tranformedRoadPath.length() / (metrics.width(strBg) * LABEL_STRAIGHT_DISTANCE)) - 0.5);
int numSegment = repeat+1;
qreal lenSegment = tranformedRoadPath.length() / numSegment;
qreal startSegment = 0;
do {
int modX = 0;
int modY = 0;
qreal curLen = startSegment + (lenSegment / 2);
qreal t = tranformedRoadPath.percentAtLength(curLen);
QPointF pt = tranformedRoadPath.pointAtPercent(t);
//.........这里部分代码省略.........
示例3: tangentLineAt
qreal Geometry::tangentLineAt(QPainterPath const &path, QPointF const &point)
{
qreal const percentage = percentageAt(path, point);
return path.angleAtPercent(percentage);
}
示例4: DrawObj_Item
//.........这里部分代码省略.........
for (a = firstChar; a < itemText.length(); ++a)
{
CurY = 0;
hl = itemText.item(a);
chstr = hl->ch;
if (chstr[0] == SpecialChars::PAGENUMBER || chstr[0] == SpecialChars::PARSEP || chstr[0] == SpecialChars::PAGECOUNT
|| chstr[0] == SpecialChars::TAB || chstr[0] == SpecialChars::LINEBREAK)
continue;
chs = hl->fontSize();
if (a < itemText.length()-1)
chstr += itemText.text(a+1, 1);
hl->glyph.yadvance = 0;
layoutGlyphs(itemText.charStyle(a), chstr, hl->glyph);
hl->glyph.shrink(); // HACK
if (hl->ch == SpecialChars::OBJECT)
dx = (hl->embedded.getItem()->gWidth + hl->embedded.getItem()->lineWidth()) * hl->glyph.scaleH / 2.0;
else
dx = hl->glyph.wide() / 2.0;
CurX += dx;
double currPerc = currPath.percentAtLength(CurX);
if (currPerc >= 0.9999999)
{
currPathIndex++;
if (currPathIndex == pathList.count())
{
MaxChars = a;
break;
}
currPath = pathList[currPathIndex];
CurX = dx;
currPerc = currPath.percentAtLength(CurX);
}
double currAngle = currPath.angleAtPercent(currPerc);
#if QT_VERSION >= 0x040400
if (currAngle <= 180.0)
currAngle *= -1.0;
else
currAngle = 360.0 - currAngle;
#endif
QPointF currPoint = currPath.pointAtPercent(currPerc);
tangent = FPoint(cos(currAngle * M_PI / 180.0), sin(currAngle * M_PI / 180.0));
point = FPoint(currPoint.x(), currPoint.y());
hl->glyph.xoffset = 0;
hl->PtransX = point.x();
hl->PtransY = point.y();
hl->PRot = currAngle * M_PI / 180.0;
hl->PDx = dx;
QTransform trafo = QTransform( 1, 0, 0, -1, -dx, 0 );
if (textPathFlipped)
trafo *= QTransform(1, 0, 0, -1, 0, 0);
if (textPathType == 0)
trafo *= QTransform( tangent.x(), tangent.y(), tangent.y(), -tangent.x(), point.x(), point.y() ); // ID's Rainbow mode
else if (textPathType == 1)
trafo *= QTransform( 1, 0, 0, -1, point.x(), point.y() ); // ID's Stair Step mode
else if (textPathType == 2)
{
double a = 1;
if (tangent.x() < 0)
a = -1;
if (fabs(tangent.x()) > 0.1)
trafo *= QTransform( a, (tangent.y() / tangent.x()) * a, 0, -1, point.x(), point.y() ); // ID's Skew mode
else
trafo *= QTransform( a, 4 * a, 0, -1, point.x(), point.y() );
}
QTransform sca = p->worldMatrix();
示例5: updatePath
//.........这里部分代码省略.........
QPainterPath cubicPath;
QList<QPointF> endPoints;
// construct the path segments
if (eO.x() < sO.x() && eU2.x() > sL2.x() && eU2.y() < sL2.y() && eL2.y() > sU2.y()) {
//> case 1V: elements very close to each other
startPoints << sP << sO;
QPointF offsetVector = QPointF(0, 0.75 * (eO.y() - sO.y()));
cubicPath.moveTo(sO);
cubicPath.cubicTo(sO + offsetVector, eO - offsetVector, eO);
endPoints << eO << eP;
} else if (eO.x() >= sO.x()) {
//> case 1H: end node is right of start node
startPoints << sP << sO;
QPointF offsetVector = QPointF(0.75 * (eO.x() - sO.x()), 0);
cubicPath.moveTo(sO);
cubicPath.cubicTo(sO + offsetVector, eO - offsetVector, eO);
endPoints << eO << eP;
} else if (eU1.y() >= sL1.y()) {
//> case 2LV
startPoints << sP << sO << sL1;
QPointF offsetVector = QPointF(0, 0.75 * (eU1.y() - sL1.y()));
cubicPath.moveTo(sL1);
cubicPath.cubicTo(sL1 + offsetVector, eU1 - offsetVector, eU1);
endPoints << eU1 << eO << eP;
} else if (eL1.y() <= sU1.y()) {
//> case 2UV
startPoints << sP << sO << sU1;
QPointF offsetVector = QPointF(0, 0.75 * (eL1.y() - sU1.y()));
cubicPath.moveTo(sU1);
cubicPath.cubicTo(sU1 + offsetVector, eL1 - offsetVector, eL1);
endPoints << eL1 << eO << eP;
} else if (eP.y() >= sP.y()) {
//> case 3L
startPoints << sP << sO << sL1 << sL2;
QPointF offsetVector = QPointF(0.75 * (eU2.x() - sL2.x()), 0);
cubicPath.moveTo(sL2);
cubicPath.cubicTo(sL2 + offsetVector, eU2 - offsetVector, eU2);
endPoints << eU2 << eU1 << eO << eP;
} else {
//> case 3U
startPoints << sP << sO << sU1 << sU2;
QPointF offsetVector = QPointF(0.75 * (eL2.x() - sU2.x()), 0);
cubicPath.moveTo(sU2);
cubicPath.cubicTo(sU2 + offsetVector, eL2 - offsetVector, eL2);
endPoints << eL2 << eL1 << eO << eP;
}
// build the main path from the path segments
m_mainPath = QPainterPath();
for (int i = 0; i < startPoints.size(); ++i)
if (i == 0)
m_mainPath.moveTo(startPoints[0]);
else
m_mainPath.lineTo(startPoints[i]);
m_mainPath.addPath(cubicPath);
for (int i = 0; i < endPoints.size(); ++i)
if (i == 0)
m_mainPath.moveTo(endPoints[0]);
else
m_mainPath.lineTo(endPoints[i]);
// create the shadow path as a copy of the main path
m_shadowPath = QPainterPath(m_mainPath);
// move the path elements of the shadow path one pixel down and to the right
for (int i = 1; i < m_shadowPath.elementCount(); ++i) {
QPainterPath::Element element = m_shadowPath.elementAt(i);
m_shadowPath.setElementPositionAt(i, element.x + 1, element.y + 1);
}
// get the center point for the arrow and the angle at that point
static const qreal t = 0.5;
QPointF arrowPoint = cubicPath.pointAtPercent(t);
qreal angle = cubicPath.angleAtPercent(t) * Pi / 180;
// calculate the polygon for the arrow head
qreal pathLengthFraction = m_mainPath.length() / 10;
static const qreal maxArrowSize = 10;
qreal arrowSize = pathLengthFraction < maxArrowSize ? pathLengthFraction : maxArrowSize;
QPointF arrowPoint1 = arrowPoint - QPointF(arrowSize * sin(angle - Pi / 2), arrowSize * cos(angle - Pi / 2));
QPointF arrowPoint2 = arrowPoint - QPointF(arrowSize * sin(angle + Pi / 3), arrowSize * cos(angle + Pi / 3));
QPointF arrowPoint3 = arrowPoint - QPointF(arrowSize * sin(angle + Pi - Pi / 3), arrowSize * cos(angle + Pi - Pi / 3));
m_arrowHeadPolygon.clear();
m_arrowHeadPolygon << arrowPoint1 << arrowPoint2 << arrowPoint3;
// repaint the graphics item
update();
}
示例6: paintPair
//.........这里部分代码省略.........
if (permType == Permanent && constType == Var)
pen.setDashPattern(msPermVarAccesDashPattern);
if (permType == Temporary)
{
if (constType == Const)
pen.setDashPattern(msTempConstAccesDashPattern);
else
pen.setDashPattern(msTempVarAccesDashPattern);
}
painter->setPen(pen);
painter->drawPolyline(&(points[0]), points.size());
// draw negative lines
if (posType == Negative)
{
painter->setPen(markPen);
QPainterPath path = pair->shapeNormal();
float length = path.length() - arrowLength - 3;
int i = 0;
qreal mult = 28.f;
qreal offset = 22.f;
qreal l = offset;
while (l < length)
{
qreal perc = path.percentAtLength(l);
painter->save();
painter->translate(path.pointAtPercent(perc));
painter->rotate(-path.angleAtPercent(perc));
painter->drawLine(0.f, -LINE_MARK_NEG_LENGTH, 0.f, LINE_MARK_NEG_LENGTH);
painter->restore();
l = (++i) * mult + offset;
}
}else // draw fuzzy lines
if (posType == Fuzzy)
{
painter->setPen(markPen);
QPainterPath path = pair->shapeNormal();
float length = path.length() - arrowLength - 3;
int i = 0;
qreal mult = 28.f;
qreal offset = 22.f;
qreal l = offset;
while (l < length)
{
qreal perc = path.percentAtLength(l);
painter->save();
painter->translate(path.pointAtPercent(perc));
painter->rotate(-path.angleAtPercent(perc));
if (i % 2 == 0)
painter->drawLine(0.f, -LINE_MARK_FUZ_LENGTH, 0.f, 0.f);
else
painter->drawLine(0.f, LINE_MARK_FUZ_LENGTH, 0.f, 0.f);
painter->restore();
示例7: DrawObj_Item
//.........这里部分代码省略.........
for (a = firstChar; a < itemRenderText.length(); ++a)
{
CurY = 0;
GlyphLayout* glyphs = itemRenderText.getGlyphs(a);
PathData* pdata = & (textLayout.point(a));
chstr = itemRenderText.text(a,1);
if (chstr[0] == SpecialChars::PAGENUMBER || chstr[0] == SpecialChars::PARSEP || chstr[0] == SpecialChars::PAGECOUNT
|| chstr[0] == SpecialChars::TAB || chstr[0] == SpecialChars::LINEBREAK)
continue;
if (a < itemRenderText.length()-1)
chstr += itemRenderText.text(a+1, 1);
glyphs->yadvance = 0;
layoutGlyphs(itemRenderText.charStyle(a), chstr, itemRenderText.flags(a), *glyphs);
glyphs->shrink(); // HACK
if (itemRenderText.hasObject(a))
dx = (itemRenderText.object(a)->width() + itemRenderText.object(a)->lineWidth()) * glyphs->scaleH / 2.0;
else
dx = glyphs->wide() / 2.0;
CurX += dx;
double currPerc = currPath.percentAtLength(CurX);
if (currPerc >= 0.9999999)
{
currPathIndex++;
if (currPathIndex == pathList.count())
{
MaxChars = a;
break;
}
currPath = pathList[currPathIndex];
CurX = dx;
currPerc = currPath.percentAtLength(CurX);
}
double currAngle = currPath.angleAtPercent(currPerc);
if (currAngle <= 180.0)
currAngle *= -1.0;
else
currAngle = 360.0 - currAngle;
QPointF currPoint = currPath.pointAtPercent(currPerc);
tangent = FPoint(cos(currAngle * M_PI / 180.0), sin(currAngle * M_PI / 180.0));
point = FPoint(currPoint.x(), currPoint.y());
glyphs->xoffset = 0;
pdata->PtransX = point.x();
pdata->PtransY = point.y();
pdata->PRot = currAngle * M_PI / 180.0;
pdata->PDx = dx;
QTransform trafo = QTransform( 1, 0, 0, -1, -dx, 0 );
if (textPathFlipped)
trafo *= QTransform(1, 0, 0, -1, 0, 0);
if (textPathType == 0)
trafo *= QTransform( tangent.x(), tangent.y(), tangent.y(), -tangent.x(), point.x(), point.y() ); // ID's Rainbow mode
else if (textPathType == 1)
trafo *= QTransform( 1, 0, 0, -1, point.x(), point.y() ); // ID's Stair Step mode
else if (textPathType == 2)
{
double a = 1;
if (tangent.x() < 0)
a = -1;
if (fabs(tangent.x()) > 0.1)
trafo *= QTransform( a, (tangent.y() / tangent.x()) * a, 0, -1, point.x(), point.y() ); // ID's Skew mode
else
trafo *= QTransform( a, 4 * a, 0, -1, point.x(), point.y() );
}
QTransform sca = p->worldMatrix();
trafo *= sca;
p->save();
示例8: Draw
void LabelScheme::Draw(MapTranslator *renderer, Feature *feature, QPainter *painter)
{
if(p_label_paint_func) {
if(p_label_paint_func(painter, renderer, feature, this))
return;
}
if(!p_fieldName.isEmpty()) {
QString name = feature->GetFieldValue(p_fieldName);
if(p_position == QSimpleSpatial::FollowPath && feature->getScheme()->getShapeType() == QSimpleSpatial::PolyLine)
{
PolylineFeature *pf = static_cast<PolylineFeature *>(feature);
if(pf) {
const QVector<Points *> *array = pf->getPointsArray();
QPainterPath path;
QPointF pathpoint;
for(int i = 0;i < array->count();i ++) {
Points *points = array->at(i);
if(i > 0 && renderer->Coord2ScreenPoint(points->x[0],points->y[0]) != pathpoint)
break;
pathpoint = renderer->Coord2ScreenPoint(points->x[0],points->y[0]);
path.moveTo(pathpoint);
for(int j = 1;j < points->count;j ++) {
pathpoint = renderer->Coord2ScreenPoint(points->x[j],points->y[j]);
path.lineTo(pathpoint);
}
}
painter->setPen(p_pen);
painter->setFont(p_font);
qreal pathLength = path.length();
qreal textLength = painter->fontMetrics().boundingRect(name).width() * 1.5;
if(pathLength > textLength) {
qreal length = (pathLength - textLength) / 2;
for ( int i = 0; i < name.size(); i++ ) {
qreal currentPos = length / pathLength;
QPointF point = path.pointAtPercent(currentPos);
QRect charRect = painter->fontMetrics().boundingRect(name[i]);
charRect.translate(point.x(),point.y());
renderer->addLabelRect(charRect.marginsAdded(QMargins(5,5,5,5)));
qreal angle = path.angleAtPercent(currentPos);
angle = 360 - angle;
painter->save();
painter->translate(point);
painter->rotate(angle);
painter->drawText(QPoint(p_offset.X, p_offset.Y),QString(name[i]));
painter->restore();
length += charRect.width();
length += p_font.pointSize() / 2;
}
}
}
}
else
{
QSimpleSpatial::SimplePoint labelPosition = feature->getLabelPosition(p_position);
QSimpleSpatial::SimplePoint point = renderer->Coord2Screen(labelPosition);
QRect rect = painter->fontMetrics().boundingRect(name);
rect.moveTo(point.X - rect.width() / 2 + p_offset.X,point.Y - rect.height() / 2 + p_offset.Y);
if(p_allowOverlap || !renderer->isLabelIntersects(rect)) {
painter->setPen(p_pen);
painter->setFont(p_font);
painter->drawText(rect,Qt::AlignVCenter,name);
if(!p_allowOverlap)
renderer->addLabelRect(rect);
}
}
}
}