void OGClimb::_Climb() { QVector2D dv = position - pImpl_->pBody->GetPosition(); dv.normalize(); QVector2D vs = speed * 3 * dv; pImpl_->pBody->SetVelocity(vs); }
void StraightDoubleEdge::updateShape() { prepareGeometryChange(); // calculate the perpendicular edge offset QVector2D direction = QVector2D(m_endPoint - m_startPoint); direction.normalize(); QPointF offset = QPointF(-direction.y(), direction.x()) * s_width; // update the path QPainterPath doubleLine; doubleLine.moveTo(m_startPoint + offset); doubleLine.lineTo(m_endPoint + offset); doubleLine.moveTo(m_startPoint - offset); doubleLine.lineTo(m_endPoint - offset); m_path.swap(doubleLine); // update the arrow placeArrowAt(.5); }
void OGClimb::onTargetChanged() { if (!isNewTarget) { //get ball distance from origin float dist = (pImpl_->pBody->GetPosition() - (origin + originCorrection)).length(); //calculate and normalize the new path QVector2D nv = position - (origin + originCorrection); nv.normalize(); //multiply the new path with the distance nv*=dist; //place ball to the path pImpl_->pBody->body->SetTransform(b2Vec2((origin+originCorrection + nv).x(),(origin+originCorrection + nv).y()),pImpl_->pBody->body->GetAngle()); } else { isNewTarget=false; } }
/* draw an angle from the current point to b and then to c, * with a rounded corner of the given radius. */ void KeyboardLayoutWidget::roundedCorner (QPainterPath& path, QPointF b, QPointF c, double radius) { /* we may have 5 point here * a is the current point * c is the end point * and b is the corner * we will have a rounded corner with radious (maybe adjust by a,b,c position) * * a1 is on a-b, and c1 is on b-c */ QPointF a = path.currentPosition(); //qDebug() << "current" << a << b << c; /* make sure radius is not too large */ double dist1 = distance (a, b); double dist2 = distance (b, c); //qDebug() << "dist" << dist1 << dist2 << radius; radius = qMin (radius, qMin (dist1, dist2)); QPointF ba = a - b; QPointF bc = c - b; QVector2D na(ba); QVector2D nc(bc); na.normalize(); nc.normalize(); qreal cosine = QVector2D::dotProduct(na, nc); qreal halfcosine = qSqrt((1 + cosine) / 2); qreal halfsine = qSqrt( 1- halfcosine * halfcosine); qreal halftan = halfsine / halfcosine; QPointF a1 = b + na.toPointF() * (radius / halftan); QPointF c1 = b + nc.toPointF() * (radius / halftan); QVector2D n = na + nc; n.normalize(); QPointF ctr = b + n.toPointF() * radius / halfsine; QRectF arcRect(ctr.x() - radius, ctr.y() - radius, 2 * radius, 2 * radius); qreal phiA, phiC; //qDebug() << c1 << ctr << a1; QVector2D ctra = QVector2D(a1 - ctr); QVector2D ctrc = QVector2D(c1 - ctr); ctra.normalize(); ctrc.normalize(); phiA = angle(ctra); phiC = angle(ctrc); qreal delta = phiC - phiA; while (delta > 0) delta -= 360; while (delta < -360) delta += 360; if (delta <- 180) delta += 360; //qDebug() << arcRect << ctra << ctrc << ctr << "degree" << phiA << phiC; path.lineTo(a1); path.arcTo(arcRect, phiA, delta); path.lineTo(c1); path.lineTo(c); }
/** * Add a mesh for the specified edge. */ void RoadGraph::addMeshFromEdge(RenderablePtr renderable, RoadEdgePtr edge, float widthBase, QColor color, float height) { Vertex v; // define the width of the road segment float width; switch (edge->type) { case RoadEdge::TYPE_HIGHWAY: width = widthBase * 2.0f; break; case RoadEdge::TYPE_BOULEVARD: case RoadEdge::TYPE_AVENUE: width = widthBase * 1.5f; break; case RoadEdge::TYPE_STREET: width = widthBase * 1.0f; break; } int num = edge->polyline.size(); // draw the edge for (int i = 0; i < num - 1; ++i) { QVector2D pt1 = edge->polyline[i]; QVector2D pt2 = edge->polyline[i + 1]; QVector2D vec = pt2 - pt1; vec = QVector2D(-vec.y(), vec.x()); vec.normalize(); QVector2D p0 = pt1 + vec * width * 0.5f; QVector2D p1 = pt1 - vec * width * 0.5f; QVector2D p2 = pt2 - vec * width * 0.5f; QVector2D p3 = pt2 + vec * width * 0.5f; v.color[0] = color.redF(); v.color[1] = color.greenF(); v.color[2] = color.blueF(); v.color[3] = color.alphaF(); v.normal[0] = 0.0f; v.normal[1] = 0.0f; v.normal[2] = 1.0f; v.location[2] = height; v.location[0] = p0.x(); v.location[1] = p0.y(); renderable->vertices.push_back(v); v.location[0] = p1.x(); v.location[1] = p1.y(); renderable->vertices.push_back(v); v.location[0] = p2.x(); v.location[1] = p2.y(); renderable->vertices.push_back(v); v.location[0] = p0.x(); v.location[1] = p0.y(); renderable->vertices.push_back(v); v.location[0] = p2.x(); v.location[1] = p2.y(); renderable->vertices.push_back(v); v.location[0] = p3.x(); v.location[1] = p3.y(); renderable->vertices.push_back(v); } }