Le nombre de segments pour les conducteurs n'est desormais plus limite par les algorithmes.

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@111 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavierqet
2007-09-04 20:19:44 +00:00
parent b47dea1460
commit 7a5ce6d84d
2 changed files with 32 additions and 82 deletions

View File

@@ -14,8 +14,8 @@ ConducerSegment::ConducerSegment(
ConducerSegment *cs1, ConducerSegment *cs1,
ConducerSegment *cs2 ConducerSegment *cs2
) : ) :
point1(p1), point1(p1),
point2(p2) point2(p2)
{ {
setPreviousSegment(cs1); setPreviousSegment(cs1);
setNextSegment(cs2); setNextSegment(cs2);
@@ -44,7 +44,7 @@ bool ConducerSegment::canMove1stPointX(const qreal &asked_dx, qreal &possible_dx
Q_ASSERT_X(isVertical(), "ConducerSegment::canMove1stPointX", "segment non vertical"); Q_ASSERT_X(isVertical(), "ConducerSegment::canMove1stPointX", "segment non vertical");
/// On ne bouge jamais le premier point d'un segment statique. /// On ne bouge jamais le premier point d'un segment statique.
if (!hasPreviousSegment()) { if (isStatic()) {
possible_dx = 0.0; possible_dx = 0.0;
return(false); return(false);
} }
@@ -102,8 +102,8 @@ bool ConducerSegment::canMove2ndPointX(const qreal &asked_dx, qreal &possible_dx
Q_ASSERT_X(isVertical(), "ConducerSegment::canMove2ndPointX", "segment non vertical"); Q_ASSERT_X(isVertical(), "ConducerSegment::canMove2ndPointX", "segment non vertical");
/// On ne modifie jamais l'ordonnee du second point d'un segment statique. /// On ne modifie jamais l'abscisse du second point d'un segment statique.
if (!hasNextSegment()) { if (isStatic()) {
possible_dx = 0.0; possible_dx = 0.0;
return(false); return(false);
} }
@@ -162,7 +162,7 @@ bool ConducerSegment::canMove1stPointY(const qreal &asked_dy, qreal &possible_dy
Q_ASSERT_X(isHorizontal(), "ConducerSegment::canMove1stPointY", "segment non horizontal"); Q_ASSERT_X(isHorizontal(), "ConducerSegment::canMove1stPointY", "segment non horizontal");
/// On ne bouge jamais le premier point d'un segment statique. /// On ne bouge jamais le premier point d'un segment statique.
if (!hasPreviousSegment()) { if (isStatic()) {
possible_dy = 0.0; possible_dy = 0.0;
return(false); return(false);
} }
@@ -221,7 +221,7 @@ bool ConducerSegment::canMove2ndPointY(const qreal &asked_dy, qreal &possible_dy
Q_ASSERT_X(isHorizontal(), "ConducerSegment::canMove2ndPointY", "segment non horizontal"); Q_ASSERT_X(isHorizontal(), "ConducerSegment::canMove2ndPointY", "segment non horizontal");
/// On ne modifie jamais l'abscisse du second point d'un segment statique. /// On ne modifie jamais l'abscisse du second point d'un segment statique.
if (!hasNextSegment()) { if (isStatic()) {
possible_dy = 0.0; possible_dy = 0.0;
return(false); return(false);
} }
@@ -278,7 +278,7 @@ void ConducerSegment::moveX(const qreal &dx) {
bool has_prev_segment = hasPreviousSegment(); bool has_prev_segment = hasPreviousSegment();
bool has_next_segment = hasNextSegment(); bool has_next_segment = hasNextSegment();
if (!has_prev_segment || !has_next_segment) return; if (isStatic()) return;
// determine si le mouvement demande doit etre limite et, le cas echeant, a quelle valeur il faut le limiter // determine si le mouvement demande doit etre limite et, le cas echeant, a quelle valeur il faut le limiter
qreal real_dx_for_1st_point = 0.0; qreal real_dx_for_1st_point = 0.0;
@@ -291,7 +291,7 @@ void ConducerSegment::moveX(const qreal &dx) {
// applique le mouvement au premier point // applique le mouvement au premier point
if (has_prev_segment) { if (has_prev_segment) {
point1.rx() += final_movement; point1.rx() += final_movement;
if (!previous_segment -> hasPreviousSegment() && previous_segment -> isVertical()) { if (previous_segment -> isFirstSegment()) {
new ConducerSegment( new ConducerSegment(
previous_segment -> point2, previous_segment -> point2,
point1, point1,
@@ -304,7 +304,7 @@ void ConducerSegment::moveX(const qreal &dx) {
// applique le mouvement au second point // applique le mouvement au second point
if (has_next_segment) { if (has_next_segment) {
point2.rx() += final_movement; point2.rx() += final_movement;
if (!next_segment -> hasNextSegment() && next_segment -> isVertical()) { if (next_segment -> isLastSegment()) {
new ConducerSegment( new ConducerSegment(
point2, point2,
next_segment -> point1, next_segment -> point1,
@@ -326,7 +326,7 @@ void ConducerSegment::moveY(const qreal &dy) {
bool has_prev_segment = hasPreviousSegment(); bool has_prev_segment = hasPreviousSegment();
bool has_next_segment = hasNextSegment(); bool has_next_segment = hasNextSegment();
if (!has_prev_segment || !has_next_segment) return; if (isStatic()) return;
// determine si le mouvement demande doit etre limite et, le cas echeant, a quelle valeur il faut le limiter // determine si le mouvement demande doit etre limite et, le cas echeant, a quelle valeur il faut le limiter
qreal real_dy_for_1st_point = 0.0; qreal real_dy_for_1st_point = 0.0;
@@ -339,7 +339,7 @@ void ConducerSegment::moveY(const qreal &dy) {
// applique le mouvement au premier point // applique le mouvement au premier point
if (has_prev_segment) { if (has_prev_segment) {
point1.ry() += final_movement; point1.ry() += final_movement;
if (!previous_segment -> hasPreviousSegment() && previous_segment -> isHorizontal()) { if (previous_segment -> isFirstSegment()) {
new ConducerSegment( new ConducerSegment(
previous_segment -> point2, previous_segment -> point2,
point1, point1,
@@ -352,7 +352,7 @@ void ConducerSegment::moveY(const qreal &dy) {
// applique le mouvement au second point // applique le mouvement au second point
if (has_next_segment) { if (has_next_segment) {
point2.ry() += final_movement; point2.ry() += final_movement;
if (!next_segment -> hasNextSegment() && next_segment -> isHorizontal()) { if (next_segment -> isLastSegment()) {
new ConducerSegment( new ConducerSegment(
point2, point2,
next_segment -> point1, next_segment -> point1,
@@ -362,75 +362,7 @@ void ConducerSegment::moveY(const qreal &dy) {
} else next_segment -> setFirstPoint(point2); } else next_segment -> setFirstPoint(point2);
} }
} }
/*
void ConducerSegment::moveY(qreal dy) {
if (isVertical()) return;
Q_ASSERT_X(isHorizontal(), "ConducerSegment::moveY", "segment non horizontal");
bool has_prev_segment = hasPreviousSegment();
bool has_next_segment = hasNextSegment();
if (!has_prev_segment || !has_next_segment) return;
// s'il y a un segment precedent
if (has_prev_segment) {
// et que celui-ci est statique,
if (!previous_segment -> hasPreviousSegment()) {
// on agit differemment selon que le segment statique est vertical...
if (previous_segment -> isVertical()) {
// auquel cas, on limite le deplacement
qreal real_dy;
/// @todo limiter le deplacement
real_dy = 0.0;
point1.ry() += real_dy;
previous_segment -> setSecondPoint(point1);
} else {
// ou horizontal : auquel cas, on ajoute un segment vertical
point1.ry() += dy;
new ConducerSegment(
previous_segment -> point2,
point1,
previous_segment,
this
);
}
} else {
// si le segment n'est pas statique, on applique le deplacement
point1.ry() += dy;
previous_segment -> setSecondPoint(point1);
}
}
// s'il y a un segment suivant
if (has_next_segment) {
// et que celui-ci est statique,
if (!next_segment -> hasNextSegment()) {
// on agit differemment selon que le segment statique est vertical...
if (next_segment -> isVertical()) {
// auquel cas, on limite le deplacement
qreal real_dy;
/// @todo limiter le deplacement
real_dy = 0.0;
point2.ry() += real_dy;
next_segment -> setFirstPoint(point2);
} else {
// ou horizontal : auquel cas, on ajoute un segment horizontal
point2.ry() += dy;
new ConducerSegment(
point2,
next_segment -> point1,
this,
next_segment
);
}
} else {
// si le segment n'est pas statique, on applique le deplacement
point2.ry() += dy;
next_segment -> setFirstPoint(point2);
}
}
}
*/
/** /**
Change le segment precedent Change le segment precedent
@param ps Le nouveau segment precedent @param ps Le nouveau segment precedent
@@ -453,6 +385,21 @@ void ConducerSegment::setNextSegment(ConducerSegment *ns) {
} }
} }
/// @return true si ce segment est un segment statique, cad un segment relie a une borne
bool ConducerSegment::isStatic() const {
return(isFirstSegment() || isLastSegment());
}
/// @return true si ce segment est le premier du conducteur
bool ConducerSegment::isFirstSegment() const {
return(!hasPreviousSegment());
}
/// @return true si ce segment est le dernier du conducteur
bool ConducerSegment::isLastSegment() const {
return(!hasNextSegment());
}
/** /**
@return Le segment precedent @return Le segment precedent
*/ */

View File

@@ -31,6 +31,9 @@ class ConducerSegment {
bool hasNextSegment() const; bool hasNextSegment() const;
void setPreviousSegment(ConducerSegment *); void setPreviousSegment(ConducerSegment *);
void setNextSegment(ConducerSegment *); void setNextSegment(ConducerSegment *);
bool isStatic() const;
bool isFirstSegment() const;
bool isLastSegment() const;
QPointF firstPoint() const; QPointF firstPoint() const;
QPointF secondPoint() const; QPointF secondPoint() const;
void setFirstPoint(const QPointF &); void setFirstPoint(const QPointF &);