Prise en compte d'un cas particulier pour les lignes dans l'editeur d'elements.

Si une ligne equivalait a un point (= avait ses deux points egaux), la fonction pour calculer les quatre points delimitant la shape renvoyait un resultat stupide, ce qui genereait de nombreux avertissements en mode release et l'echec d'un assert en mode debug.
De plus, l'enregistrement de ce genre de lignes est desormais evite dans la methode toXml().



git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@98 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavierqet
2007-08-13 23:01:48 +00:00
parent 8fc2bd154b
commit 900439c00e
2 changed files with 42 additions and 22 deletions

View File

@@ -21,9 +21,17 @@ void PartLine::paint(QPainter *painter, const QStyleOptionGraphicsItem */*q*/, Q
} }
const QDomElement PartLine::toXml(QDomDocument &xml_document) const { const QDomElement PartLine::toXml(QDomDocument &xml_document) const {
QDomElement xml_element = xml_document.createElement("line");
QPointF p1(sceneP1()); QPointF p1(sceneP1());
QPointF p2(sceneP2()); QPointF p2(sceneP2());
// cas particulier : on n'enregistre pas les lignes equivalentes a un point
if (p1 == p2) {
QDomElement *null_qdom_elmt = new QDomElement();
return(*null_qdom_elmt);
}
QDomElement xml_element = xml_document.createElement("line");
xml_element.setAttribute("x1", p1.x()); xml_element.setAttribute("x1", p1.x());
xml_element.setAttribute("y1", p1.y()); xml_element.setAttribute("y1", p1.y());
xml_element.setAttribute("x2", p2.x()); xml_element.setAttribute("x2", p2.x());
@@ -106,32 +114,43 @@ QRectF PartLine::boundingRect() const {
@return une liste contenant les deux points de la droite + les 4 points entourant ces deux points @return une liste contenant les deux points de la droite + les 4 points entourant ces deux points
*/ */
QList<QPointF> PartLine::fourShapePoints() const { QList<QPointF> PartLine::fourShapePoints() const {
const qreal marge = 2.0;
// on a donc A(xa , ya) et B(xb, yb) // on a donc A(xa , ya) et B(xb, yb)
QPointF a = line().p1(); QPointF a = line().p1();
QPointF b = line().p2(); QPointF b = line().p2();
// on calcule le vecteur AB : (xb-xa, yb-ya)
QPointF v_ab = b - a;
// et la distance AB : racine des coordonnees du vecteur au carre
qreal ab = sqrt(pow(v_ab.x(), 2) + pow(v_ab.y(), 2));
// ensuite on definit le vecteur u(a, b) qui est egal au vecteur AB divise
// par sa longueur et multiplie par la longueur de la marge que tu veux
// laisser
QPointF u = v_ab / ab * 2.0;
// on d<>finit le vecteur v(-b , a) qui est perpendiculaire <20> AB
QPointF v(-u.y(), u.x());
QPointF m = -u + v; // on a le vecteur M = -u + v
QPointF n = -u - v; // et le vecteur N=-u-v
QPointF h = a + m; // H = A + M
QPointF k = a + n; // K = A + N
QPointF i = b - n; // I = B - N
QPointF j = b - m; // J = B - M
QList<QPointF> result; QList<QPointF> result;
result << h << i << j << k;
// cas particulier : la droite se ramene a un point
if (a == b) {
result << QPointF(a.x() - marge, a.y() - marge);
result << QPointF(a.x() - marge, a.y() + marge);
result << QPointF(a.x() + marge, a.y() + marge);
result << QPointF(a.x() + marge, a.y() - marge);
} else {
// on calcule le vecteur AB : (xb-xa, yb-ya)
QPointF v_ab = b - a;
// et la distance AB : racine des coordonnees du vecteur au carre
qreal ab = sqrt(pow(v_ab.x(), 2) + pow(v_ab.y(), 2));
// ensuite on definit le vecteur u(a, b) qui est egal au vecteur AB divise
// par sa longueur et multiplie par la longueur de la marge que tu veux
// laisser
QPointF u = v_ab / ab * marge;
// on d<>finit le vecteur v(-b , a) qui est perpendiculaire <20> AB
QPointF v(-u.y(), u.x());
QPointF m = -u + v; // on a le vecteur M = -u + v
QPointF n = -u - v; // et le vecteur N=-u-v
QPointF h = a + m; // H = A + M
QPointF k = a + n; // K = A + N
QPointF i = b - n; // I = B - N
QPointF j = b - m; // J = B - M
result << h << i << j << k;
}
return(result); return(result);
} }

View File

@@ -100,3 +100,4 @@ SOURCES += aboutqet.cpp \
RESOURCES += qelectrotech.qrc RESOURCES += qelectrotech.qrc
TRANSLATIONS += lang/qet_en.ts lang/qt_fr.ts TRANSLATIONS += lang/qet_en.ts lang/qt_fr.ts
QT += xml QT += xml
CONFIG += release