QScriptValue PHIEllipseItem::spanAngle( const QScriptValue &v ) { if ( !isServerItem() ) return scriptEngine()->undefinedValue(); if ( !v.isValid() ) return realSpanAngle(); setSpanAngle( v.toInt32() ); setDirtyFlag( DFDoNotCache ); return self(); }
void EllipseScatterer::setParamFromWidget( ) { //QLOG_DEBUG() << "EllipseScatterer::setParamFromWidget"; EllipseParam param = innerState->form.getParam(); setRect( param.rect ); setStartAngle( param.startAngle ); setSpanAngle( param.spanAngle ); setRotationAngle( param.rotationAngle ); paint( state->scene, state->xMin, state->xMax, state->yMin, state->yMax ); }
/** * @brief WayPointCurve::refreshLocations Update the settings for the * arc when it is moved or the zoom changes */ void WayPointCurve::refreshLocations() { double m_n, m_e, p_n, p_e, d, center_x, center_y; // Center between start and end m_n = (m_start->pos().x() + m_dest->pos().x()) / 2; m_e = (m_start->pos().y() + m_dest->pos().y()) / 2; // Normal vector the line between start and end. if (!m_clockwise) { p_n = -(m_dest->pos().y() - m_start->pos().y()); p_e = (m_dest->pos().x() - m_start->pos().x()); } else { p_n = (m_dest->pos().y() - m_start->pos().y()); p_e = -(m_dest->pos().x() - m_start->pos().x()); } double radius_sign = (m_radius > 0) ? 1 : -1; double pixels2meters = my_map->Projection()->GetGroundResolution(my_map->ZoomTotal(), m_start->Coord().Lat()); double radius = fabs(m_radius / pixels2meters); // Work out how far to go along the perpendicular bisector d = sqrt(radius * radius / (p_n * p_n + p_e * p_e) - 0.25f); if (fabs(p_n) < 1e-3 && fabs(p_e) < 1e-3) { center_x = m_n; center_y = m_e; } else { center_x = m_n + p_n * d * radius_sign; center_y = m_e + p_e * d * radius_sign; } // Store the center center.setX(center_x); center.setY(center_y); // Compute the midpoint along the arc for the arrow d = sqrt(radius * radius / (p_n * p_n + p_e * p_e)); midpoint.setX(center_x - p_n * d); midpoint.setY(center_y - p_e * d); midpoint_angle = -atan2(m_dest->pos().y() - m_start->pos().y(), m_dest->pos().x() - m_start->pos().x()); double startAngle = atan2(-(m_start->pos().y() - center_y), m_start->pos().x() - center_x); double endAngle = atan2(-(m_dest->pos().y() - center_y), m_dest->pos().x() - center_x); double span = endAngle - startAngle; if (!m_clockwise) { if (span > 0) span = span - 2 * M_PI; } else { if (span < 0) span = span + 2 * M_PI; } setRect(center_x - radius, center_y - radius, 2 * radius, 2 * radius); setStartAngle(startAngle * 180.0 / M_PI * 16.0); setSpanAngle(span * 180.0 / M_PI * 16.0); update(); }
PART_CIRC::PART_CIRC(int i, QRect pos, QColor colFont, double angDeb, double angTaille, QGraphicsScene *s, QString n) { scene=s; id=i; setBrush(QBrush(colFont)); setRect(pos); setStartAngle((angDeb)*16); setSpanAngle(angTaille*16); if(n!="") { nom=n; nomGraph = new QGraphicsTextItem(nom,this); nomGraph->setPos(0, pos.height()/2); nomGraph->setTransformOriginPoint(pos.width()/4,pos.height()/4); scene->addItem(this); nomGraph->setRotation(360-(int(angDeb+angTaille/2+180)%360)); nomGraph->setPos(pos.width()/4,pos.height()/4); } }
UBGraphicsProtractor::UBGraphicsProtractor() : QGraphicsEllipseItem(sDefaultRect) , mCurrentTool(None) , mShowButtons(false) , mCurrentAngle(0) , mSpan(180) , mStartAngle(0) , mScaleFactor(1) , mResetSvgItem(0) , mResizeSvgItem(0) , mMarkerSvgItem(0) { sFillTransparency = 127; sDrawTransparency = 192; create(*this); setCacheMode(QGraphicsItem::DeviceCoordinateCache); setStartAngle(0); setSpanAngle(180 * 16); mResetSvgItem = new QGraphicsSvgItem(":/images/resetTool.svg", this); mResetSvgItem->setVisible(false); mResetSvgItem->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control)); mResizeSvgItem = new QGraphicsSvgItem(":/images/resizeTool.svg", this); mResizeSvgItem->setVisible(false); mResizeSvgItem->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control)); mMarkerSvgItem = new QGraphicsSvgItem(":/images/angleMarker.svg", this); mMarkerSvgItem->setVisible(false); mMarkerSvgItem->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Tool)); mRotateSvgItem = new QGraphicsSvgItem(":/images/rotateTool.svg", this); mRotateSvgItem->setVisible(false); mRotateSvgItem->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control)); setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::CppTool)); //Necessary to set if we want z value to be assigned correctly setFlag(QGraphicsItem::ItemIsSelectable, false); scale(1.5, 1.5); }
/************************************************************************* 函数名称:SetSpanAngle(int nAngle) nAngle:一个跨度角度,坐标系,x方向向右为0度,往逆时针方向角度逐渐变大 函数作用:设置一个跨度角度,获得不同形状的扇形 *************************************************************************/ void QElipseItem::SetSpanAngle(int nAngle) //设置跨度角度,要乘16 { int nspanAngle = nAngle * 16; setSpanAngle(nspanAngle); }