⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs_arc.cpp

📁 qcad2.05可用于windows和linux的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
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 + -