📄 rs_arc.cpp
字号:
double RS_Arc::getDistanceToPoint(const RS_Vector& coord, RS_Entity** entity, RS2::ResolveLevel, double) { if (entity!=NULL) { *entity = this; } // check endpoints first: double dist = coord.distanceTo(getStartpoint()); if (dist<1.0e-4) { return dist; } dist = coord.distanceTo(getEndpoint()); if (dist<1.0e-4) { return dist; } if (RS_Math::isAngleBetween(data.center.angleTo(coord), data.angle1, data.angle2, isReversed())) { return fabs((coord-data.center).magnitude() - data.radius); } else { return RS_MAXDOUBLE; }}void RS_Arc::moveStartpoint(const RS_Vector& pos) { // polyline arcs: move point not angle: //if (parent!=NULL && parent->rtti()==RS2::EntityPolyline) { double bulge = getBulge(); createFrom2PBulge(pos, getEndpoint(), bulge); //} // normal arc: move angle1 /*else { data.angle1 = data.center.angleTo(pos); calculateEndpoints(); calculateBorders(); }*/}void RS_Arc::moveEndpoint(const RS_Vector& pos) { // polyline arcs: move point not angle: //if (parent!=NULL && parent->rtti()==RS2::EntityPolyline) { double bulge = getBulge(); createFrom2PBulge(getStartpoint(), pos, bulge); //} // normal arc: move angle1 /*else { data.angle2 = data.center.angleTo(pos); calculateEndpoints(); calculateBorders(); }*/}void RS_Arc::trimStartpoint(const RS_Vector& pos) { data.angle1 = data.center.angleTo(pos); calculateEndpoints(); calculateBorders();}void RS_Arc::trimEndpoint(const RS_Vector& pos) { data.angle2 = data.center.angleTo(pos); calculateEndpoints(); calculateBorders();}RS2::Ending RS_Arc::getTrimPoint(const RS_Vector& coord, const RS_Vector& trimPoint) { double angEl = data.center.angleTo(trimPoint); double angM = data.center.angleTo(coord); if (RS_Math::getAngleDifference(angM, angEl)>M_PI) { if (data.reversed) { return RS2::EndingEnd; } else { return RS2::EndingStart; } } else { if (data.reversed) { return RS2::EndingStart; } else { return RS2::EndingEnd; } }}void RS_Arc::reverse() { double a = data.angle1; data.angle1 = data.angle2; data.angle2 = a; data.reversed = !data.reversed; calculateEndpoints(); calculateBorders();}void RS_Arc::move(RS_Vector offset) { data.center.move(offset); calculateEndpoints(); calculateBorders();}void RS_Arc::rotate(RS_Vector center, double angle) { RS_DEBUG->print("RS_Arc::rotate"); data.center.rotate(center, angle); data.angle1 = RS_Math::correctAngle(data.angle1+angle); data.angle2 = RS_Math::correctAngle(data.angle2+angle); calculateEndpoints(); calculateBorders(); RS_DEBUG->print("RS_Arc::rotate: OK");}void RS_Arc::scale(RS_Vector center, RS_Vector factor) { // negative scaling: mirroring if (factor.x<0.0) { mirror(data.center, data.center + RS_Vector(0.0, 1.0)); //factor.x*=-1; } if (factor.y<0.0) { mirror(data.center, data.center + RS_Vector(1.0, 0.0)); //factor.y*=-1; } data.center.scale(center, factor); data.radius *= factor.x; if (data.radius<0.0) { data.radius*=-1.0; } calculateEndpoints(); calculateBorders();}void RS_Arc::mirror(RS_Vector axisPoint1, RS_Vector axisPoint2) { data.center.mirror(axisPoint1, axisPoint2); data.reversed = (!data.reversed); /* startpoint.mirror(axisPoint1, axisPoint2); endpoint.mirror(axisPoint1, axisPoint2); data.angle1 = data.center.angleTo(startpoint); data.angle2 = data.center.angleTo(endpoint); */ RS_Vector vec; vec.setPolar(1.0, data.angle1); vec.mirror(RS_Vector(0.0,0.0), axisPoint2-axisPoint1); data.angle1 = vec.angle(); vec.setPolar(1.0, data.angle2); vec.mirror(RS_Vector(0.0,0.0), axisPoint2-axisPoint1); data.angle2 = vec.angle(); calculateEndpoints(); calculateBorders();}void RS_Arc::moveRef(const RS_Vector& ref, const RS_Vector& offset) { if (ref.distanceTo(startpoint)<1.0e-4) { moveStartpoint(startpoint+offset); } if (ref.distanceTo(endpoint)<1.0e-4) { moveEndpoint(endpoint+offset); }}void RS_Arc::stretch(RS_Vector firstCorner, RS_Vector secondCorner, RS_Vector offset) { if (getMin().isInWindow(firstCorner, secondCorner) && getMax().isInWindow(firstCorner, secondCorner)) { move(offset); } else { if (getStartpoint().isInWindow(firstCorner, secondCorner)) { moveStartpoint(getStartpoint() + offset); } if (getEndpoint().isInWindow(firstCorner, secondCorner)) { moveEndpoint(getEndpoint() + offset); } }}void RS_Arc::draw(RS_Painter* painter, RS_GraphicView* view, double /*patternOffset*/) { if (painter==NULL || view==NULL) { return; } //double styleFactor = getStyleFactor(); // simple style-less lines if (getPen().getLineType()==RS2::SolidLine || isSelected() || view->getDrawingMode()==RS2::ModePreview) { painter->drawArc(view->toGui(getCenter()), getRadius() * view->getFactor().x, getAngle1(), getAngle2(), isReversed()); } else { double styleFactor = getStyleFactor(view); if (styleFactor<0.0) { painter->drawArc(view->toGui(getCenter()), getRadius() * view->getFactor().x, getAngle1(), getAngle2(), isReversed()); return; } // Pattern: RS_LineTypePattern* pat; if (isSelected()) { pat = &patternSelected; } else { pat = view->getPattern(getPen().getLineType()); } if (pat==NULL) { return; } if (getRadius()<1.0e-6) { return; } // Pen to draw pattern is always solid: RS_Pen pen = painter->getPen(); pen.setLineType(RS2::SolidLine); painter->setPen(pen); double a1; double a2; if (data.reversed) { a2 = getAngle1(); a1 = getAngle2(); } else { a1 = getAngle1(); a2 = getAngle2(); } double* da; // array of distances in x. int i; // index counter double length = getAngleLength(); // create scaled pattern: da = new double[pat->num]; for (i=0; i<pat->num; ++i) { da[i] = fabs(pat->pattern[i] * styleFactor) / getRadius(); } double tot=0.0; i=0; bool done = false; double curA = a1; //double cx = getCenter().x * factor.x + offsetX; //double cy = - a->getCenter().y * factor.y + getHeight() - offsetY; RS_Vector cp = view->toGui(getCenter()); double r = getRadius() * view->getFactor().x; do { if (pat->pattern[i] > 0.0) { if (tot+da[i]<length) { painter->drawArc(cp, r, curA, curA + da[i], false); } else { painter->drawArc(cp, r, curA, a2, false); } } curA+=da[i]; tot+=da[i]; done=tot>length; i++; if (i>=pat->num) { i=0; } } while(!done); delete[] da; }}/** * @return Middle point of the entity. */RS_Vector RS_Arc::getMiddlepoint() const { double a; RS_Vector ret; if (isReversed()) { a = data.angle1 - getAngleLength()/2.0; } else { a = data.angle1 + getAngleLength()/2.0; } ret.setPolar(data.radius, a); ret+=data.center; return ret;}/** * @return Angle length in rad. */double RS_Arc::getAngleLength() const { double ret = 0.0; if (isReversed()) { if (data.angle1<data.angle2) { ret = data.angle1+2*M_PI-data.angle2; } else { ret = data.angle1-data.angle2; } } else { if (data.angle2<data.angle1) { ret = data.angle2+2*M_PI-data.angle1; } else { ret = data.angle2-data.angle1; } } // full circle: if (fabs(ret)<1.0e-6) { ret = 2*M_PI; } return ret;}/** * @return Length of the arc. */double RS_Arc::getLength() { return getAngleLength()*data.radius;}/** * Gets the arc's bulge (tangens of angle length divided by 4). */double RS_Arc::getBulge() const { double bulge = tan(fabs(getAngleLength())/4.0); if (isReversed()) { bulge*=-1; } return bulge;}/** * Dumps the point's data to stdout. */std::ostream& operator << (std::ostream& os, const RS_Arc& a) { os << " Arc: " << a.data << "\n"; return os;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -