|
From: <de...@us...> - 2012-11-05 16:21:49
|
Revision: 7860
http://fudaa.svn.sourceforge.net/fudaa/?rev=7860&view=rev
Author: deniger
Date: 2012-11-05 16:21:38 +0000 (Mon, 05 Nov 2012)
Log Message:
-----------
Modified Paths:
--------------
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfBilanHelper.java
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/operation/EfLineFlowrateResult.java
trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/serafin/SerafinNewReader.java
Added Paths:
-----------
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/operation/EfVectorComputation.java
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfBilanHelper.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfBilanHelper.java 2012-11-05 14:43:17 UTC (rev 7859)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfBilanHelper.java 2012-11-05 16:21:38 UTC (rev 7860)
@@ -1,11 +1,13 @@
/**
- * Licence GPL
- * Copyright Genesis
+ * Licence GPL Copyright Genesis
*/
package org.fudaa.dodico.ef.cubature;
import org.fudaa.dodico.ef.EfData;
+import org.fudaa.dodico.ef.operation.EfLineFlowrateResult;
+import org.fudaa.dodico.ef.operation.EfLineIntersection;
import org.fudaa.dodico.ef.operation.EfLineIntersectionsResultsI;
+import org.fudaa.dodico.ef.operation.EfVectorComputation;
/**
* @author deniger
@@ -13,9 +15,9 @@
public class EfBilanHelper {
/**
- * Integration des donnees par la methode des trapezes entre la courbe representee par les x et y et la droite d\xE9finie
- * par la fonction affine de coeff a et d'ordonn\xE9\xE9e a l origine b y=a*x+b
- *
+ * Integration des donnees par la methode des trapezes entre la courbe representee par les x1 et y1 et la droite d\xE9finie par la fonction affine de
+ * coeff a et d'ordonn\xE9\xE9e a l origine b y1=a*x1+b
+ *
* @param lx
* @param ly
* @return
@@ -65,7 +67,7 @@
}
} else {
- // x2=x droite d equation x=Cste
+ // x2=x1 droite d equation x1=Cste
xIntersect = x;
yIntersect = a * x + b;
@@ -89,82 +91,37 @@
}
/**
- * Calcule l'aire du trapeze en utilisant un objet EfLineIntersectionsResultsI. EfLineIntersectionsResultsI fonctionne
- * de la maniere suivante: getNbIntersect():donne le nombre de points getDistFromDeb(i) donne le Xi: distance entre le
- * debut et le point getIntersect(i) getValueBadInterpolation(EfData _d) donne le y associ\xE9 au x
+ * Calcule l'aire du trapeze en utilisant un objet EfLineIntersectionsResultsI. EfLineIntersectionsResultsI fonctionne de la maniere suivante:
+ * getNbIntersect():donne le nombre de points getDistFromDeb(i) donne le Xi: distance entre le debut et le point getIntersect(i)
+ * getValueBadInterpolation(EfData _d) donne le y1 associ\xE9 au x1
*/
public static EfDataIntegrale integrerMethodeTrapeze(EfLineIntersectionsResultsI _interfaceResults, EfData _crbdata,
- double seuil) {
+ double seuil) {
EfDataIntegrale data = new EfDataIntegrale();
for (int i = 0; i < _interfaceResults.getNbIntersect() - 1; i++) {
// on ne traite pas ce cas,
- if (_interfaceResults.isSegmentOut(i)) continue;
- double x = _interfaceResults.getDistFromDeb(i);
+ if (_interfaceResults.isSegmentOut(i)) {
+ continue;
+ }
+ double x1 = _interfaceResults.getDistFromDeb(i);
double x2 = _interfaceResults.getDistFromDeb(i + 1);
- double y = _interfaceResults.getIntersect(i).getValueBadInterpolation(_crbdata);
+ double y1 = _interfaceResults.getIntersect(i).getValueBadInterpolation(_crbdata);
double y2 = _interfaceResults.getIntersect(i + 1).getValueBadInterpolation(_crbdata);
-
- if (y >= seuil && y2 >= seuil) {
- // courbe au dessus de la ligne
- data.addZonePlus(calculAireTrapeze(x, y, x2, y2, seuil, seuil));
- } else if (y <= seuil && y2 <= seuil) {
- // courbe en dessous de la ligne
- data.addZoneMoins(calculAireTrapeze(x, y, x2, y2, seuil, seuil));
- } else {
- // cas particulier : intersection, on calcule l'intersection entre les
- // points
- final double yIntersect = seuil;
- double xIntersect = 0;
- // on prend la droite form\xE9e par les 2 points et on calcule son
- // intersection avec la droite affine
- if (x2 - x != 0) {
- // droite non parrallele a l axe des ordonn\xE9e !
- double coefDirecteur = (y2 - y) / (x2 - x);
- double ordoOrigine = y2 - coefDirecteur * x2;
-
- // intersection de droites avec le seuil
- // yIntersect = seuil;
-
- if (coefDirecteur != 0)
- // droie non parallele au seuil
- xIntersect = (yIntersect - ordoOrigine) / coefDirecteur;
- else {
- // droite parrallele confondue au seuil, on ne fais rien...
- }
-
- } else {
- // x2=x droite perpendiculaire au seuil, le point d'intersection est
- // donc (x,seuil)
- xIntersect = x;
- // yIntersect = seuil;
- }
-
- // maintenant que l on a le point d'intersection, on test si on ajoute en positif ou negatif
- if (y >= seuil && y2 <= seuil) {
- data.addZonePlus(calculAireTrapeze(x, y, xIntersect, yIntersect, seuil, seuil));
- data.addZoneMoins(calculAireTrapeze(xIntersect, yIntersect, x2, y2, seuil, seuil));
-
- } else {
- data.addZoneMoins(calculAireTrapeze(x, y, xIntersect, yIntersect, seuil, seuil));
- data.addZonePlus(calculAireTrapeze(xIntersect, yIntersect, x2, y2, seuil, seuil));
- }
-
- }
-
+ computeBilan(x1, x2, y1, y2, seuil, data);
}
return data;
}
/**
- * calcul de l'aire du trapeze form\xE9 par les 4 points (x,y) (x2,y2) (x,y3) (x2,y4)
+ * calcul de l'aire du trapeze form\xE9 par les 4 points (x1,y1) (x2,y2) (x1,y3) (x2,y4)
*/
public static double calculAireTrapeze(double x, double y, double x2, double y2, double y3, double y4) {
// 1: calcul de la hauteur
double h = Math.abs(x2 - x);
- // 2 base 1: coordonnees cartesiennes entre le point x,y et x,y3
+ // 2 base 1: coordonnees cartesiennes entre le point x1,y1 et x1,y3
double base1 = Math.abs(y3 - y);
// 3 base 2: coordonnees cartesiennes entre le point x2,y2 et x2,y4
double base2 = Math.abs(y4 - y2);
@@ -172,4 +129,120 @@
return h * (base1 + base2) / 2;
}
+ public static EfDataIntegrale integrerMethodeTrapezeVector(EfLineIntersectionsResultsI interfaceRes, EfData vxData, EfData vyData, double seuil) {
+ EfDataIntegrale data = new EfDataIntegrale();
+ EfVectorComputation vectorComputation = new EfVectorComputation();
+
+ for (int i = 0; i < interfaceRes.getNbIntersect() - 1; i++) {
+ // on ne traite pas ce cas,
+ if (interfaceRes.isSegmentOut(i)) {
+ continue;
+ }
+ final EfLineIntersection intersect1 = interfaceRes.getIntersect(i);
+ final EfLineIntersection intersect2 = interfaceRes.getIntersect(i + 1);
+
+ vectorComputation.vx1_ = intersect1.getValueBadInterpolation(vxData);
+ vectorComputation.vy1_ = intersect1.getValueBadInterpolation(vyData);
+ vectorComputation.vx2_ = intersect2.getValueBadInterpolation(vxData);
+ vectorComputation.vy2_ = intersect2.getValueBadInterpolation(vyData);
+ vectorComputation.x1_ = intersect1.getX();
+ vectorComputation.y1_ = intersect1.getY();
+ vectorComputation.x2_ = intersect2.getX();
+ vectorComputation.y2_ = intersect2.getY();
+
+ double x1 = interfaceRes.getDistFromDeb(i);
+ double x2 = interfaceRes.getDistFromDeb(i + 1);
+ double y1 = vectorComputation.getV1();
+ double y2 = vectorComputation.getV2();
+ computeBilan(x1, x2, y1, y2, seuil, data);
+ }
+
+ return data;
+ }
+
+ public static EfDataIntegrale integrerMethodeTrapezeFlowrate(EfLineIntersectionsResultsI interfaceRes, EfData vxData, EfData vyData, EfData h, double seuil) {
+ EfDataIntegrale data = new EfDataIntegrale();
+ EfVectorComputation vectorComputation = new EfVectorComputation();
+
+ for (int i = 0; i < interfaceRes.getNbIntersect() - 1; i++) {
+ // on ne traite pas ce cas,
+ if (interfaceRes.isSegmentOut(i)) {
+ continue;
+ }
+ final EfLineIntersection intersect1 = interfaceRes.getIntersect(i);
+ final EfLineIntersection intersect2 = interfaceRes.getIntersect(i + 1);
+
+ vectorComputation.vx1_ = intersect1.getValueBadInterpolation(vxData);
+ vectorComputation.vy1_ = intersect1.getValueBadInterpolation(vyData);
+
+
+ vectorComputation.vx2_ = intersect2.getValueBadInterpolation(vxData);
+ vectorComputation.vy2_ = intersect2.getValueBadInterpolation(vyData);
+
+ vectorComputation.x1_ = intersect1.getX();
+ vectorComputation.y1_ = intersect1.getY();
+ vectorComputation.x2_ = intersect2.getX();
+ vectorComputation.y2_ = intersect2.getY();
+
+ double h1 = intersect1.getValueBadInterpolation(h);
+ double h2 = intersect2.getValueBadInterpolation(h);
+
+ double x1 = interfaceRes.getDistFromDeb(i);
+ double x2 = interfaceRes.getDistFromDeb(i + 1);
+ double y1 = vectorComputation.getV1() * h1;
+ double y2 = vectorComputation.getV2() * h2;
+ computeBilan(x1, x2, y1, y2, seuil, data);
+ }
+
+ return data;
+ }
+
+ private static void computeBilan(double x1, double x2, double y1, double y2, double seuil, EfDataIntegrale targetData) {
+ if (y1 >= seuil && y2 >= seuil) {
+ // courbe au dessus de la ligne
+ targetData.addZonePlus(calculAireTrapeze(x1, y1, x2, y2, seuil, seuil));
+ } else if (y1 <= seuil && y2 <= seuil) {
+ // courbe en dessous de la ligne
+ targetData.addZoneMoins(calculAireTrapeze(x1, y1, x2, y2, seuil, seuil));
+ } else {
+ // cas particulier : intersection, on calcule l'intersection entre les
+ // points
+ final double yIntersect = seuil;
+ double xIntersect = 0;
+ // on prend la droite form\xE9e par les 2 points et on calcule son
+ // intersection avec la droite affine
+ if (x2 - x1 != 0) {
+ // droite non parrallele a l axe des ordonn\xE9e !
+ double coefDirecteur = (y2 - y1) / (x2 - x1);
+ double ordoOrigine = y2 - coefDirecteur * x2;
+
+ // intersection de droites avec le seuil
+ // yIntersect = seuil;
+
+ if (coefDirecteur != 0) // droie non parallele au seuil
+ {
+ xIntersect = (yIntersect - ordoOrigine) / coefDirecteur;
+ } else {
+ // droite parrallele confondue au seuil, on ne fais rien...
+ }
+
+ } else {
+ // x2=x1 droite perpendiculaire au seuil, le point d'intersection est
+ // donc (x1,seuil)
+ xIntersect = x1;
+ // yIntersect = seuil;
+ }
+
+ // maintenant que l on a le point d'intersection, on test si on ajoute en positif ou negatif
+ if (y1 >= seuil && y2 <= seuil) {
+ targetData.addZonePlus(calculAireTrapeze(x1, y1, xIntersect, yIntersect, seuil, seuil));
+ targetData.addZoneMoins(calculAireTrapeze(xIntersect, yIntersect, x2, y2, seuil, seuil));
+
+ } else {
+ targetData.addZoneMoins(calculAireTrapeze(x1, y1, xIntersect, yIntersect, seuil, seuil));
+ targetData.addZonePlus(calculAireTrapeze(xIntersect, yIntersect, x2, y2, seuil, seuil));
+ }
+
+ }
+ }
}
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/operation/EfLineFlowrateResult.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/operation/EfLineFlowrateResult.java 2012-11-05 14:43:17 UTC (rev 7859)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/operation/EfLineFlowrateResult.java 2012-11-05 16:21:38 UTC (rev 7860)
@@ -20,60 +20,11 @@
/**
* Une classe permettant de calculer le d\xE9bit \xE0 partir d'un profil.
- *
+ *
* @author fred deniger
* @version $Id: EfLineFlowrateResult.java,v 1.4 2007-06-13 12:55:42 deniger Exp $
*/
public class EfLineFlowrateResult {
-
- private class Compute {
- double eps_ = 1E-5;
-
- double h1_;
-
- double h2_;
- double vx1_;
- double vx2_;
- double vy1_;
- double vy2_;
- double x1_;
- double x2_;
- double y1_;
- double y2_;
-
- public Compute() {
- super();
- }
-
- double getQ() {
- double q1 = h1_ * getV1();
- double q2 = h2_ * getV2();
- return (q1 + q2) * CtuluLibGeometrie.getDistance(x1_, y1_, x2_, y2_) / 2;
- }
-
- double getV1() {
- return getV(vx1_, vy1_);
- }
-
- double getV2() {
- return getV(vx2_, vy2_);
- }
-
- double getV(double _vx, double _vy) {
- // le vecteur de x1 vers x2
- double vxs = (x2_ - x1_);
- double vys = (y2_ - y1_);
- double norme = Math.hypot(vxs, vys);
- // norme nulle ->pas de vitesse
- if (norme == 0) return 0;
- // le coupe v, vs doit etre dans le sens trigo
- // on normalise v
- double vx = vys / norme;
- double vy = -vxs / norme;
- return vx * _vx + vy * _vy; // /1
- }
- }
-
EfLineIntersectionsResultsBuilder res_;
/**
* L'identifiant pour la vitesse selon x.
@@ -87,22 +38,21 @@
* L'identifiant pour la hauteur d'eau.
*/
final CtuluVariable h_;
+ final EfVectorComputation calculator_;
- final Compute calculator_;
-
public EfLineFlowrateResult(EfLineIntersectionsResultsBuilder _res, final CtuluVariable _vx, final CtuluVariable _vy,
- final CtuluVariable _h) {
+ final CtuluVariable _h) {
super();
res_ = _res;
vx_ = _vx;
vy_ = _vy;
h_ = _h;
- calculator_ = new Compute();
+ calculator_ = new EfVectorComputation();
}
/**
* Calcul le d\xE9bit entre le point (_idxPtOnProfil) et (_idxPtOnProfil+1).
- *
+ *
* @param _idxPtOnProfil l'indice du point sur les intersections. Ne fait pas de calcul pour le dernier point =0
* @param _vx les vitesses selon x
* @param _vy les vitesses selon y
@@ -110,7 +60,9 @@
* @return le d\xE9bit
*/
double getQ(int _idxPtOnProfil, EfData _vx, EfData _vy, EfData _h, EfLineIntersectionsResultsI _res) {
- if (_idxPtOnProfil >= _res.getNbIntersect() - 1) return 0;
+ if (_idxPtOnProfil >= _res.getNbIntersect() - 1) {
+ return 0;
+ }
// le point 1
int idx = _idxPtOnProfil;
calculator_.x1_ = _res.getIntersect(idx).getX();
@@ -145,13 +97,17 @@
FuLog.error(_evt);
}
- if (vx == null || vy == null || h == null) return 0;
+ if (vx == null || vy == null || h == null) {
+ return 0;
+ }
double q = 0;
EfLineIntersectionsResultsI res = res_.createResults(_tidx, _prog);
ProgressionUpdater up = new ProgressionUpdater(_prog);
up.setValue(10, res.getNbIntersect() - 1);
for (int i = 0; i < res.getNbIntersect() - 1; i++) {
- if (res.isSegmentIn(i)) q += getQ(i, vx, vy, h, res);
+ if (res.isSegmentIn(i)) {
+ q += getQ(i, vx, vy, h, res);
+ }
up.majAvancement();
}
return q;
Added: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/operation/EfVectorComputation.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/operation/EfVectorComputation.java (rev 0)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/operation/EfVectorComputation.java 2012-11-05 16:21:38 UTC (rev 7860)
@@ -0,0 +1,66 @@
+/*
+ GPL 2
+ */
+package org.fudaa.dodico.ef.operation;
+
+import org.fudaa.ctulu.gis.CtuluLibGeometrie;
+
+/**
+ *
+ * @author Frederic Deniger
+ */
+public class EfVectorComputation {
+
+ /**
+ * utiliser pour calculer le d\xE9bit
+ */
+ public double h1_;
+ /**
+ * utiliser pour calculer le d\xE9bit
+ */
+ public double h2_;
+ public double vx1_;
+ public double vx2_;
+ public double vy1_;
+ public double vy2_;
+ public double x1_;
+ public double x2_;
+ public double y1_;
+ public double y2_;
+
+ public EfVectorComputation() {
+ super();
+ }
+
+ public double getQ() {
+ double q1 = h1_ * getV1();
+ double q2 = h2_ * getV2();
+ return (q1 + q2) * CtuluLibGeometrie.getDistance(x1_, y1_, x2_, y2_) / 2;
+ }
+
+ public double getV1() {
+ return getV(vx1_, vy1_);
+ }
+
+ public double getV2() {
+ return getV(vx2_, vy2_);
+ }
+
+ double getV(double _vx, double _vy) {
+ // le vecteur de x1 vers x2
+ double vxs = x2_ - x1_;
+ double vys = y2_ - y1_;
+ double norme = Math.hypot(vxs, vys);
+ // norme nulle ->pas de vitesse
+ if (norme == 0) {
+ return 0;
+ }
+ // le coupe v, vs doit etre dans le sens trigo
+ // on normalise v
+ double vx = vys / norme;
+ double vy = -vxs / norme;
+ return vx * _vx + vy * _vy; // /1
+ // /1
+ // /1
+ }
+}
Modified: trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/serafin/SerafinNewReader.java
===================================================================
--- trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/serafin/SerafinNewReader.java 2012-11-05 14:43:17 UTC (rev 7859)
+++ trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/ef/io/serafin/SerafinNewReader.java 2012-11-05 16:21:38 UTC (rev 7860)
@@ -115,7 +115,7 @@
final String titre = helper_.getStingFromBuffer(80).trim();
// on lit le titre
inter.setTitre(titre);
- if (titre != null) {
+ if (titre != null && titre.length()==80) {
int lastChar = titre.length() - 1;
xYdoublePrecision = 'D' == titre.charAt(lastChar);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|