From: <bma...@us...> - 2009-03-18 09:24:50
|
Revision: 4555 http://fudaa.svn.sourceforge.net/fudaa/?rev=4555&view=rev Author: bmarchan Date: 2009-03-18 09:24:35 +0000 (Wed, 18 Mar 2009) Log Message: ----------- Tache #201 : D?\195?\169placement du profil sur l'axe => L'angle n'est pas toujours respect?\195?\169 Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/geometrie/GrVecteur.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/geometrie/GrVecteur.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/geometrie/GrVecteur.java 2009-03-17 18:50:18 UTC (rev 4554) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/geometrie/GrVecteur.java 2009-03-18 09:24:35 UTC (rev 4555) @@ -185,4 +185,21 @@ public GrVecteur produitTripleVectoriel(final GrVecteur _v1, final GrVecteur _v2) { return produitVectoriel(_v1).produitVectoriel(_v2); } + + /** + * Calcule dans le plan XY l'angle entre <code>this</code> et un autre vecteur. + * L'angle calcul\xE9 est sign\xE9, tenant compte de l'ordre de <code>this</code> et autre.<p> + * Exemples :<br> + * <code> + * Si this(1,0,0) et autre(0,-1,0), angle=-PI/2<br> + * Si this(0,-1,0) et autre(1,0,0), angle=PI/2 + * </code> + * @param _v Le vecteur autre. + * @return L'angle en radians, sign\xE9. + */ + public double getAngleXY(GrVecteur _v) { + GrVecteur v1=this.normalise(); + GrVecteur v2=_v.normalise(); + return Math.atan2(v1.produitVectoriel(v2).z_,v1.produitScalaire(v2)); + } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-03-17 18:50:18 UTC (rev 4554) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/model/ProfilContainerAdapter.java 2009-03-18 09:24:35 UTC (rev 4555) @@ -28,6 +28,8 @@ import org.fudaa.ctulu.gis.GISLib; import org.fudaa.ctulu.gis.GISZoneCollection; import org.fudaa.ctulu.gis.GISZoneCollectionLigneBrisee; +import org.fudaa.ebli.geometrie.GrSegment; +import org.fudaa.ebli.geometrie.GrVecteur; import org.fudaa.fudaa.commun.FudaaLib; import org.fudaa.fudaa.modeleur.LibUtils; @@ -607,6 +609,7 @@ // Point de croisement actuel entre l'axe et le profil Coordinate oldCoordCroisement=intersection.getCoordinate(); double oldAbscisseCurviligne=UtilsProfil1d.abscisseCurviligne(axeHydrau, oldCoordCroisement); + if (!UtilsProfil1d.egal(absZeroDecal, oldAbscisseCurviligne)) { // Cr\xE9ation d'une selection contenant la g\xE9om\xE9trie \xE0 modifier BitSet bs=new BitSet(biefContainer_.getZoneProfils().getNbGeometries()); @@ -620,30 +623,35 @@ move.x=((double) ((long) (move.x*10000.)))/10000; move.y=((double) ((long) (move.y*10000.)))/10000; biefContainer_.getModelProfils().moveGlobal(selection, move.x, move.y, 0, cmp); - // Somme de tous les angles de l'axe entre les deux points de - // translation + + // On recup\xE8re les 2 segments d'intersection... + //... du profil de d\xE9part avec l'axe int oldNextIdx=UtilsProfil1d.getNextIndex(axeHydrau, oldCoordCroisement); if (oldNextIdx==-1) oldNextIdx=axeHydrau.size()-1; - double oldAngle=0; - for (int i=0; i+2<=oldNextIdx; i++) - oldAngle+=Math.PI - -UtilsProfil1d.getAngle(axeHydrau.getCoordinate(i), axeHydrau.getCoordinate(i+1), axeHydrau.getCoordinate(i+2)); + //... du profil d'arriv\xE9e avec l'axe. int newNextIdx=UtilsProfil1d.getNextIndex(axeHydrau, newCoordCroisement); if (newNextIdx==-1) newNextIdx=axeHydrau.size()-1; - double newAngle=0; - for (int i=0; i+2<=newNextIdx; i++) - newAngle+=Math.PI - -UtilsProfil1d.getAngle(axeHydrau.getCoordinate(i), axeHydrau.getCoordinate(i+1), axeHydrau.getCoordinate(i+2)); + + // Calcul de l'angle entre ces 2 segments, angle correspondant a la rotation a effectuer. + GrVecteur v1=new GrVecteur(axeHydrau.getCoordinate(oldNextIdx).x-axeHydrau.getCoordinate(oldNextIdx-1).x, + axeHydrau.getCoordinate(oldNextIdx).y-axeHydrau.getCoordinate(oldNextIdx-1).y, + 0); + GrVecteur v2=new GrVecteur(axeHydrau.getCoordinate(newNextIdx).x-axeHydrau.getCoordinate(newNextIdx-1).x, + axeHydrau.getCoordinate(newNextIdx).y-axeHydrau.getCoordinate(newNextIdx-1).y, + 0); + double angrot=v1.getAngleXY(v2); + // Application de la rotation biefContainer_.getModelProfils() - .rotateGlobal(selection, newAngle-oldAngle, newCoordCroisement.x, newCoordCroisement.y, cmp); + .rotateGlobal(selection, angrot, newCoordCroisement.x, newCoordCroisement.y, cmp); // Verifie que le profil ne coupe pas deux fois l'axe hydraulique Geometry intersect=geomAxeHydrau.intersection(biefContainer_.getZoneProfils().getGeometry(idxProfilSelected_)); if (intersect.getNumPoints()!=1) { cmp.undo(); // Annulation des modifications - throw new ProfilContainerException(FudaaLib.getS("Le profil couperait l'axe hydraulique en au moins deux endroits.")); + throw new ProfilContainerException( + FudaaLib.getS("D\xE9placement non autoris\xE9 : Le profil couperait l'axe hydraulique en au moins deux endroits.")); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |