From: <de...@us...> - 2008-10-30 17:07:53
|
Revision: 4117 http://fudaa.svn.sourceforge.net/fudaa/?rev=4117&view=rev Author: deniger Date: 2008-10-30 17:07:44 +0000 (Thu, 30 Oct 2008) Log Message: ----------- Modified Paths: -------------- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexVisitorNearestElt.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexVisitorNearestNode.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineFlowrateResult.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersection.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionsCorrectionActivity.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionsResultsMng.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectorActivity.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/h2d/reflux/H2dRefluxNodalPropertiesMng.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/telemac/io/SerafinFileFormat.java branches/Prepro-0.92-SNAPSHOT/dodico/test/org/fudaa/dodico/ef/TestJLineIntersection.java branches/Prepro-0.92-SNAPSHOT/dodico/test/org/fudaa/dodico/telemac/TestJSerafin.java branches/Prepro-0.92-SNAPSHOT/ebli/src/org/fudaa/ebli/calque/find/CalqueFindFlecheExpression.java branches/Prepro-0.92-SNAPSHOT/ebli/src/org/fudaa/ebli/geometrie/GrMorphisme.java branches/Prepro-0.92-SNAPSHOT/ebli/src/org/fudaa/ebli/geometrie/GrPoint.java branches/Prepro-0.92-SNAPSHOT/ebli/src/org/fudaa/ebli/volume/BUnivers.java Added Paths: ----------- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolator.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexHelper.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionParentDefault.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineSingleIntersectFinder.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfTrajectoireActivity.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfTrajectoireGridDataProvider.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfTrajectoireMarqueurBuilder.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfTrajectoireParameters.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfTrajectoireParametersMarqueur.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfTrajectoireResultBuilder.java Removed Paths: ------------- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolator.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolatorDefault.java branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfInterpolator.java Deleted: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolator.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolator.java 2008-10-30 17:06:38 UTC (rev 4116) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolator.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -1,22 +0,0 @@ -/* - * @creation 30 mai 07 - * @modification $Date: 2007-06-05 08:59:14 $ - * @license GNU General Public License 2 - * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne - * @mail de...@fu... - */ -package org.fudaa.dodico.ef.interpolation; - -import org.fudaa.dodico.ef.EfGridData; - -/** - * @author fred deniger - * @version $Id: EfGridDataInterpolator.java,v 1.1 2007-06-05 08:59:14 deniger Exp $ - */ -public interface EfGridDataInterpolator { - - EfGridData getGridData(); - - EfInterpolator getInterpolator(); - -} Copied: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolator.java (from rev 4018, branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfInterpolator.java) =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolator.java (rev 0) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolator.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -0,0 +1,211 @@ +/* + * @creation 30 mai 07 + * @modification $Date: 2007-06-11 13:04:06 $ + * @license GNU General Public License 2 + * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail de...@fu... + */ +package org.fudaa.dodico.ef.interpolation; + +import java.io.IOException; + +import org.fudaa.ctulu.CtuluLibGeometrie; +import org.fudaa.ctulu.CtuluVariable; +import org.fudaa.ctulu.interpolation.InterpolationVectorContainer; + +import org.fudaa.dodico.ef.EfData; +import org.fudaa.dodico.ef.EfDataInterpolationAdapter; +import org.fudaa.dodico.ef.EfElement; +import org.fudaa.dodico.ef.EfElementType; +import org.fudaa.dodico.ef.EfGridData; +import org.fudaa.dodico.ef.EfGridInterface; + +/** + * Une classe permettant d'interpoler des valeurs sur un maillage. Certaines donn\xE9es definies dans le + * InterpolationVectorContainer seront interpoler en norme,theta et non pas en vx,vy. + * + * @author fred deniger + * @version $Id: EfInterpolator.java,v 1.2 2007-06-11 13:04:06 deniger Exp $ + */ +public class EfGridDataInterpolator { + + /** + * @param _data the data to set + */ + public void setData(EfGridData _data) { + data_ = _data; + } + + private static double doInterpolate(final double _xt, final double _yt, final EfData _data, final int _ielt, + final EfGridInterface _g) { + if (_data.isElementData()) { return _data.getValue(_ielt); } + final EfElement elt = _g.getElement(_ielt); + if (elt.getDefaultType() == EfElementType.T3) { + return interpolateT3(_xt, _yt, _data, _ielt, _g); + } else if (elt.getDefaultType() == EfElementType.T6) { return doInterpolateT6(_xt, _yt, _data, _ielt, _g); } + return doInterpolateOther(_xt, _yt, _data, _ielt, _g); + } + + private static double doInterpolateOther(final double _xt, final double _yt, final EfData _data, final int _ielt, + final EfGridInterface _g) { + if (_data.isElementData()) { return _data.getValue(_ielt); } + final EfElement elt = _g.getElement(_ielt); + double num = 0; + double denom = 0; + // esp est la distance min au dessous de laquelle 2 points sont consid\xE9r\xE9s comme identiques + // on calcul les distances au carre, donc on met l'epsilon au carre + final double eps = 1E-4 * 1E-4; + for (int i = elt.getPtNb() - 1; i >= 0; i--) { + final int idx = elt.getPtIndex(i); + final double dist = CtuluLibGeometrie.getD2(_xt, _yt, _g.getPtX(idx), _g.getPtY(idx)); + // on suppose que si la distance est inf\xE9rieur au dixieme de millim\xE8tre, on prend le r\xE9sultat tel quel. + if (dist < eps) { return _data.getValue(idx); } + num += _data.getValue(idx) / dist; + denom += 1 / dist; + } + if (denom == 0) { throw new IllegalAccessError("ne devrait jamais arriv\xE9"); } + return num / denom; + } + + private static double doInterpolateT6(final double _xt, final double _yt, final EfData _data, final int _ielt, + final EfGridInterface _g) { + if (_data.isElementData()) { return _data.getValue(_ielt); } + final EfElement elt = _g.getElement(_ielt); + final int i1 = elt.getPtIndex(0); + final int i2 = elt.getPtIndex(2); + final int i3 = elt.getPtIndex(4); + return doInterpolateTriangle(_xt, _yt, _data.getValue(i1), _data.getValue(i2), _data.getValue(i3), i1, i2, i3, _g); + } + + private static double doInterpolateTriangle(final double _xt, final double _yt, final double _v1, final double _v2, + final double _v3, final int _pt1, final int _pt2, final int _pt3, final EfGridInterface _g) { + final double a1 = (_g.getPtX(_pt3) - _g.getPtX(_pt2)) * (_yt - _g.getPtY(_pt2)) + - (_g.getPtY(_pt3) - _g.getPtY(_pt2)) * (_xt - _g.getPtX(_pt2)); + final double a2 = (_g.getPtX(_pt1) - _g.getPtX(_pt3)) * (_yt - _g.getPtY(_pt3)) + - (_g.getPtY(_pt1) - _g.getPtY(_pt3)) * (_xt - _g.getPtX(_pt3)); + final double a3 = (_g.getPtX(_pt2) - _g.getPtX(_pt1)) * (_yt - _g.getPtY(_pt1)) + - (_g.getPtY(_pt2) - _g.getPtY(_pt1)) * (_xt - _g.getPtX(_pt1)); + final double cmax = (_g.getPtX(_pt3) - _g.getPtX(_pt2)) * (_g.getPtY(_pt1) - _g.getPtY(_pt2)) + - (_g.getPtY(_pt3) - _g.getPtY(_pt2)) * (_g.getPtX(_pt1) - _g.getPtX(_pt2)); + return (a1 * _v1 + a2 * _v2 + a3 * _v3) / cmax; + } + + private static double getMid(double _d1, double _d2, double _coef1, double _coef2) { + return (_d1 * _coef1 + _d2 * _coef2); + } + + public static double interpolate(int _idxElt, double _x, double _y, EfData _vxData, EfData _vyData, boolean _isVx, + EfGridInterface _grid) { + EfData norme = new EfDataInterpolationAdapter.Norm(_vxData, _vyData); + EfData theta = new EfDataInterpolationAdapter.Theta(_vxData, _vyData); + double n = doInterpolate(_x, _y, norme, _idxElt, _grid); + double t = doInterpolate(_x, _y, theta, _idxElt, _grid); + return _isVx ? InterpolationVectorContainer.getVx(n, t) : InterpolationVectorContainer.getVy(n, t); + } + + public static double interpolateDangerous(int _idxElt, double _x, double _y, EfData _value, EfGridInterface _grid) { + return doInterpolate(_x, _y, _value, _idxElt, _grid); + } + + private static double interpolateT3(final double _xt, final double _yt, final EfData _data, final int _ielt, + final EfGridInterface _g) { + if (_data.isElementData()) { return _data.getValue(_ielt); } + final EfElement elt = _g.getElement(_ielt); + final int i1 = elt.getPtIndex(0); + final int i2 = elt.getPtIndex(1); + final int i3 = elt.getPtIndex(2); + return doInterpolateTriangle(_xt, _yt, _data.getValue(i1), _data.getValue(i2), _data.getValue(i3), i1, i2, i3, _g); + + } + + EfGridData data_; + + final InterpolationVectorContainer vect_; + + public EfGridDataInterpolator(final EfGridData _data) { + this(_data, null); + } + + public EfGridDataInterpolator(final EfGridData _data, final InterpolationVectorContainer _vect) { + super(); + data_ = _data; + vect_ = _vect; + } + + /** + * @return the data + */ + public EfGridData getData() { + return data_; + } + + public double getMidValue(int _pt1, int _pt2, CtuluVariable _v, int _tIdx) throws IOException { + return getValue(_pt1, _pt2, 0.5, 0.5, _v, _tIdx); + + } + + public double getValue(int _pt1, int _pt2, double _coef1, double _coef2, CtuluVariable _v, int _tIdx) + throws IOException { + if (isVect(_v)) { + + CtuluVariable vx = vect_.getVxSafe(_v); + CtuluVariable vy = vect_.getVySafe(_v);; + double vx1 = data_.getData(vx, _tIdx, _pt1); + double vx2 = data_.getData(vx, _tIdx, _pt2); + double vy1 = data_.getData(vy, _tIdx, _pt1); + double vy2 = data_.getData(vy, _tIdx, _pt2); + double n = getMid(InterpolationVectorContainer.getNorme(vx1, vy1), InterpolationVectorContainer + .getNorme(vx2, vy2), _coef1, _coef2); + double t = getMid(InterpolationVectorContainer.getTheta(vx1, vy1), InterpolationVectorContainer + .getTheta(vx2, vy2), _coef1, _coef2); + return vect_.isVx(_v) ? InterpolationVectorContainer.getVx(n, t) : InterpolationVectorContainer.getVy(n, t); + } + return getMid(data_.getData(_v, _tIdx, _pt1), data_.getData(_v, _tIdx, _pt2), _coef1, _coef2); + + } + + public InterpolationVectorContainer getVect() { + return vect_; + } + + public double interpolate(int _idxElt, double _x, double _y, CtuluVariable _value, int _tIdx) throws IOException { + EfData data = data_.getData(_value, _tIdx); + return interpolateFromValue(_idxElt, _x, _y, _value, data, _tIdx); + + } + + public double interpolateFromValue(int _idxElt, double _x, double _y, CtuluVariable _value, EfData _data, int _tIdx) + throws IOException { + EfData data = _data; + if (!data.isElementData() && isVect(_value)) { + CtuluVariable vx = null; + CtuluVariable vy = null; + EfData vxData = null; + EfData vyData = null; + boolean isVx = true; + if (vect_.isVx(_value)) { + vx = _value; + vy = vect_.getVy(vx); + vxData = data; + vyData = data_.getData(vy, _tIdx); + } else { + isVx = false; + vy = _value; + vx = vect_.getVx(vy); + vyData = data; + vxData = data_.getData(vx, _tIdx); + } + return interpolate(_idxElt, _x, _y, vxData, vyData, isVx, data_.getGrid()); + + // double norme=InterpolationVectorContainer.getNorme(, _vy) + + } + return doInterpolate(_x, _y, data, _idxElt, data_.getGrid()); + + } + + protected boolean isVect(CtuluVariable _o) { + return vect_ != null && vect_.isVect(_o); + } + +} Property changes on: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolator.java ___________________________________________________________________ Added: svn:mergeinfo + Deleted: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolatorDefault.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolatorDefault.java 2008-10-30 17:06:38 UTC (rev 4116) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfGridDataInterpolatorDefault.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -1,34 +0,0 @@ -/* - * @creation 30 mai 07 - * @modification $Date: 2007-06-05 08:59:14 $ - * @license GNU General Public License 2 - * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne - * @mail de...@fu... - */ -package org.fudaa.dodico.ef.interpolation; - -import org.fudaa.dodico.ef.EfGridData; - -/** - * @author fred deniger - * @version $Id: EfGridDataInterpolatorDefault.java,v 1.1 2007-06-05 08:59:14 deniger Exp $ - */ -public class EfGridDataInterpolatorDefault implements EfGridDataInterpolator { - final EfGridData data_; - final EfInterpolator interpolator_; - - public EfGridDataInterpolatorDefault(final EfGridData _data, final EfInterpolator _interpolator) { - super(); - data_ = _data; - interpolator_ = _interpolator; - } - - public EfGridData getGridData() { - return data_; - } - - public EfInterpolator getInterpolator() { - return interpolator_; - } - -} Deleted: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfInterpolator.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfInterpolator.java 2008-10-30 17:06:38 UTC (rev 4116) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/interpolation/EfInterpolator.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -1,203 +0,0 @@ -/* - * @creation 30 mai 07 - * @modification $Date: 2007-06-11 13:04:06 $ - * @license GNU General Public License 2 - * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne - * @mail de...@fu... - */ -package org.fudaa.dodico.ef.interpolation; - -import java.io.IOException; - -import org.fudaa.ctulu.CtuluLibGeometrie; -import org.fudaa.ctulu.CtuluVariable; -import org.fudaa.ctulu.interpolation.InterpolationVectorContainer; - -import org.fudaa.dodico.ef.EfData; -import org.fudaa.dodico.ef.EfDataInterpolationAdapter; -import org.fudaa.dodico.ef.EfElement; -import org.fudaa.dodico.ef.EfElementType; -import org.fudaa.dodico.ef.EfGridData; -import org.fudaa.dodico.ef.EfGridInterface; - -/** - * @author fred deniger - * @version $Id: EfInterpolator.java,v 1.2 2007-06-11 13:04:06 deniger Exp $ - */ -public class EfInterpolator { - - final InterpolationVectorContainer vect_; - final EfGridData data_; - - public EfInterpolator(final EfGridData _data, final InterpolationVectorContainer _vect) { - super(); - data_ = _data; - vect_ = _vect; - } - - public InterpolationVectorContainer getVect() { - return vect_; - } - - protected boolean isVect(CtuluVariable _o) { - return vect_ != null && vect_.isVect(_o); - } - - public static double interpolate(int _idxElt, double _x, double _y, EfData _vxData, EfData _vyData, boolean _isVx, - EfGridInterface _grid) { - EfData norme = new EfDataInterpolationAdapter.Norm(_vxData, _vyData); - EfData theta = new EfDataInterpolationAdapter.Theta(_vxData, _vyData); - double n = doInterpolate(_x, _y, norme, _idxElt, _grid); - double t = doInterpolate(_x, _y, theta, _idxElt, _grid); - return _isVx ? InterpolationVectorContainer.getVx(n, t) : InterpolationVectorContainer.getVy(n, t); - } - - public static double interpolateDangerous(int _idxElt, double _x, double _y, EfData _value, EfGridInterface _grid) { - return doInterpolate(_x, _y, _value, _idxElt, _grid); - } - - public double getValue(int _pt1, int _pt2, double _coef1, double _coef2, CtuluVariable _v, int _tIdx) - throws IOException { - if (isVect(_v)) { - - CtuluVariable vx = vect_.getVxSafe(_v); - CtuluVariable vy = vect_.getVySafe(_v);; - double vx1 = data_.getData(vx, _tIdx, _pt1); - double vx2 = data_.getData(vx, _tIdx, _pt2); - double vy1 = data_.getData(vy, _tIdx, _pt1); - double vy2 = data_.getData(vy, _tIdx, _pt2); - double n = getMid(InterpolationVectorContainer.getNorme(vx1, vy1), InterpolationVectorContainer - .getNorme(vx2, vy2), _coef1, _coef2); - double t = getMid(InterpolationVectorContainer.getTheta(vx1, vy1), InterpolationVectorContainer - .getTheta(vx2, vy2), _coef1, _coef2); - return vect_.isVx(_v) ? InterpolationVectorContainer.getVx(n, t) : InterpolationVectorContainer.getVy(n, t); - } - return getMid(data_.getData(_v, _tIdx, _pt1), data_.getData(_v, _tIdx, _pt2), _coef1, _coef2); - - } - - public double getMidValue(int _pt1, int _pt2, CtuluVariable _v, int _tIdx) throws IOException { - return getValue(_pt1, _pt2, 0.5, 0.5, _v, _tIdx); - - } - - private static double getMid(double _d1, double _d2, double _coef1, double _coef2) { - return (_d1 * _coef1 + _d2 * _coef2); - } - - public double interpolate(int _idxElt, double _x, double _y, CtuluVariable _value, int _tIdx) throws IOException { - EfData data = data_.getData(_value, _tIdx); - return interpolateFromValue(_idxElt, _x, _y, _value, data, _tIdx); - - } - - public double interpolateFromValue(int _idxElt, double _x, double _y, CtuluVariable _value, EfData _data, int _tIdx) - throws IOException { - EfData data = _data; - if (!data.isElementData() && isVect(_value)) { - CtuluVariable vx = null; - CtuluVariable vy = null; - EfData vxData = null; - EfData vyData = null; - boolean isVx = true; - if (vect_.isVx(_value)) { - vx = _value; - vy = vect_.getVy(vx); - vxData = data; - vyData = data_.getData(vy, _tIdx); - } else { - isVx = false; - vy = _value; - vx = vect_.getVx(vy); - vyData = data; - vxData = data_.getData(vx, _tIdx); - } - return interpolate(_idxElt, _x, _y, vxData, vyData, isVx, data_.getGrid()); - - // double norme=InterpolationVectorContainer.getNorme(, _vy) - - } - return doInterpolate(_x, _y, data, _idxElt, data_.getGrid()); - - } - - private static double interpolateT3(final double _xt, final double _yt, final EfData _data, final int _ielt, - final EfGridInterface _g) { - if (_data.isElementData()) { - return _data.getValue(_ielt); - } - final EfElement elt = _g.getElement(_ielt); - final int i1 = elt.getPtIndex(0); - final int i2 = elt.getPtIndex(1); - final int i3 = elt.getPtIndex(2); - return doInterpolateTriangle(_xt, _yt, _data.getValue(i1), _data.getValue(i2), _data.getValue(i3), i1, i2, i3, _g); - - } - - private static double doInterpolateT6(final double _xt, final double _yt, final EfData _data, final int _ielt, - final EfGridInterface _g) { - if (_data.isElementData()) { - return _data.getValue(_ielt); - } - final EfElement elt = _g.getElement(_ielt); - final int i1 = elt.getPtIndex(0); - final int i2 = elt.getPtIndex(2); - final int i3 = elt.getPtIndex(4); - return doInterpolateTriangle(_xt, _yt, _data.getValue(i1), _data.getValue(i2), _data.getValue(i3), i1, i2, i3, _g); - } - - private static double doInterpolate(final double _xt, final double _yt, final EfData _data, final int _ielt, - final EfGridInterface _g) { - if (_data.isElementData()) { - return _data.getValue(_ielt); - } - final EfElement elt = _g.getElement(_ielt); - if (elt.getDefaultType() == EfElementType.T3) { - return interpolateT3(_xt, _yt, _data, _ielt, _g); - } else if (elt.getDefaultType() == EfElementType.T6) { - return doInterpolateT6(_xt, _yt, _data, _ielt, _g); - } - return doInterpolateOther(_xt, _yt, _data, _ielt, _g); - } - - private static double doInterpolateOther(final double _xt, final double _yt, final EfData _data, final int _ielt, - final EfGridInterface _g) { - if (_data.isElementData()) { - return _data.getValue(_ielt); - } - final EfElement elt = _g.getElement(_ielt); - double num = 0; - double denom = 0; - // esp est la distance min au dessous de laquelle 2 points sont consid\xE9r\xE9s comme identiques - // on calcul les distances au carre, donc on met l'epsilon au carre - final double eps = 1E-4 * 1E-4; - for (int i = elt.getPtNb() - 1; i >= 0; i--) { - final int idx = elt.getPtIndex(i); - final double dist = CtuluLibGeometrie.getD2(_xt, _yt, _g.getPtX(idx), _g.getPtY(idx)); - // on suppose que si la distance est inf\xE9rieur au dixieme de millim\xE8tre, on prend le r\xE9sultat tel quel. - if (dist < eps) { - return _data.getValue(idx); - } - num += _data.getValue(idx) / dist; - denom += 1 / dist; - } - if (denom == 0) { - throw new IllegalAccessError("ne devrait jamais arriv\xE9"); - } - return num / denom; - } - - private static double doInterpolateTriangle(final double _xt, final double _yt, final double _v1, final double _v2, - final double _v3, final int _pt1, final int _pt2, final int _pt3, final EfGridInterface _g) { - final double a1 = (_g.getPtX(_pt3) - _g.getPtX(_pt2)) * (_yt - _g.getPtY(_pt2)) - - (_g.getPtY(_pt3) - _g.getPtY(_pt2)) * (_xt - _g.getPtX(_pt2)); - final double a2 = (_g.getPtX(_pt1) - _g.getPtX(_pt3)) * (_yt - _g.getPtY(_pt3)) - - (_g.getPtY(_pt1) - _g.getPtY(_pt3)) * (_xt - _g.getPtX(_pt3)); - final double a3 = (_g.getPtX(_pt2) - _g.getPtX(_pt1)) * (_yt - _g.getPtY(_pt1)) - - (_g.getPtY(_pt2) - _g.getPtY(_pt1)) * (_xt - _g.getPtX(_pt1)); - final double cmax = (_g.getPtX(_pt3) - _g.getPtX(_pt2)) * (_g.getPtY(_pt1) - _g.getPtY(_pt2)) - - (_g.getPtY(_pt3) - _g.getPtY(_pt2)) * (_g.getPtX(_pt1) - _g.getPtX(_pt2)); - return (a1 * _v1 + a2 * _v2 + a3 * _v3) / cmax; - } - -} Added: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexHelper.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexHelper.java (rev 0) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexHelper.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -0,0 +1,63 @@ +/** + * Licence GPL + * Copyright Genesis + */ +package org.fudaa.dodico.ef.operation; + +import org.fudaa.ctulu.CtuluListSelection; +import org.fudaa.ctulu.ProgressionInterface; +import org.fudaa.dodico.ef.EfGridInterface; + +/** + * @author deniger + */ +public final class EfIndexHelper { + + private EfIndexHelper() { + + } + + /** + * @param _grid + * @param _x le x + * @param _y le y + * @param _prog progression + * @return l'indice de l'element englobant ou -1 si non trouve + */ + public static int getElementEnglobant(EfGridInterface _grid, double _x, double _y, ProgressionInterface _prog) { + if (_grid.getIndex() == null) { + _grid.createIndexRegular(_prog); + } + final EfIndexVisitorNearestElt visitor = new EfIndexVisitorNearestElt(_grid, _x, _y, 0); + _grid.getIndex().query(EfIndexVisitorNearestNode.getEnvelope(_x, _y, 0), visitor); + return visitor.isIn() ? visitor.getSelected() : -1; + } + + /** + * @param _grid + * @param _x le x + * @param _y le y + * @param _tolerance la tolerance pour la recherche + * @param _prog la barre de progression + * @return la selection trouvee + */ + public static CtuluListSelection getNearestNode(EfGridInterface _grid, double _x, double _y, double _tolerance, + ProgressionInterface _prog) { + if (_grid.getIndex() == null) { + _grid.createIndexRegular(_prog); + } + final EfIndexVisitorNearestNode visitor = new EfIndexVisitorNearestNode(_grid, _x, _y, _tolerance); + _grid.getIndex().query(EfIndexVisitorNearestNode.getEnvelope(_x, _y, _tolerance), visitor); + return visitor.getSelection(); + } + + public static CtuluListSelection getNearestElement(EfGridInterface _grid, double _x, double _y, double _tolerance, + ProgressionInterface _prog) { + if (_grid.getIndex() == null) { + _grid.createIndexRegular(_prog); + } + final EfIndexVisitorNearestElt visitor = new EfIndexVisitorNearestElt(_grid, _x, _y, _tolerance); + _grid.getIndex().query(EfIndexVisitorNearestNode.getEnvelope(_x, _y, _tolerance), visitor); + return visitor.getSelection(); + } +} Modified: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexVisitorNearestElt.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexVisitorNearestElt.java 2008-10-30 17:06:38 UTC (rev 4116) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexVisitorNearestElt.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -25,7 +25,7 @@ private int eltSelected_ = -1; private boolean isIn_; private double minDist_ = -1; - private final double maxSquareDistance_; + // private final double maxSquareDistance_; private final double maxDistance_; private final double x_; private final double y_; @@ -41,7 +41,7 @@ super(); grid_ = _grid; maxDistance_ = _dist; - maxSquareDistance_ = _dist < 0 ? -1D : (_dist * _dist); + // maxSquareDistance_ = _dist < 0 ? -1D : (_dist * _dist); x_ = _x; y_ = _y; } @@ -59,9 +59,9 @@ isIn_ = true; eltSelected_ = _idxElt; } else { - final double dist = el.getDistAuCarre(x_, y_, grid_); - // si maxSquareDistance_ est n\xE9gatif, l'utilisateur ne veut pas prendre en compte la distance max. - if ((maxSquareDistance_ < 0 || dist <= maxSquareDistance_) && (eltSelected_ < 0 || dist < minDist_)) { + final double dist = el.getDist(x_, y_, grid_); + // si maxDistance_ est n\xE9gatif, l'utilisateur ne veut pas prendre en compte la distance max. + if ((maxDistance_ < 0 || dist <= maxDistance_) && (eltSelected_ < 0 || dist < minDist_)) { minDist_ = dist; eltSelected_ = _idxElt; } @@ -87,7 +87,7 @@ } public double getMinDist() { - return Math.sqrt(minDist_); + return minDist_; } public int getSelected() { Modified: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexVisitorNearestNode.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexVisitorNearestNode.java 2008-10-30 17:06:38 UTC (rev 4116) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfIndexVisitorNearestNode.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -32,7 +32,7 @@ private final EfGridInterface grid_; private int selected_ = -1; private double minDist_ = -1; - private final double maxSquareDistance_; +// private final double maxSquareDistance_; private final double maxDistance_; private final double x_; @@ -48,7 +48,7 @@ super(); grid_ = _grid; maxDistance_ = _maxDist; - maxSquareDistance_ = _maxDist < 0 ? -1D : (_maxDist * _maxDist); +// maxSquareDistance_ = _maxDist < 0 ? -1D : (_maxDist * _maxDist); x_ = _x; y_ = _y; } @@ -63,8 +63,8 @@ final EfElement el = grid_.getElement(_idxElt); for (int i = el.getPtNb() - 1; i >= 0; i--) { final int idx = el.getPtIndex(i); - final double dist = CtuluLibGeometrie.getD2(x_, y_, grid_.getPtX(idx), grid_.getPtY(idx)); - if ((maxSquareDistance_ < 0 || dist <= maxSquareDistance_) && (selected_ < 0 || dist < minDist_)) { + final double dist = CtuluLibGeometrie.getDistance(x_, y_, grid_.getPtX(idx), grid_.getPtY(idx)); + if ((maxDistance_ < 0 || dist <= maxDistance_) && (selected_ < 0 || dist < minDist_)) { minDist_ = dist; selected_ = idx; } @@ -73,7 +73,7 @@ } public double getMinDist() { - return Math.sqrt(minDist_); + return minDist_; } public int getNodeSelected() { Modified: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineFlowrateResult.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineFlowrateResult.java 2008-10-30 17:06:38 UTC (rev 4116) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineFlowrateResult.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -63,7 +63,7 @@ // le vecteur de x1 vers x2 double vxs = (x2_ - x1_); double vys = (y2_ - y1_); - double norme = Math.sqrt(vxs * vxs + vys * vys); + 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 @@ -123,8 +123,8 @@ idx++; calculator_.x2_ = _res.getIntersect(idx).getX(); calculator_.y2_ = _res.getIntersect(idx).getY(); -// n = _res.getIntersect(idx).getValueBadInterpolation(_vx); -// t = _res.getIntersect(idx).getValueBadInterpolation(_vy); + // n = _res.getIntersect(idx).getValueBadInterpolation(_vx); + // t = _res.getIntersect(idx).getValueBadInterpolation(_vy); calculator_.vx2_ = _res.getIntersect(idx).getValueBadInterpolation(_vx); calculator_.vy2_ = _res.getIntersect(idx).getValueBadInterpolation(_vy); calculator_.h2_ = _res.getIntersect(idx).getValueBadInterpolation(_h); Modified: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersection.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersection.java 2008-10-30 17:06:38 UTC (rev 4116) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersection.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -22,7 +22,7 @@ import org.fudaa.dodico.ef.EfGridInterface; import org.fudaa.dodico.ef.EfNeighborMesh; import org.fudaa.dodico.ef.interpolation.EfGridDataInterpolator; -import org.fudaa.dodico.ef.interpolation.EfInterpolator; +import org.fudaa.dodico.ef.interpolation.EfGridDataInterpolator; public abstract class EfLineIntersection implements EfLineIntersectionI { @@ -76,16 +76,16 @@ if (parent_ == null) throw new IllegalAccessError("pas de parent"); EfGridDataInterpolator data = parent_.getGridData(); try { - if (data.getGridData().isElementVar(_var)) { + if (data.getData().isElementVar(_var)) { buildAdjacentMeshes(); - if (adjacentMesh_[1] < 0) return data.getGridData().getData(_var, _tIdx, adjacentMesh_[0]); - return data.getInterpolator().getMidValue(adjacentMesh_[0], adjacentMesh_[1], _var, _tIdx); + if (adjacentMesh_[1] < 0) return data.getData().getData(_var, _tIdx, adjacentMesh_[0]); + return data.getMidValue(adjacentMesh_[0], adjacentMesh_[1], _var, _tIdx); } double d1 = getD1(); double d2 = getD2(); - return data.getInterpolator().getValue(i1_, i2_, d1 / (d1 + d2), d2 / (d1 + d2), _var, _tIdx); + return data.getValue(i1_, i2_, d1 / (d1 + d2), d2 / (d1 + d2), _var, _tIdx); } catch (IllegalAccessError _evt) { FuLog.error(_evt); @@ -305,9 +305,9 @@ if (!isRealIntersection()) throw new IllegalAccessError("non accessible !"); EfGridDataInterpolator data = parent_.getGridData(); try { - if (data.getGridData().isElementVar(_var)) return data.getGridData().getData(_var, _tIdx, ielt_); + if (data.getData().isElementVar(_var)) return data.getData().getData(_var, _tIdx, ielt_); - return data.getInterpolator().interpolate(ielt_, x_, y_, _var, _tIdx); + return data.interpolate(ielt_, x_, y_, _var, _tIdx); } catch (IOException _evt) { FuLog.error(_evt); } @@ -317,7 +317,7 @@ public double getValueBadInterpolation(EfData _d) { if (!isRealIntersection()) throw new IllegalAccessError("non accessible !"); if (_d.isElementData()) return _d.getValue(ielt_); - return EfInterpolator.interpolateDangerous(ielt_, x_, y_, _d, parent_.getGrid()); + return EfGridDataInterpolator.interpolateDangerous(ielt_, x_, y_, _d, parent_.getGrid()); } public double getX() { @@ -364,12 +364,12 @@ public double getValue(CtuluVariable _var, int _tIdx) { EfGridDataInterpolator data = parent_.getGridData(); try { - if (data.getGridData().isElementVar(_var)) { + if (data.getData().isElementVar(_var)) { parent_.buildNeighbor(null); return parent_.getNeighbor().getAverageForNode(_var, ptIdx_, _tIdx, parent_.getGridData()); } - return data.getGridData().getData(_var, _tIdx, ptIdx_); + return data.getData().getData(_var, _tIdx, ptIdx_); } catch (IllegalAccessError _evt) { FuLog.error(_evt); Added: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionParentDefault.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionParentDefault.java (rev 0) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionParentDefault.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -0,0 +1,42 @@ +/** + * Licence GPL + * Copyright Genesis + */ +package org.fudaa.dodico.ef.operation; + +import org.fudaa.ctulu.ProgressionInterface; +import org.fudaa.dodico.ef.EfGridInterface; +import org.fudaa.dodico.ef.EfNeighborMesh; +import org.fudaa.dodico.ef.interpolation.EfGridDataInterpolator; + +public class EfLineIntersectionParentDefault implements EfLineIntersectionParent { + + final EfGridDataInterpolator data_; + + protected EfLineIntersectionParentDefault(final EfGridDataInterpolator _interpolator) { + data_ = _interpolator; + + } + + public void buildNeighbor(ProgressionInterface _prog) { + EfGridInterface grid = data_.getData().getGrid(); + EfNeighborMesh neighbor = grid.getNeighbors(); + if (neighbor == null) { + grid.computeNeighbord(_prog, null); + } + + } + + public EfGridInterface getGrid() { + return data_.getData().getGrid(); + } + + public EfGridDataInterpolator getGridData() { + return data_; + } + + public EfNeighborMesh getNeighbor() { + return data_.getData().getGrid().getNeighbors(); + } + +} \ No newline at end of file Modified: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionsCorrectionActivity.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionsCorrectionActivity.java 2008-10-30 17:06:38 UTC (rev 4116) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionsCorrectionActivity.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -12,6 +12,7 @@ import java.util.BitSet; import java.util.List; +import org.fudaa.ctulu.CtuluActivity; import org.fudaa.ctulu.ProgressionInterface; import org.fudaa.ctulu.ProgressionUpdater; @@ -19,10 +20,17 @@ * @author fred deniger * @version $Id: EfLineIntersectionsCorrectionActivity.java,v 1.1 2007-06-13 12:55:42 deniger Exp $ */ -public class EfLineIntersectionsCorrectionActivity { +public class EfLineIntersectionsCorrectionActivity implements CtuluActivity { + private boolean stop_; + + public void stop() { + stop_ = true; + } + public EfLineIntersectionsResultsI correct(EfLineIntersectionsResultsI _res, EfLineIntersectionsCorrectionTester _tester, int _tidx, ProgressionInterface _prog) { + stop_ = false; if (_tester == null || _res == null || _res.isEmpty()) return _res; int nbNew = _res.getNbIntersect() + 15; BitSet isOut = new BitSet(nbNew); @@ -35,6 +43,7 @@ destIntersection.add(_res.getIntersect(0)); // on parcourt les segment for (int i = 0; i < nbSeg; i++) { + if (stop_) return null; // le tester va ajouter des intersections si n\xE9cessaire: // on ne fait le test que pour les segments internes. boolean isSegmentOut = _res.isSegmentOut(i); @@ -68,6 +77,7 @@ .toArray(new EfLineIntersection[destIntersection.size()]), isOut); } + private static class AdapterResults implements EfLineIntersectionsResultsI { final EfLineIntersectionsResultsI res_; final EfLineIntersection[] inters_; Modified: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionsResultsMng.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionsResultsMng.java 2008-10-30 17:06:38 UTC (rev 4116) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectionsResultsMng.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -145,7 +145,7 @@ } public void buildNeighbor(final ProgressionInterface _prog) { - neighbor_ = EfNeighborMesh.compute(grid_.getGridData().getGrid(), _prog); + neighbor_ = EfNeighborMesh.compute(grid_.getData().getGrid(), _prog); } public EfLineIntersectionsResultsBuilder createBuilder(EfLineIntersectionsCorrectionTester _tester) { @@ -190,7 +190,7 @@ } public EfGridInterface getGrid() { - return grid_.getGridData().getGrid(); + return grid_.getData().getGrid(); } public EfGridDataInterpolator getGridData() { Modified: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectorActivity.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectorActivity.java 2008-10-30 17:06:38 UTC (rev 4116) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineIntersectorActivity.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -16,14 +16,6 @@ import java.util.SortedSet; import java.util.TreeSet; -import com.vividsolutions.jts.algorithm.LineIntersector; -import com.vividsolutions.jts.algorithm.PointInRing; -import com.vividsolutions.jts.algorithm.RobustLineIntersector; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.Envelope; -import com.vividsolutions.jts.geom.LineString; -import com.vividsolutions.jts.geom.PrecisionModel; - import org.fudaa.ctulu.CtuluActivity; import org.fudaa.ctulu.CtuluLibArray; import org.fudaa.ctulu.CtuluLibGeometrie; @@ -33,7 +25,6 @@ import org.fudaa.ctulu.gis.GISLib; import org.fudaa.ctulu.gis.GISPolygone; import org.fudaa.ctulu.interpolation.InterpolationVectorContainer; - import org.fudaa.dodico.commun.DodicoLib; import org.fudaa.dodico.ef.EfElement; import org.fudaa.dodico.ef.EfGridData; @@ -41,12 +32,18 @@ import org.fudaa.dodico.ef.EfIndexInterface; import org.fudaa.dodico.ef.EfNeighborMesh; import org.fudaa.dodico.ef.interpolation.EfGridDataInterpolator; -import org.fudaa.dodico.ef.interpolation.EfGridDataInterpolatorDefault; -import org.fudaa.dodico.ef.interpolation.EfInterpolator; import org.fudaa.dodico.ef.operation.EfLineIntersection.ItemEdge; import org.fudaa.dodico.ef.operation.EfLineIntersection.ItemNode; import org.fudaa.dodico.ef.operation.EfLineIntersectionsResultsMng.DistComparator; +import com.vividsolutions.jts.algorithm.LineIntersector; +import com.vividsolutions.jts.algorithm.PointInRing; +import com.vividsolutions.jts.algorithm.RobustLineIntersector; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Envelope; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.PrecisionModel; + /** * @author fred deniger * @version $Id: EfLineIntersectorActivity.java,v 1.5 2007-06-20 12:21:53 deniger Exp $ @@ -72,9 +69,7 @@ } void addPt(int _idx) { - if (isComplete()) { - throw new IllegalAccessError("on doit jamais arriv\xE9 ici !"); - } + if (isComplete()) { throw new IllegalAccessError("on doit jamais arriv\xE9 ici !"); } if (!issetItem1()) { item1_ = new ItemNode(_idx); item1_.setParent(parent_); @@ -128,29 +123,24 @@ final TempResult tmp_ = new TempResult(this); - public EfLineIntersectorActivity(EfGridData _grid, EfInterpolator _inter) { - this(new EfGridDataInterpolatorDefault(_grid, _inter)); - - } - /** * @param _grid * @param _vects peut etre null */ public EfLineIntersectorActivity(EfGridData _grid, InterpolationVectorContainer _vects) { - this(new EfGridDataInterpolatorDefault(_grid, new EfInterpolator(_grid, _vects))); + this(new EfGridDataInterpolator(_grid, _vects)); } - + public EfLineIntersectorActivity(EfGridData _grid) { - this(new EfGridDataInterpolatorDefault(_grid, new EfInterpolator(_grid, null))); + this(new EfGridDataInterpolator(_grid, null)); } public EfLineIntersectorActivity(EfGridDataInterpolator _grid) { super(); gridData_ = _grid; - grid_ = gridData_.getGridData().getGrid(); + grid_ = gridData_.getData().getGrid(); intersector_ = new RobustLineIntersector(); // mm intersector_.setPrecisionModel(new PrecisionModel(1E4)); @@ -257,19 +247,13 @@ } } - protected void addIntersectionForSegExtremite(List _res, double _x, double _y, EfIndexVisitorHashSet _eltSelected) { + public void addIntersectionForSegExtremite(List _res, double _x, double _y, EfIndexVisitorHashSet _eltSelected) { final int startElt = getContainingElement(_x, _y, _eltSelected.getIterator()); EfLineIntersection.ItemInitial init = new EfLineIntersection.ItemInitial(this); if (startElt >= 0) { EfElement elt = grid_.getElement(startElt); - int idxSelected = -1; double tolerance = getTolerance(); - for (int i = elt.getPtNb() - 1; i >= 0 && idxSelected < 0; i--) { - final int idx = elt.getPtIndex(i); - if (CtuluLibGeometrie.getDistance(_x, _y, grid_.getPtX(idx), grid_.getPtY(idx)) < tolerance) { - idxSelected = idx; - } - } + int idxSelected = getSelectedNodeIdx(_x, _y, elt, tolerance); if (idxSelected >= 0) { init.item1_ = new EfLineIntersection.ItemNode(idxSelected); } else { @@ -297,19 +281,12 @@ _res.add(init); } + private int getSelectedNodeIdx(double _x, double _y, EfElement elt, double tolerance) { + return EfLineSingleIntersectFinder.getSelectedNodeIdx(grid_, _x, _y, elt, tolerance); + } + protected int getContainingElement(double _x, double _y, TIntIterator _it) { - EfIndexVisitorNearestElt visitor = new EfIndexVisitorNearestElt(grid_, _x, _y, 1e-4); - while (_it.hasNext()) { - visitor.visitItem(_it.next()); - } - int idx = visitor.getSelected(); - // un element proche a \xE9t\xE9 trouv\xE9 mais le point (_x,_y) n'appartient pas \xE0 ce point - if (idx >= 0 && !visitor.isIn()) { - // on tol\xE8re une erreur de 1E-3: si la distance entre l'element et le point est inferieur a 1E-3 on renvoie quand - // meme cet element - idx = (grid_.getElement(idx).getDist(_x, _y, grid_) < getTolerance()) ? idx : -1; - } - return idx; + return EfLineSingleIntersectFinder.getContainingElement(grid_, _x, _y, _it, getTolerance()); } Added: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineSingleIntersectFinder.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineSingleIntersectFinder.java (rev 0) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfLineSingleIntersectFinder.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -0,0 +1,101 @@ +/** + * Licence GPL + * Copyright Genesis + */ +package org.fudaa.dodico.ef.operation; + +import gnu.trove.TIntIterator; + +import org.fudaa.ctulu.CtuluLibGeometrie; +import org.fudaa.ctulu.ProgressionInterface; +import org.fudaa.dodico.ef.EfElement; +import org.fudaa.dodico.ef.EfGridInterface; + +/** + * @author deniger + */ +public class EfLineSingleIntersectFinder { + EfIndexVisitorHashSet _eltSelected = new EfIndexVisitorHashSet(); + + EfGridInterface grid_; + + double tolerance_ = 1E-3; + + public EfLineIntersection findIntersectionFor(double _x, double _y, ProgressionInterface _prog) { + final int startElt = EfIndexHelper.getElementEnglobant(grid_, _x, _y, _prog); + if (startElt >= 0) { + EfElement elt = grid_.getElement(startElt); + double tolerance = getTolerance(); + int idxSelected = getSelectedNodeIdx(_x, _y, elt); + if (idxSelected >= 0) { + return new EfLineIntersection.ItemNode(idxSelected); + } else { + // sur une arete ? + for (int i = 0; i < elt.getNbEdge(); i++) { + int i1 = elt.getEdgePt1(i); + int i2 = elt.getEdgePt2(i); + if (CtuluLibGeometrie.distanceFromSegment(grid_.getPtX(i1), grid_.getPtY(i1), grid_.getPtX(i2), grid_ + .getPtY(i2), _x, _y) <= tolerance) { return new EfLineIntersection.ItemEdge(i1, i2, _x, _y); } + } + // pas une arete + return new EfLineIntersection.ItemMesh(startElt, _x, _y); + } + + } else { + return new EfLineIntersection.ItemNoIntersect(_x, _y); + } + + } + + protected int getContainingElement(double _x, double _y, TIntIterator _it) { + return getContainingElement(grid_, _x, _y, _it, getTolerance()); + + } + + private int getSelectedNodeIdx(double _x, double _y, EfElement elt) { + return getSelectedNodeIdx(grid_, _x, _y, elt, getTolerance()); + } + + /** + * @return the tolerance + */ + public double getTolerance() { + return tolerance_; + } + + /** + * @param _tolerance the tolerance to set + */ + public void setTolerance(double _tolerance) { + tolerance_ = _tolerance; + } + + protected static int getContainingElement(EfGridInterface _grid, double _x, double _y, TIntIterator _it, + double _tolerance) { + EfIndexVisitorNearestElt visitor = new EfIndexVisitorNearestElt(_grid, _x, _y, _tolerance / 10); + while (_it.hasNext()) { + visitor.visitItem(_it.next()); + } + int idx = visitor.getSelected(); + // un element proche a \xE9t\xE9 trouv\xE9 mais le point (_x,_y) n'appartient pas \xE0 ce point + if (idx >= 0 && !visitor.isIn()) { + // on tol\xE8re une erreur de 1E-3: si la distance entre l'element et le point est inferieur a 1E-3 on renvoie quand + // meme cet element + idx = (_grid.getElement(idx).getDist(_x, _y, _grid) < _tolerance) ? idx : -1; + } + return idx; + + } + + static int getSelectedNodeIdx(EfGridInterface _grid, double _x, double _y, EfElement elt, double tolerance) { + int idxSelected = -1; + for (int i = elt.getPtNb() - 1; i >= 0 && idxSelected < 0; i--) { + final int idx = elt.getPtIndex(i); + if (CtuluLibGeometrie.getDistance(_x, _y, _grid.getPtX(idx), _grid.getPtY(idx)) < tolerance) { + idxSelected = idx; + } + } + return idxSelected; + } + +} Added: branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfTrajectoireActivity.java =================================================================== --- branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfTrajectoireActivity.java (rev 0) +++ branches/Prepro-0.92-SNAPSHOT/dodico/src/org/fudaa/dodico/ef/operation/EfTrajectoireActivity.java 2008-10-30 17:07:44 UTC (rev 4117) @@ -0,0 +1,298 @@ +package org.fudaa.dodico.ef.operation; + +import gnu.trove.TIntHashSet; +import gnu.trove.TIntIterator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.fudaa.ctulu.CtuluActivity; +import org.fudaa.ctulu.CtuluAnalyze; +import org.fudaa.ctulu.CtuluLib; +import org.fudaa.ctulu.CtuluLibArray; +import org.fudaa.ctulu.CtuluLibGeometrie; +import org.fudaa.ctulu.ProgressionInterface; +import org.fudaa.ctulu.gis.GISGeometryFactory; +import org.fudaa.dodico.commun.DodicoLib; +import org.fudaa.dodico.ef.EfElement; +import org.fudaa.dodico.ef.EfGridData; +import org.fudaa.dodico.ef.EfGridInterface; +import org.fudaa.dodico.ef.decorator.EfGridDataCacheOneTimeDecorator; +import org.fudaa.dodico.ef.decorator.EfGridDataTimeDecorator; +import org.fudaa.dodico.ef.interpolation.EfGridDataInterpolator; + +import com.memoire.fu.FuLog; +import com.vividsolutions.jts.geom.Coordinate; + +/** + * Algorithme de Calcul les lignes de courants TODO mettre la classe dans EF il y a la classe qui est charge de faire le + * calcul qui doit implementer CtulActivity et la classe qui implemente EfLineIntersectionParent. + * + * @author Adrien Hadoux + */ +public class EfTrajectoireActivity implements CtuluActivity { + + /** + * @return the tester + */ + public EfLineIntersectionsCorrectionTester getTester() { + return tester_; + } + + /** + * @param _tester the tester to set + */ + public void setTester(EfLineIntersectionsCorrectionTester _tester) { + tester_ = _tester; + } + + final EfLineIntersectionsCorrectionTester lineIntersectCorrect_; + + /** + * Liste des intersections r\xE9sultats + */ + ArrayList<EfLineIntersection> listeIntersection_ = null; + + // List<Coordinate> listePointsARepartir_ = new ArrayList<Coordinate>(); // les GrPoint ne sont utilisee que pour + + // l'affichage + ProgressionInterface prog_; + + EfGridDataInterpolator data_; + EfLineIntersectorActivity intersectFinder_; + EfLineIntersectionsCorrectionActivity correctionActivity = new EfLineIntersectionsCorrectionActivity(); + EfLineIntersectionsCorrectionTester tester_; + + double[] timeStep_; + + /** + * @param _interpolator ne doit pas etre null: contient les donn\xE9es + * @param _timeStep requis si un calcul en mode trajectoire est demande + */ + public EfTrajectoireActivity(final EfGridData _data, final double[] _timeStep) { + this(new EfGridDataInterpolator(_data), null, _timeStep); + } + + /** + * @param _interpolator ne doit pas etre null: contient les donn\xE9es + * @param _lineIntersectTester peut etre null: correction des intersections + */ + public EfTrajectoireActivity(final EfGridDataInterpolator _interpolator, + final EfLineIntersectionsCorrectionTester _lineIntersectTester, final double[] _timeStep) { + data_ = _interpolator; + tester_ = _lineIntersectTester; + lineIntersectCorrect_ = _lineIntersectTester; + timeStep_ = _timeStep; + intersectFinder_ = new EfLineIntersectorActivity(data_); + if (CtuluLibArray.isEmpty(timeStep_)) throw new IllegalArgumentException( + "on ne peut pas calculer un trajectoire sans les pas de temps"); + } + + protected boolean mustGoOn(final EfTrajectoireResultBuilder[] enCours) { + for (int i = 0; i < enCours.length; i++) { + if (enCours[i] != null) { return true; } + + } + return false; + + } + + /** + * Methode appel\xE9e par l'interface de calcul des lignes de courant. + * + * @param init_ point de depart + * @param dureeIntegration_ duree totale de l'integration en secondes + * @param indicePdt indice du pas de temps + * @param finesse coefficient de finesse double + * @param vx la variable a utiliser + * @param _prog l'interface de progression, peut etre null + * @return + */ + public List<EfTrajectoireResultBuilder> computeLigneCourant(final EfTrajectoireParameters _data, + final ProgressionInterface _prog, final CtuluAnalyze _analyse) { + stop_ = false; + final double first = timeStep_[0]; + final double last = timeStep_[timeStep_.length - 1]; + if (_data.firstTimeStep_ < first || _data.firstTimeStep_ > last) { + _analyse.addFatalError(DodicoLib.getS("Le premier pas de temps n'appartient pas \xE0 la simulation")); + return null; + } + if (_data.isTrajectoire()) { + final double endTime = _data.firstTimeStep_ + _data.dureeIntegration_; + if (endTime < first || endTime > last) { + _analyse.addFatalError(DodicoLib.getS("La dur\xE9e d'int\xE9gration d\xE9passe la dur\xE9e de la simulation")); + return null; + } + } + prog_ = _prog; + if (_data.points_ == null) return Collections.emptyList(); + final List<EfTrajectoireResultBuilder> res = new ArrayList<EfTrajectoireResultBuilder>(_data.points_.size()); + EfTrajectoireGridDataProvider provider = null; + if (_data.isLigneDeCourant) { + provider = new EfTrajectoireGridDataProvider.LigneDeCourant(_data.firstTimeStepIdx_, data_.getData(), _data.vx, + _data.vy); + } else { + if (CtuluLibArray.isEmpty(timeStep_)) throw new IllegalArgumentException( + "on ne peut pas calculer un trajectoire sans les pas de temps"); + + provider = new EfTrajectoireGridDataProvider.Trajectoire(timeStep_, data_.getData()); + } + // on initialise les resultats + final EfGridDataInterpolator data = new EfGridDataInterpolator(new EfGridDataCacheOneTimeDecorator(data_.getData(), + _data.firstTimeStepIdx_, _data.vx, _data.vy)); + final EfLineSingleIntersectFinder finder = new EfLineSingleIntersectFinder(); + for (final Coordinate coord : _data.points_) { + if (stop_) return res; + final EfTrajectoireResultBuilder builder = new EfTrajectoireResultBuilder(_data, provider); + final EfLineIntersection inter = finder.findIntersectionFor(coord.x, coord.y, _prog); + builder.addFirstIntersection(inter, _data.firstTimeStep_, data); + res.add(builder); + } + + final EfTrajectoireResultBuilder[] enCours = res.toArray(new EfTrajectoireResultBuilder[res.size()]); + while (mustGoOn(enCours)) { + if (stop_) return res; + for (int i = 0; i < enCours.length; i++) { + if (stop_) return res; + final EfTrajectoireResultBuilder bi = enCours[i]; + if (bi != null && !doNext(bi)) { + enCours[i] = null; + } + } + + } + return res; + + } + + /** + * @param _enCours + * @return true si on doit continuer, false si la trajectoire est arrive au bout. + */ + boolean doNext(final EfTrajectoireResultBuilder _enCours) { + final Coordinate lastCoordinate = _enCours.getLastCoordinate(); + final TIntHashSet elementsAdjacent = _enCours.lastAdjacentMeshes_; + final double lastTime = _enCours.getLastTime(); + // l'indice inf et sup des pas de temps englobant le dernier pas de temps + final int[] minMaxLastTime = EfGridDataTimeDecorator.getTMinMax(timeStep_, lastTime); + final EfTrajectoireParameters parameters = _enCours.getParameters(); + // dans le cas des trajectoires on doit rester dans les clous + if (parameters.isTrajectoire() && minMaxLastTime == null) { + FuLog.error("EfTrajectoireActivity: nous sommes en dehors de la simulation !"); + // on s'arrete et c'est bizarre + return false; + } + final double maxDistance = getMaxDistance(lastCoordinate, elementsAdjacent); + + final double vx = _enCours.getLastVx(); + final double vy = _enCours.getLastVy(); + final double v = Math.hypot(vx, vy); + // il s'agit du delta t en valu + double absDeltaT = 0; + int nextTimeStep = -1; + // true si le pas de temps actuelle est sur un pas de temps du projet + if (parameters.isTrajectoire()) { + final boolean isOnTimeStep = (minMaxLastTime[0] == minMaxLastTime[1]); + if (parameters.dureeIntegration_ < 0) { + nextTimeStep = (isOnTimeStep) ? minMaxLastTime[0] - 1 : minMaxLastTime[0]; + } else { + nextTimeStep = (isOnTimeStep) ? minMaxLastTime[1] + 1 : minMaxLastTime[1]; + } + if (nextTimeStep < 0 || nextTimeStep >= timeStep_.length) { + // ce ne devrait jamais arrive car l'iteration precedante aurait du arrete le tout + FuLog.error("EfTrajectoireActivity: le pas de temps courant est en dehors de la simulation !"); + return false; + } + } + // s'il y a une tres faible vitesse on va faire exploser le tout... + final boolean isVitesseNulle = CtuluLib.isZero(v, 1E-4); + if (isVitesseNulle) { + // si c'est une ligne de courant on n'avancera plus + if (parameters.isLigneDeCourant) { return false; } + // sinon on va passer au temps suivant + // on set le delta t pour qu'il aille au prochain pas de temps + absDeltaT = Math.abs(timeStep_[nextTimeStep] - lastTime); + } else { + absDeltaT = maxDistance / v; + + } + if (parameters.finesse_ > 1 && absDeltaT > 1E-2) { + // la c'est bizarre: le coup de l'escargot + absDeltaT = absDeltaT / parameters.finesse_; + } + absDeltaT = Math.max(absDeltaT, 1);// on se d\xE9place au moins d'1 seconde pour avancer + // pour les trajectoires, on essaie de ne pas sauter de pas de temps + // dans le cas des vitesses null on ne fait rien + if (!isVitesseNulle && parameters.isTrajectoire()) { + absDeltaT = Math.min(Math.abs(timeStep_[nextTimeStep] - lastTime), absDeltaT); + } + if (parameters.dureeIntegration_ < 0) absDeltaT = -absDeltaT; + + // le nouveau pas de temps que l'on devrait avoir + double newT = lastTime + absDeltaT; + + final double maxTimeAutorise = parameters.firstTimeStep_ + parameters.dureeIntegration_; + if (Math.abs(newT - parameters.firstTimeStep_) > Math.abs(parameters.dureeIntegration_)) { + newT = maxTimeAutorise; + } + + // on remet a jour le delta t au cas il a ete modifie + absDeltaT = newT - lastTime; + final double newx = lastCoordinate.x + vx * absDeltaT; + final double newy = lastCoordinate.y + vy * absDeltaT; + + EfLineIntersectionsResultsI intersectResult = intersectFinder_.computeFor( + GISGeometryFactory.INSTANCE.createSegment(lastCoordinate.x, lastCoordinate.y, newx, newy), prog_, + data_.getData().isElementVar(parameters.vx)).getDefaultRes(); + if (stop_) return false; + if (tester_ != null) { + intersectResult = correctionActivity.correct(intersectResult, tester_, 0, prog_); + if (stop_) return false; + } + // on sort du maillage: on arrete + if (intersectResult.isSegmentOut(0)) return false; + final EfLineIntersection foundIntersect = intersectResult.getIntersect(1); + // on a croise un objet du maillage, on doit recalculer le temps + // si on une vitesse null, on n'a pas boug\xE9... + if (intersectResult.getNbIntersect() > 2 && !isVitesseNulle) { + double deltaTFistInt = intersectResult.getDistFromDeb(1) / v; + if (parameters.dureeIntegration_ < 0) deltaTFistInt = -deltaTFistInt; + newT = lastTime + deltaTFistInt; + } + + _enCours.addIntersection(foundIntersect, newT); + // on continue si diff\xE9rent de 0 + return !CtuluLib.isZero(maxTimeAutorise - newT, 1E-3); + } + + private double getMaxDistance(final Coordinate lastC... [truncated message content] |