|
From: <bma...@us...> - 2013-12-09 15:33:20
|
Revision: 8540
http://sourceforge.net/p/fudaa/svn/8540
Author: bmarchan
Date: 2013-12-09 15:33:17 +0000 (Mon, 09 Dec 2013)
Log Message:
-----------
Mascaret : Algo lissage g?\195?\169n?\195?\169rique
Modified Paths:
--------------
trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/Hydraulique1dProfilModel.java
trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/editor/Hydraulique1dLissageProfilEditor.java
Added Paths:
-----------
trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/util/
trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/util/CourbeLissable.java
trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/util/Hydraulique1DUtils.java
Modified: trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/Hydraulique1dProfilModel.java
===================================================================
--- trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/Hydraulique1dProfilModel.java 2013-12-09 15:30:51 UTC (rev 8539)
+++ trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/Hydraulique1dProfilModel.java 2013-12-09 15:33:17 UTC (rev 8540)
@@ -32,6 +32,8 @@
import org.fudaa.dodico.hydraulique1d.metier.MetierProfil;
import org.fudaa.dodico.hydraulique1d.metier.geometrie.MetierPoint2D;
+import org.fudaa.fudaa.hydraulique1d.util.CourbeLissable;
+import org.fudaa.fudaa.hydraulique1d.util.Hydraulique1DUtils;
/**
* Mod\xE8le de donn\xE9e utilis\xE9 pour repr\xE9senter un profil.
@@ -41,7 +43,7 @@
* @version $Revision: 1.15 $ $Date: 2007-11-20 11:43:05 $ by $Author: bmarchan $
* @author Jean-Marc Lacombe, Bertrand Marchand
*/
-public final class Hydraulique1dProfilModel implements Cloneable, Hydraulique1dProfilI {
+public final class Hydraulique1dProfilModel implements Cloneable, Hydraulique1dProfilI, CourbeLissable {
/** Insertion : Mask zone vide */
public static final int MASK_ZONE_VIDE=0;
/** Insertion : Mask zone stockage gauche */
@@ -1494,6 +1496,31 @@
fireDataChanged(Hydraulique1dProfilDataEvent.GLOBAL_MODIFICATION,null);
}
+ @Override
+ public int getNbPoints() {
+ return this.getPoints().length;
+ }
+
+ @Override
+ public double getX(int _ipt) {
+ return this.getCurv(_ipt);
+ }
+
+ @Override
+ public double getY(int _ipt) {
+ return this.getZ(_ipt);
+ }
+
+ @Override
+ public boolean canModifyY(int _ipt) {
+ return (_ipt != this.getIndiceLitMajGa() && _ipt != this.getIndiceLitMinGa() && _ipt != this.getIndiceLitMinDr() && _ipt != this.getIndiceLitMajDr());
+ }
+
+ @Override
+ public void setY(int _ipt, double _y) {
+ this.getPoint(_ipt).y(_y);
+ }
+
/**
* Lisse le profil suivant une m\xE9thode m\xE9diane/moyenne glissante.
* @param _meth La m\xE9thode de lissage (0: Mediane, 1: Moyenne)
@@ -1507,56 +1534,8 @@
indicesNonNuls_=null;
supprimePointsNuls(); // On enleve les points nuls, problematique des les m\xE9thodes globales.
- // Pour les y modifi\xE9s on travaille sur un tableau temporaire.
- double[] ypts=new double[nb];
- // Les y des points dans la fenetre
- Vector<Double> vyptsFen=new Vector<Double>();
+ Hydraulique1DUtils.lisser(this, _l, _meth, true);
- for (int i=0; i<nb; i++) {
- vyptsFen.clear();
-
- double xpt=((Hydraulique1dPoint)listePoints_.get(i)).x();
- vyptsFen.add(listePoints_.get(i).Y());
-
- // Les points supportant des limites ne doivent pas \xEAtre modifi\xE9s.
- if (i!=getIndiceLitMajGa() && i!=getIndiceLitMinGa() && i!=getIndiceLitMinDr() && i!=getIndiceLitMajDr()) {
- Hydraulique1dPoint pt;
-
- int ind=i-1;
- // Les points pr\xE9c\xE9dents (on passe les points nuls)
- while (ind>=0&&Math.abs((pt=listePoints_.get(ind)).x()-xpt)<_l) {
- vyptsFen.add(pt.Y());
- ind--;
- }
- // Les points suivants (on passe les points nuls)
- ind=i+1;
- while (ind<nb&&Math.abs((pt=listePoints_.get(ind)).x()-xpt)<_l) {
- vyptsFen.add(pt.Y());
- ind++;
- }
- }
-
- Double[] yptsFen=vyptsFen.toArray(new Double[vyptsFen.size()]);
-
- // M\xE9diane glissante : La moyenne des 2 valeurs centrales apr\xE8s tri des valeurs.
- if (_meth==0) {
- Arrays.sort(yptsFen);
- if (yptsFen.length%2==1)
- ypts[i]=yptsFen[yptsFen.length/2].doubleValue();
- else
- ypts[i]=(yptsFen[yptsFen.length/2].doubleValue()+yptsFen[yptsFen.length/2-1].doubleValue())/2.;
- }
-
- // Moyenne glissante : La moyenne de toutes les valeurs.
- else {
- for (int j=0; j<yptsFen.length; j++) ypts[i]+=yptsFen[j].doubleValue();
- ypts[i]/=yptsFen.length;
- }
- }
-
- // Mise a jour du profil
- for (int i=0; i<nb; i++) ((Hydraulique1dPoint)listePoints_.get(i)).y(ypts[i]);
-
fireDataChanged(Hydraulique1dProfilDataEvent.GLOBAL_MODIFICATION,null);
}
Modified: trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/editor/Hydraulique1dLissageProfilEditor.java
===================================================================
--- trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/editor/Hydraulique1dLissageProfilEditor.java 2013-12-09 15:30:51 UTC (rev 8539)
+++ trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/editor/Hydraulique1dLissageProfilEditor.java 2013-12-09 15:33:17 UTC (rev 8540)
@@ -23,11 +23,13 @@
import javax.swing.JPanel;
import javax.swing.border.Border;
+import org.fudaa.fudaa.hydraulique1d.Hydraulique1dResource;
+import org.fudaa.fudaa.hydraulique1d.util.Hydraulique1DUtils;
+
import com.memoire.bu.BuButton;
import com.memoire.bu.BuGridLayout;
import com.memoire.bu.BuResource;
import com.memoire.bu.BuTextField;
-import org.fudaa.fudaa.hydraulique1d.Hydraulique1dResource;
/**
* Editeur pour le choix de la m\xE9thode de lissage.
@@ -35,8 +37,6 @@
* @version 1.0
*/
public class Hydraulique1dLissageProfilEditor extends JDialog {
- public static final int LISSAGE_MOYENNE=1;
- public static final int LISSAGE_MEDIANE=0;
private JPanel pnPrinc_=new JPanel();
private Border bdpnPrinc_;
@@ -51,6 +51,7 @@
private JLabel lbLargeur_=new JLabel();
private BuTextField tfLargeur_=BuTextField.createDoubleField();
private JLabel lbLargeurUnite_=new JLabel();
+ private int[] methods_=new int[]{Hydraulique1DUtils.LISSAGE_MEDIANE,Hydraulique1DUtils.LISSAGE_MOYENNE};
public int reponse=0;
public Hydraulique1dLissageProfilEditor(Frame parent) {
@@ -66,6 +67,20 @@
pack();
setLocationRelativeTo(parent);
}
+
+ public void setChoosableMethods(int... _methods) {
+ methods_=_methods;
+
+ coMethode_.removeAllItems();
+ for (int i=0; i<_methods.length; i++) {
+ if (_methods[i]==Hydraulique1DUtils.LISSAGE_MEDIANE) {
+ coMethode_.addItem(Hydraulique1dResource.HYDRAULIQUE1D.getString("Par m\xE9diane glissante"));
+ }
+ else {
+ coMethode_.addItem(Hydraulique1dResource.HYDRAULIQUE1D.getString("Par moyenne glissante"));
+ }
+ }
+ }
private void jbInit() throws Exception {
bdpnPrinc_=BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(Color.white, new Color(165, 163, 151)),
@@ -136,7 +151,7 @@
* @return La m\xE9thode utilis\xE9e.
*/
public int getMethode() {
- return coMethode_.getSelectedIndex();
+ return methods_[coMethode_.getSelectedIndex()];
}
/**
Added: trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/util/CourbeLissable.java
===================================================================
--- trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/util/CourbeLissable.java (rev 0)
+++ trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/util/CourbeLissable.java 2013-12-09 15:33:17 UTC (rev 8540)
@@ -0,0 +1,39 @@
+package org.fudaa.fudaa.hydraulique1d.util;
+
+/**
+ * A implementer pour l'algorithme de lissage.
+ * @author Bertrand Marchand (mar...@de...)
+ *
+ */
+public interface CourbeLissable {
+
+ /**
+ * @return Le nombre de points de la courbe
+ */
+ public int getNbPoints();
+
+ /**
+ * @param _ipt L'indice du point
+ * @return La coordonn\xE9e X du point
+ */
+ public double getX(int _ipt);
+
+ /**
+ * @param _ipt L'indice du point
+ * @return La coordonn\xE9e Y du point
+ */
+ public double getY(int _ipt);
+
+ /**
+ * @param _ipt L'indice du point
+ * @return True si le point peut \xEAtre liss\xE9.
+ */
+ public boolean canModifyY(int _ipt);
+
+ /**
+ * Modification du point donn\xE9 avec la valeur donn\xE9e.
+ * @param _ipt L'indice du point
+ * @param _y La valeur y.
+ */
+ public void setY(int _ipt, double _y);
+}
Property changes on: trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/util/CourbeLissable.java
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/util/Hydraulique1DUtils.java
===================================================================
--- trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/util/Hydraulique1DUtils.java (rev 0)
+++ trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/util/Hydraulique1DUtils.java 2013-12-09 15:33:17 UTC (rev 8540)
@@ -0,0 +1,81 @@
+package org.fudaa.fudaa.hydraulique1d.util;
+
+import java.util.Arrays;
+import java.util.Vector;
+
+/**
+ * Des algorithmes de calcul g\xE9n\xE9raux.
+ *
+ * @author Bertrand Marchand (mar...@de...)
+ */
+public class Hydraulique1DUtils {
+ /** Types de lissage */
+ public static final int LISSAGE_MOYENNE=1;
+ public static final int LISSAGE_MEDIANE=0;
+
+ /**
+ * @param _crb La courbe a lisser
+ * @param _lissPtExtr True : Les points extremit\xE9s sont liss\xE9s.
+ * @param _meth La m\xE9thode de lissage.
+ * @param _larg La largeur de fenetre de lissage.
+ */
+ public static void lisser(CourbeLissable _crb, double _larg, int _meth, boolean _lissPtExtr) {
+
+ int nb=_crb.getNbPoints();
+ if (nb==0) return;
+
+ // Pour les y modifi\xE9s on travaille sur un tableau temporaire.
+ double[] ypts=new double[nb];
+ // Les y des points dans la fenetre
+ Vector<Double> vyptsFen=new Vector<Double>();
+
+ double xmax=_crb.getX(nb-1);
+
+ for (int i=0; i<nb; i++) {
+ vyptsFen.clear();
+
+ double xpt=_crb.getX(i);
+ vyptsFen.add(_crb.getY(i));
+
+ boolean isPtExtr = xpt<_larg/2 | xpt>xmax-_larg/2;
+
+ // Les points supportant des limites ne doivent pas \xEAtre modifi\xE9s.
+ if (_crb.canModifyY(i) && (_lissPtExtr | !isPtExtr)) {
+
+ int ind=i-1;
+ // Les points pr\xE9c\xE9dents (on passe les points nuls)
+ while (ind>=0&&Math.abs(_crb.getX(ind)-xpt)<_larg/2) {
+ vyptsFen.add(_crb.getY(ind));
+ ind--;
+ }
+ // Les points suivants (on passe les points nuls)
+ ind=i+1;
+ while (ind<nb&&Math.abs(_crb.getX(ind)-xpt)<_larg/2) {
+ vyptsFen.add(_crb.getY(ind));
+ ind++;
+ }
+ }
+
+ Double[] yptsFen=vyptsFen.toArray(new Double[vyptsFen.size()]);
+
+ // M\xE9diane glissante : La moyenne des 2 valeurs centrales apr\xE8s tri des valeurs.
+ if (_meth==LISSAGE_MEDIANE) {
+ Arrays.sort(yptsFen);
+ if (yptsFen.length%2==1)
+ ypts[i]=yptsFen[yptsFen.length/2].doubleValue();
+ else
+ ypts[i]=(yptsFen[yptsFen.length/2].doubleValue()+yptsFen[yptsFen.length/2-1].doubleValue())/2.;
+ }
+
+ // Moyenne glissante : La moyenne de toutes les valeurs.
+ else {
+ for (int j=0; j<yptsFen.length; j++) ypts[i]+=yptsFen[j].doubleValue();
+ ypts[i]/=yptsFen.length;
+ }
+ }
+
+ // Mise a jour du profil
+ for (int i=0; i<nb; i++) _crb.setY(i,ypts[i]);
+ }
+
+}
Property changes on: trunk/soft/fudaa-mascaret/ui/src/main/java/org/fudaa/fudaa/hydraulique1d/util/Hydraulique1DUtils.java
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|