|
From: <de...@us...> - 2012-05-10 22:27:08
|
Revision: 7186
http://fudaa.svn.sourceforge.net/fudaa/?rev=7186&view=rev
Author: deniger
Date: 2012-05-10 22:27:01 +0000 (Thu, 10 May 2012)
Log Message:
-----------
maj
Modified Paths:
--------------
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfFrontierInterface.java
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfNeighborMesh.java
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfRemoveFilter.java
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/impl/EfFrontier.java
trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/olb/exec/OLBExec.java
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfFrontierInterface.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfFrontierInterface.java 2012-05-10 21:16:56 UTC (rev 7185)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfFrontierInterface.java 2012-05-10 22:27:01 UTC (rev 7186)
@@ -57,7 +57,7 @@
int getFrontiereIndice(final int _idxFr, final int _idxOnFr);
int getFrontiereIndice(final int _idxGlob);
-
+
double[] getAbsCurviligne(final EfGridInterface _grid, final int _frIdx, final int _firstIdxOnFr, final int _nb);
GISPolygone[] getExternRing(final EfGridInterface _grid);
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfNeighborMesh.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfNeighborMesh.java 2012-05-10 21:16:56 UTC (rev 7185)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfNeighborMesh.java 2012-05-10 22:27:01 UTC (rev 7186)
@@ -15,7 +15,6 @@
import gnu.trove.TIntArrayList;
import gnu.trove.TIntHashSet;
-import gnu.trove.TIntIterator;
import org.fudaa.ctulu.CtuluVariable;
import org.fudaa.ctulu.ProgressionInterface;
@@ -108,7 +107,7 @@
return getAverageForVect(_var, _idxPt, _dataElement, new EfGridDataInterpolationValuesAdapter(_datas, _tIdx), _vects);
}
- private EfDataNode getDataNodeSimple(final CtuluCollectionDouble _data) {
+ public EfDataNode getDataNodeSimple(final CtuluCollectionDouble _data) {
final double[] res = new double[getNumberOfPoints()];
for (int i = res.length - 1; i >= 0; i--) {
res[i] = getAverageForNodeDanger(i, _data);
@@ -221,7 +220,7 @@
public EfDataNode getDataNode(final CtuluVariable _var, final CtuluCollectionDouble _data, InterpolationSupportValuesMultiI _datas,
InterpolationVectorContainer _vects) {
- if (_vects.isVect(_var)) {
+ if (_vects!=null && _vects.isVect(_var)) {
return getDataNodeVecteur(_var, _data, _datas, _vects);
}
return getDataNodeSimple(_data);
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfRemoveFilter.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfRemoveFilter.java 2012-05-10 21:16:56 UTC (rev 7185)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/EfRemoveFilter.java 2012-05-10 22:27:01 UTC (rev 7186)
@@ -7,12 +7,15 @@
import com.memoire.fu.FuSortint;
import com.memoire.fu.FuSortint.Comparator;
+import gnu.trove.TIntIntHashMap;
// TODO Trouver un autre nom (EfFilterValidator).
// TODO Pour l'instant le filtre contient les \xE9l\xE9ments a supprimer. G\xE9rer les filtre qui contiennent les \xE9l\xE9ment \xE0
// garder.
public class EfRemoveFilter {
+
private class ElementsIdxComparator implements Comparator {
+
private EfGridInterface grid;
private EfFrontierInterface frontiers;
@@ -39,7 +42,9 @@
int[] idxs = this.grid.getElement(eltIdx).getIndices();
for (int i = 0; i < idxs.length; i++) {
- if (this.frontiers.isFrontierPoint(idxs[i])) { return true; }
+ if (this.frontiers.isFrontierPoint(idxs[i])) {
+ return true;
+ }
}
return false;
@@ -74,16 +79,18 @@
private int compareValue(int a, int b) {
if (a < b) {
return -1;
- } else if (a > b) { return 1; }
+ } else if (a > b) {
+ return 1;
+ }
return 0;
}
}
-
private EfFilter filter;
private EfGridInterface grid;
private TIntArrayList eltsToRemove;
private TIntArrayList selectedElts;
+ private TIntHashSet selectedEltsSet;
private TIntHashSet eltsInProcess;
private boolean isSelectFilter;
private boolean filterModified;
@@ -111,9 +118,9 @@
EfNeighborMesh neighborMesh = EfNeighborMesh.compute(this.grid, null);
this.sortEltsToRemove();
-
+ TIntIntHashMap frontierIndiceByGlobalIdx = buildFrontierIndiceByGlobalIdx(frontiers);
for (int i = 0; i < this.eltsToRemove.size(); i++) {
- this.selectElement(this.eltsToRemove.get(i), frontiers, neighborMesh);
+ this.selectElement(this.eltsToRemove.get(i), frontiers, neighborMesh, frontierIndiceByGlobalIdx);
}
this.filterModified = (this.eltsToRemove.size() != this.selectedElts.size());
@@ -124,9 +131,9 @@
public void setFilter(EfFilter filter) {
this.filter = filter;
}
-
- public int getNbElementNotRemoved(){
- return this.eltsToRemove.size() -this.selectedElts.size();
+
+ public int getNbElementNotRemoved() {
+ return this.eltsToRemove.size() - this.selectedElts.size();
}
public void setGrid(EfGridInterface grid) {
@@ -144,11 +151,14 @@
this.isSelectFilter = isSelectFilter;
}
- private boolean selectElement(int eltIdx, EfFrontierInterface frontiers, EfNeighborMesh neighborMesh) {
- if (this.isSelectedElement(eltIdx)) { return true; }
+ private boolean selectElement(int eltIdx, EfFrontierInterface frontiers, EfNeighborMesh neighborMesh,
+ TIntIntHashMap frontierIndiceByGlobalIdx) {
+ if (this.isSelectedElement(eltIdx)) {
+ return true;
+ }
int[] eltPtIdxs = this.grid.getElement(eltIdx).getIndices();
- TIntArrayList problematicPts = this.getProblematicPtsIdx(eltPtIdxs, frontiers, neighborMesh);
+ TIntArrayList problematicPts = this.getProblematicPtsIdx(eltPtIdxs, frontiers, neighborMesh, frontierIndiceByGlobalIdx);
boolean selectElement = true;
this.eltsInProcess.add(eltIdx);
@@ -156,14 +166,14 @@
for (int i = 0; i < problematicPts.size(); i++) {
int ptIdx = problematicPts.get(i);
int[] adjacentPtsIdx = this.getAdjacentPtsIdx(eltPtIdxs, ptIdx);
- int neighborElts[] = new int[] { neighborMesh.getAdjacentMeshes(ptIdx, adjacentPtsIdx[0], eltIdx),
- neighborMesh.getAdjacentMeshes(ptIdx, adjacentPtsIdx[1], eltIdx) };
+ int neighborElts[] = new int[]{neighborMesh.getAdjacentMeshes(ptIdx, adjacentPtsIdx[0], eltIdx),
+ neighborMesh.getAdjacentMeshes(ptIdx, adjacentPtsIdx[1], eltIdx)};
selectElement = false;
for (int j = 0; j < neighborElts.length; j++) {
if ((neighborElts[j] != -1) && (this.eltsToRemove.contains(neighborElts[j]))) {
- if (this.selectElement(neighborElts[j], frontiers, neighborMesh)) {
+ if (this.selectElement(neighborElts[j], frontiers, neighborMesh, frontierIndiceByGlobalIdx)) {
selectElement = true;
break;
@@ -189,28 +199,31 @@
int nbPts = eltPtIdxs.length;
for (int i = 0; i < eltPtIdxs.length; i++) {
- if (eltPtIdxs[i] == ptIdx) { return new int[] { eltPtIdxs[this.getPreviousIdx(nbPts, i)],
- eltPtIdxs[this.getNextIdx(nbPts, i)] }; }
+ if (eltPtIdxs[i] == ptIdx) {
+ return new int[]{eltPtIdxs[this.getPreviousIdx(nbPts, i)],
+ eltPtIdxs[this.getNextIdx(nbPts, i)]};
+ }
}
return null;
}
- private TIntArrayList getProblematicPtsIdx(int[] eltPtIdxs, EfFrontierInterface frontiers, EfNeighborMesh neighborMesh) {
+ private TIntArrayList getProblematicPtsIdx(int[] eltPtIdxs, EfFrontierInterface frontiers, EfNeighborMesh neighborMesh,
+ TIntIntHashMap frontierIndiceByGlobalIdx) {
TIntArrayList problematicPtsIdx = new TIntArrayList();
int nbPts = eltPtIdxs.length;
-
for (int i = 0; i < nbPts; i++) {
int previousIdx = this.getPreviousIdx(nbPts, i);
int nextIdx = this.getNextIdx(nbPts, i);
- if (this.isFrontierProblematicPt(eltPtIdxs[i], eltPtIdxs[previousIdx], eltPtIdxs[nextIdx], frontiers)) {
+ if (this.isFrontierProblematicPt(eltPtIdxs[i], eltPtIdxs[previousIdx], eltPtIdxs[nextIdx], frontiers,
+ frontierIndiceByGlobalIdx)) {
problematicPtsIdx.add(eltPtIdxs[i]);
continue;
}
- if (this.isSelectedEltsProblematicPt(eltPtIdxs[i], eltPtIdxs[previousIdx], eltPtIdxs[nextIdx])) {
+ if (this.isSelectedEltsProblematicPt(eltPtIdxs[i], eltPtIdxs[previousIdx], eltPtIdxs[nextIdx], neighborMesh)) {
problematicPtsIdx.add(eltPtIdxs[i]);
continue;
@@ -220,16 +233,31 @@
return problematicPtsIdx;
}
- private boolean isFrontierProblematicPt(int ptIdx, int previousPtIdx, int nextPtIdx, EfFrontierInterface frontiers) {
+ private TIntIntHashMap buildFrontierIndiceByGlobalIdx(EfFrontierInterface frontiers) {
+ TIntIntHashMap frontierIndiceByGlobalIdx = new TIntIntHashMap();
+ AllFrontierIteratorInterface allFrontierIterator = frontiers.getAllFrontierIterator();
+ while (allFrontierIterator.hasNext()) {
+ int globalIdx = allFrontierIterator.next();
+ frontierIndiceByGlobalIdx.put(globalIdx, allFrontierIterator.getBordIDx());
+ }
+ return frontierIndiceByGlobalIdx;
+ }
+
+ private boolean isFrontierProblematicPt(int ptIdx, int previousPtIdx, int nextPtIdx, EfFrontierInterface frontiers,
+ TIntIntHashMap frontierIndiceByGlobalIdx) {
if (frontiers.isFrontierPoint(ptIdx)) {
- int frtIdx = frontiers.getFrontiereIndice(ptIdx);
+ int frtIdx = frontierIndiceByGlobalIdx.get(ptIdx);
if (frontiers.isFrontierPoint(previousPtIdx)) {
- if (frtIdx == frontiers.getFrontiereIndice(previousPtIdx)) { return false; }
+ if (frtIdx == frontierIndiceByGlobalIdx.get(previousPtIdx)) {
+ return false;
+ }
}
if (frontiers.isFrontierPoint(nextPtIdx)) {
- if (frtIdx == frontiers.getFrontiereIndice(nextPtIdx)) { return false; }
+ if (frtIdx == frontierIndiceByGlobalIdx.get(nextPtIdx)) {
+ return false;
+ }
}
return true;
@@ -238,12 +266,19 @@
return false;
}
- private boolean isSelectedEltsProblematicPt(int ptIdx, int previousPtIdx, int nextPtIdx) {
- for (int i = 0; i < this.selectedElts.size(); i++) {
- EfElement element = this.grid.getElement(this.selectedElts.get(i));
-
- if (element.containsIndex(ptIdx)) {
- if ((!element.containsIndex(previousPtIdx)) && (!element.containsIndex(nextPtIdx))) { return true; }
+ private boolean isSelectedEltsProblematicPt(int ptIdx, int previousPtIdx, int nextPtIdx, EfNeighborMesh neighbor) {
+ int nbNeighborMeshes = neighbor.getNbNeighborMeshes(ptIdx);
+ if (selectedEltsSet == null) {
+ selectedEltsSet = new TIntHashSet();
+ selectedEltsSet.addAll(selectedElts.toNativeArray());
+ }
+ for (int i = 0; i < nbNeighborMeshes; i++) {
+ int idxElt = neighbor.getNeighborMesh(ptIdx, i);
+ if (selectedEltsSet.contains(idxElt)) {
+ EfElement element = this.grid.getElement(idxElt);
+ if ((!element.containsIndex(previousPtIdx)) && (!element.containsIndex(nextPtIdx))) {
+ return true;
+ }
}
}
@@ -300,156 +335,151 @@
/*
* public EfFilter process() { this.filterElements = new CtuluListSelection(); this.selectableElements = new
* CtuluListSelection(); this.degenerateElements = new TIntObjectHashMap<TIntArrayList>();
- *
- * EfFrontierInterface frontiers = this.grid.getFrontiers(); EfNeighborMesh neighborMesh =
- * EfNeighborMesh.compute(this.grid, null);
- *
+ *
+ * EfFrontierInterface frontiers = this.grid.getFrontiers(); EfNeighborMesh neighborMesh = EfNeighborMesh.compute(this.grid,
+ * null);
+ *
* // Selection des \xE9l\xE9ments et traitment des \xE9l\xE9ments fronti\xE8res for (int i = 0; i < this.grid.getEltNb(); i++) { if
* (this.filter.isActivatedElt(i)) { EfElement element = this.grid.getElement(i); TIntArrayList[] frontiersPts = new
* TIntArrayList[frontiers.getNbFrontier()];
- *
- * if (this.hasFrontierPts(element, frontiers, frontiersPts)) { TIntArrayList problematicPts =
- * this.getProblematicPts(element, frontiers, frontiersPts);
- *
- * if (problematicPts.isEmpty()) { this.selectableElements.add(i); } else { this.degenerateElements.put(i,
- * problematicPts); } } else { this.filterElements.add(i); } } }
- *
- * //Taitement des \xE9l\xE9ments d\xE9g\xE9n\xE9r\xE9s. TIntObjectIterator<TIntArrayList> iterator =
- * this.degenerateElements.iterator();
- *
+ *
+ * if (this.hasFrontierPts(element, frontiers, frontiersPts)) { TIntArrayList problematicPts = this.getProblematicPts(element,
+ * frontiers, frontiersPts);
+ *
+ * if (problematicPts.isEmpty()) { this.selectableElements.add(i); } else { this.degenerateElements.put(i, problematicPts); } }
+ * else { this.filterElements.add(i); } } }
+ *
+ * //Taitement des \xE9l\xE9ments d\xE9g\xE9n\xE9r\xE9s. TIntObjectIterator<TIntArrayList> iterator = this.degenerateElements.iterator();
+ *
* while (iterator.hasNext()) { if (!this.isSelectedElement(iterator.key())) {
- *
+ *
* } }
- *
+ *
* this.degenerateElements.clear();
- *
+ *
* return new EfFilterSelectedElement(this.selectableElements, this.grid); }
- *
+ *
* private boolean isSelectedElement(int elementIdx) { return this.selectableElements.isSelected(elementIdx) ||
* this.elementsInProcess.isSelected(elementIdx); }
- *
- * private boolean hasFrontierPts(EfElement element, EfFrontierInterface frontiers, TIntArrayList[] frontiersPts) {
- * int[] idxs = element.getIndices(); boolean hasFrtPts = false;
- *
+ *
+ * private boolean hasFrontierPts(EfElement element, EfFrontierInterface frontiers, TIntArrayList[] frontiersPts) { int[] idxs =
+ * element.getIndices(); boolean hasFrtPts = false;
+ *
* for (int i = 0; i < idxs.length; i++) { if (frontiers.isFrontierPoint(idxs[i])) { int frtIdx =
* frontiers.getFrontiereIndice(idxs[i]);
- *
+ *
* if (frontiersPts[frtIdx] == null) { frontiersPts[frtIdx] = new TIntArrayList(); }
- *
+ *
* frontiersPts[frtIdx].add(idxs[i]);
- *
+ *
* hasFrtPts = true; } }
- *
+ *
* return hasFrtPts; }
- *
- * private TIntArrayList getProblematicPts(EfElement element, EfFrontierInterface frontiers, TIntArrayList[]
- * frontiersPts) { int[] idxs = element.getIndices(); int nbPts = idxs.length; TIntArrayList problematicPts = new
- * TIntArrayList();
- *
- * for (int i = 0; i < frontiersPts.length; i++) { if (frontiersPts[i] != null) { // Jamais \xE9gal \xE0 0 (si \xE9gal 0,
- * frontiersPts[i] \xE9gal null, voir hasFrontierPts) if (frontiersPts[i].size() == 1) {
- * problematicPts.add(frontiersPts[i].get(0));
- *
+ *
+ * private TIntArrayList getProblematicPts(EfElement element, EfFrontierInterface frontiers, TIntArrayList[] frontiersPts) {
+ * int[] idxs = element.getIndices(); int nbPts = idxs.length; TIntArrayList problematicPts = new TIntArrayList();
+ *
+ * for (int i = 0; i < frontiersPts.length; i++) { if (frontiersPts[i] != null) { // Jamais \xE9gal \xE0 0 (si \xE9gal 0, frontiersPts[i]
+ * \xE9gal null, voir hasFrontierPts) if (frontiersPts[i].size() == 1) { problematicPts.add(frontiersPts[i].get(0));
+ *
* continue; }
- *
+ *
* for (int j = 0; j < nbPts; j++) { if (frontiersPts[i].contains(idxs[j])) { if
- * ((!frontiersPts[i].contains(idxs[this.getPreviousIdx(nbPts, j)])) &&
- * (!frontiersPts[i].contains(idxs[this.getNextIdx(nbPts, j)]))) { problematicPts.add(idxs[j]); } } } } }
- *
+ * ((!frontiersPts[i].contains(idxs[this.getPreviousIdx(nbPts, j)])) && (!frontiersPts[i].contains(idxs[this.getNextIdx(nbPts,
+ * j)]))) { problematicPts.add(idxs[j]); } } } } }
+ *
* return problematicPts; }
- *
- * private boolean hasSelectedNeighbor(int elementIdx, TIntArrayList[] frontiersPts, EfNeighborMesh neighborMesh) {
- * int[] neighborIdxs = neighborMesh.getAdjacentMeshesFromElt(this.grid, elementIdx); EfElement[] neighbors = new
+ *
+ * private boolean hasSelectedNeighbor(int elementIdx, TIntArrayList[] frontiersPts, EfNeighborMesh neighborMesh) { int[]
+ * neighborIdxs = neighborMesh.getAdjacentMeshesFromElt(this.grid, elementIdx); EfElement[] neighbors = new
* EfElement[neighborIdxs.length];
- *
+ *
* for (int i = 0; i < neighborIdxs.length; i++) { neighbors[i] = this.grid.getElement(neighborIdxs[i]); }
- *
- * for (int i = 0; i < frontiersPts.length; i++) { if (frontiersPts[i] != null) { for (int j = 0; j <
- * frontiersPts[i].size(); j++) { boolean hasSelectedNeighbor = false;
- *
+ *
+ * for (int i = 0; i < frontiersPts.length; i++) { if (frontiersPts[i] != null) { for (int j = 0; j < frontiersPts[i].size();
+ * j++) { boolean hasSelectedNeighbor = false;
+ *
* for (int k = 0; k < neighbors.length; k++) { if (neighbors[k].containsIndex(frontiersPts[i].get(j))) { if
* (this.selectElement(neighborIdxs[k], frontiers, neighborMesh)) { hasSelectedNeighbor = true;
- *
+ *
* break; } } }
- *
+ *
* if (!hasSelectedNeighbor) { return false; } } } }
- *
+ *
* return false; }
- *
+ *
* private int getPreviousIdx(int nbPts, int idx) { if (idx == 0) { return nbPts - 1; } else { return idx - 1; } }
- *
- * private int getNextIdx(int nbPts, int idx) { if (idx == (nbPts - 1)) { return 0; } else { return idx + 1; } } /*
- * public EfFilter process() { this.selectableElements = new CtuluListSelection(); this.unselectableElements = new
+ *
+ * private int getNextIdx(int nbPts, int idx) { if (idx == (nbPts - 1)) { return 0; } else { return idx + 1; } } /* public
+ * EfFilter process() { this.selectableElements = new CtuluListSelection(); this.unselectableElements = new
* CtuluListSelection();
- *
- * EfFrontierInterface frontiers = this.grid.getFrontiers(); EfNeighborMesh neighborMesh =
- * EfNeighborMesh.compute(this.grid, null);
- *
+ *
+ * EfFrontierInterface frontiers = this.grid.getFrontiers(); EfNeighborMesh neighborMesh = EfNeighborMesh.compute(this.grid,
+ * null);
+ *
* for (int i = 0; i < this.grid.getEltNb(); i++) { this.selectElement(i, frontiers, neighborMesh); }
- *
+ *
* return new EfFilterSelectedElement(this.selectableElements, this.grid); }
- *
+ *
* private boolean selectElement(int elementIdx, EfFrontierInterface frontiers, EfNeighborMesh neighborMesh) { if
* ((!this.filter.isActivatedElt(elementIdx)) || (this.unselectableElements.isSelected(elementIdx))) { return false; }
- *
+ *
* if (this.selectableElements.isSelected(elementIdx)) { return true; }
- *
+ *
* EfElement element = this.grid.getElement(elementIdx); TIntArrayList[] frontiersPts = new
- * TIntArrayList[frontiers.getNbFrontier()]; boolean canSelectElt = !this.hasFrontierPts(element, frontiers,
- * frontiersPts);
- *
+ * TIntArrayList[frontiers.getNbFrontier()]; boolean canSelectElt = !this.hasFrontierPts(element, frontiers, frontiersPts);
+ *
* if (!canSelectElt) { canSelectElt = this.hasOnlyFrontierSegment(element, frontiers, frontiersPts); }
- *
- * if (!canSelectElt) { // On le met dans cette liste pour ne pas qu'il soit retest\xE9 par ses voisins (risque de
- * StackOverflow). this.unselectableElements.add(elementIdx);
- *
+ *
+ * if (!canSelectElt) { // On le met dans cette liste pour ne pas qu'il soit retest\xE9 par ses voisins (risque de StackOverflow).
+ * this.unselectableElements.add(elementIdx);
+ *
* canSelectElt = this.hasSelectedNeighbor(elementIdx, frontiers, frontiersPts, neighborMesh); }
- *
+ *
* if (canSelectElt) { this.unselectableElements.remove(elementIdx); this.selectableElements.add(elementIdx); } else {
* this.unselectableElements.add(elementIdx); }
- *
+ *
* return canSelectElt; }
- *
- * private boolean hasOnlyFrontierSegment(EfElement element, EfFrontierInterface frontiers, TIntArrayList[]
- * frontiersPts) { int[] idxs = element.getIndices(); int nbPts = idxs.length; boolean hasOnlyFrtSeg = true;
- *
- * for (int i = 0; i < frontiersPts.length; i++) { if (frontiersPts[i] != null) { if (frontiersPts[i].size() < 2) {
- * return false; }
- *
+ *
+ * private boolean hasOnlyFrontierSegment(EfElement element, EfFrontierInterface frontiers, TIntArrayList[] frontiersPts) {
+ * int[] idxs = element.getIndices(); int nbPts = idxs.length; boolean hasOnlyFrtSeg = true;
+ *
+ * for (int i = 0; i < frontiersPts.length; i++) { if (frontiersPts[i] != null) { if (frontiersPts[i].size() < 2) { return
+ * false; }
+ *
* TIntArrayList ptsToRemove = new TIntArrayList();
- *
+ *
* for (int j = 0; j < nbPts; j++) { if (frontiersPts[i].contains(idxs[j])) { if
- * ((!frontiersPts[i].contains(idxs[this.getPreviousIdx(nbPts, j)])) &&
- * (!frontiersPts[i].contains(idxs[this.getNextIdx(nbPts, j)]))) { hasOnlyFrtSeg = false; } else {
- * ptsToRemove.add(idxs[j]); } } }
- *
+ * ((!frontiersPts[i].contains(idxs[this.getPreviousIdx(nbPts, j)])) && (!frontiersPts[i].contains(idxs[this.getNextIdx(nbPts,
+ * j)]))) { hasOnlyFrtSeg = false; } else { ptsToRemove.add(idxs[j]); } } }
+ *
* // On enl\xE8ve le points faisant partie de segment fronti\xE8re ppour garder ceux qui pose probl\xE8me. for (int j = 0; j <
* ptsToRemove.size(); j++) { frontiersPts[i].remove(frontiersPts[i].indexOf(ptsToRemove.get(j))); }
- *
+ *
* if (frontiersPts[i].size() == 0) { frontiersPts[i] = null; } } }
- *
+ *
* return hasOnlyFrtSeg; }
- *
+ *
* private boolean hasSelectedNeighbor(int elementIdx, EfFrontierInterface frontiers, TIntArrayList[] frontiersPts,
- * EfNeighborMesh neighborMesh) { int[] neighborIdxs = neighborMesh.getAdjacentMeshesFromElt(this.grid, elementIdx);
- * EfElement[] neighbors = new EfElement[neighborIdxs.length];
- *
+ * EfNeighborMesh neighborMesh) { int[] neighborIdxs = neighborMesh.getAdjacentMeshesFromElt(this.grid, elementIdx); EfElement[]
+ * neighbors = new EfElement[neighborIdxs.length];
+ *
* for (int i = 0; i < neighborIdxs.length; i++) { neighbors[i] = this.grid.getElement(neighborIdxs[i]); }
- *
- * for (int i = 0; i < frontiersPts.length; i++) { if (frontiersPts[i] != null) { for (int j = 0; j <
- * frontiersPts[i].size(); j++) { boolean hasSelectedNeighbor = false;
- *
+ *
+ * for (int i = 0; i < frontiersPts.length; i++) { if (frontiersPts[i] != null) { for (int j = 0; j < frontiersPts[i].size();
+ * j++) { boolean hasSelectedNeighbor = false;
+ *
* for (int k = 0; k < neighbors.length; k++) { if (neighbors[k].containsIndex(frontiersPts[i].get(j))) { if
* (this.selectElement(neighborIdxs[k], frontiers, neighborMesh)) { hasSelectedNeighbor = true;
- *
+ *
* break; } } }
- *
+ *
* if (!hasSelectedNeighbor) { return false; } } } }
- *
+ *
* return false; }
- *
+ *
* private int getPreviousIdx(int nbPts, int idx) { if (idx == 0) { return nbPts - 1; } else { return idx - 1; } }
- *
+ *
* private int getNextIdx(int nbPts, int idx) { if (idx == (nbPts - 1)) { return 0; } else { return idx + 1; } }
*/
}
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/impl/EfFrontier.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/impl/EfFrontier.java 2012-05-10 21:16:56 UTC (rev 7185)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/impl/EfFrontier.java 2012-05-10 22:27:01 UTC (rev 7186)
@@ -1,9 +1,6 @@
/**
- * @creation 30 juin 2003
- * @modification $Date: 2007-01-19 13:07:20 $
- * @license GNU General Public License 2
- * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne
- * @mail de...@fu...
+ * @creation 30 juin 2003 @modification $Date: 2007-01-19 13:07:20 $ @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.impl;
@@ -37,7 +34,7 @@
/**
* Les frontieres d'un maillage (plusieurs tableaux d'entier).
- *
+ *
* @author deniger
* @version $Id: EfFrontier.java,v 1.1 2007-01-19 13:07:20 deniger Exp $
*/
@@ -46,10 +43,9 @@
public GISPolygone getSavedLinearRing(int _idxFr) {
return ring_ == null ? null : ring_[_idxFr];
}
-
protected int[][] bords_;
-
GISPolygone[] ring_;
+ BitSet globalIdxInFrontier;
/**
* @param _l les tableaux d'entiers decrivant les frontiere
@@ -91,17 +87,19 @@
}
for (int i = bords_.length - 1; i >= 0; i--) {
for (int j = _fr.getNbPt(i) - 1; j >= 0; j--) {
- if (_fr.getIdxGlobal(i, j) != getIdxGlobal(i, j)) return false;
+ if (_fr.getIdxGlobal(i, j) != getIdxGlobal(i, j)) {
+ return false;
+ }
}
}
return true;
}
/**
- * Permet de retrouver les frontieres externes. Cette procedure ne fait aucune supposition sur l'ordre des fronti\xE8res
- * donn\xE9es. On pourrait optimiser en prenant en compte que les frontieres sont donn\xE9es dans l'ordre Telemac (point
- * sud-ouest). Or il se peut que cela soit faux si un tableau ipobo erron\xE9 est utilis\xE9.
- *
+ * Permet de retrouver les frontieres externes. Cette procedure ne fait aucune supposition sur l'ordre des fronti\xE8res donn\xE9es.
+ * On pourrait optimiser en prenant en compte que les frontieres sont donn\xE9es dans l'ordre Telemac (point sud-ouest). Or il se
+ * peut que cela soit faux si un tableau ipobo erron\xE9 est utilis\xE9.
+ *
* @param _g le maillage
* @param _idxFr liste de tableaux d'entier: les indices des frontieres
* @param _prog la barre de progression
@@ -165,12 +163,11 @@
return r;
}
-
CtuluListSelection isExterne_;
/**
* Frontiere unique definit par le tableau d'entier.
- *
+ *
* @param _l les indices des points frontieres
*/
public EfFrontier(final int[] _l) {
@@ -189,11 +186,10 @@
}
/**
- * Renvoie l'index de frontiere a partir de l'index de la frontiere et de l'index du point sur la fronti\xE8re. Par
- * exemple si vous avez 2 frontieres,la premiere de taille 100 et la 2eme de taille 20, l'appel getIdxFrGlob(1,10)
- * renvoie 110 (le point 10 de la 2eme frontiere). getIdxFrGlob(0,10) renvoie (10). getIdxFrGlob(1,100) renvoie -1
- * (erreur).
- *
+ * Renvoie l'index de frontiere a partir de l'index de la frontiere et de l'index du point sur la fronti\xE8re. Par exemple si vous
+ * avez 2 frontieres,la premiere de taille 100 et la 2eme de taille 20, l'appel getIdxFrGlob(1,10) renvoie 110 (le point 10 de
+ * la 2eme frontiere). getIdxFrGlob(0,10) renvoie (10). getIdxFrGlob(1,100) renvoie -1 (erreur).
+ *
* @param _idxFr l'indice de la frontier
* @param _idxOnFr l'indice du point sur la frontier _idxFr
* @return -1 si les donnees sont erron\xE9es.
@@ -236,8 +232,8 @@
it.next();
ptCurrent = it.getGlobalIdx();
res[i] = res[i - 1]
- + CtuluLibGeometrie.getDistance(_grid.getPtX(ptLast), _grid.getPtY(ptLast), _grid.getPtX(ptCurrent), _grid
- .getPtY(ptCurrent));
+ + CtuluLibGeometrie.getDistance(_grid.getPtX(ptLast), _grid.getPtY(ptLast), _grid.getPtX(ptCurrent), _grid.getPtY(
+ ptCurrent));
ptLast = ptCurrent;
}
@@ -255,10 +251,14 @@
}
isExterne_ = new CtuluListSelection(nbFr);
for (int i = 0; i < nbFr; i++) {
- if (_f.isExtern(i)) isExterne_.add(i);
+ if (_f.isExtern(i)) {
+ isExterne_.add(i);
+ }
GISPolygone ringi = _f.getSavedLinearRing(i);
if (ringi != null) {
- if (ring_ == null) ring_ = new GISPolygone[nbFr];
+ if (ring_ == null) {
+ ring_ = new GISPolygone[nbFr];
+ }
}
ring_[i] = ringi;
}
@@ -314,8 +314,9 @@
}
/**
- * Initialyze <code>temp</code> with [ frontier index, point index in the frontier] from the general index.
- *
+ * Initialyze
+ * <code>temp</code> with [ frontier index, point index in the frontier] from the general index.
+ *
* @param _idxGlobal l'indice general du point
* @param _temp le tableau a modifier [ frontier index, point index in the frontier]
* @return true si cet indice est bien un indice frontiere
@@ -347,8 +348,9 @@
}
/**
- * Renvoie l'index du point d'indice global <code>_idxGlobal</code> sur la frontiere.
- *
+ * Renvoie l'index du point d'indice global
+ * <code>_idxGlobal</code> sur la frontiere.
+ *
* @param _idxGlobal l'indice globale
* @return -1 si c'est n'est pas un point frontier. L'indice de frontiere sinon
*/
@@ -385,9 +387,9 @@
}
/**
- * Renvoie l'indice de frontiere a partir de l'indice global. Initialise egalement le tableau idxFrIdxOnFr (qui doit
- * etre de taille 2) avec l'index de frontiere et l'index du point sur la frontiere.
- *
+ * Renvoie l'indice de frontiere a partir de l'indice global. Initialise egalement le tableau idxFrIdxOnFr (qui doit etre de
+ * taille 2) avec l'index de frontiere et l'index du point sur la frontiere.
+ *
* @param _idxGlobal l'indice global du point
* @param _idxFrIdxOnFr l'indice sur la frontiere
* @return l'indice de frontiere a partir de l'indice global
@@ -411,15 +413,27 @@
/**
* @param _idxGlobal l'indice global a tester
- * @return true si le point d'indice globle <code>_idxGlobal</code> est un point frontiere
+ * @return true si le point d'indice globle
+ * <code>_idxGlobal</code> est un point frontiere
*/
+ @Override
public boolean isFrontierPoint(final int _idxGlobal) {
- return getIdxOnFrontier(_idxGlobal) >= 0;
+ if (this.globalIdxInFrontier == null) {
+ globalIdxInFrontier = new BitSet();
+ final int n = bords_.length;
+ for (int i = 0; i < n; i++) {
+ final int n2 = bords_[i].length;
+ for (int j = 0; j < n2; j++) {
+ globalIdxInFrontier.set(bords_[i][j]);
+ }
+ }
+ }
+ return globalIdxInFrontier.get(_idxGlobal);
}
/**
* Initialyze the array _idxFrIdxPt with [frontiere idx,point idx on frontier] from the frontier index _idxOnFrontier.
- *
+ *
* @param _idxOnFrontier l'indice frontiere du point
* @param _idxFridxPt le tableau a initialise
* @return true if found false otherwise. true si trouve
@@ -441,7 +455,7 @@
/**
* @param _idxGlobalOnFrontiers l'indice frontiere du point
* @return the general index from the index on the frontier. L'indice general du point dont l'indice frontiere est
- * <code>_idxGlobalOnFrontiers</code>.
+ * <code>_idxGlobalOnFrontiers</code>.
*/
public final int getIdxGlobalFrom(final int _idxGlobalOnFrontiers) {
final int n = bords_.length;
@@ -485,7 +499,7 @@
/**
* Permet de verifier si les indices de bords sont dans le meme ordre que celui donne par _ipobo.
- *
+ *
* @param _ipobo les indices des points frontieres a comparer
* @return si meme ordre des points frontieres
*/
@@ -533,7 +547,7 @@
/**
* Attention peut etre tres long !
- *
+ *
* @return une chaine de caractere decrivant les indices du bord principal
* @see org.fudaa.ctulu.CtuluLibString#getObjectInString(Object, boolean)
*/
@@ -552,7 +566,7 @@
public String toString() {
return "H2dMaillageFrontiere main frontier[" + bords_[0].length + "] intern frontier [" + getNbFrontierIntern()
- + "]";
+ + "]";
}
/**
@@ -598,9 +612,10 @@
/**
* Pas de verification !
- *
+ *
* @param _idxOnFirstFrontier l'indiece sur la premiere frontiere
- * @return l'index du point n\xB0<code>_idx</code> sur la fronti\xE8re principale (externe)
+ * @return l'index du point n\xB0
+ * <code>_idx</code> sur la fronti\xE8re principale (externe)
*/
public int getIdxGlobalPrinc(final int _idxOnFirstFrontier) {
return bords_[0][_idxOnFirstFrontier];
@@ -629,23 +644,26 @@
/**
* Un iterateur sur les frontiere.
- *
+ *
* @author Fred Deniger
* @version $Id: EfFrontier.java,v 1.1 2007-01-19 13:07:20 deniger Exp $
*/
public class AllFrontiereIterator implements AllFrontierIteratorInterface {
int bordIdx_;
-
int ptIdx_;
-
int frontierIdx_ = -1;
- AllFrontiereIterator() {}
+ AllFrontiereIterator() {
+ }
public boolean hasNext() {
- return (bordIdx_ < bords_.length - 1) ? true
- : ((bordIdx_ == bords_.length - 1) ? (ptIdx_ < bords_[bordIdx_].length) : false);
+ int nextBordIdx = bordIdx_;
+ if (mustIncrementBord) {
+ nextBordIdx++;
+ }
+ return (nextBordIdx < bords_.length - 1) ? true
+ : ((nextBordIdx == bords_.length - 1) ? (ptIdx_ < bords_[nextBordIdx].length) : false);
}
public int getBordIDx() {
@@ -658,15 +676,20 @@
public int getFrontierIdx() {
return frontierIdx_;
}
+ boolean mustIncrementBord;
/**
* Return the next index in the general numbering.
*/
public int next() {
+ if (mustIncrementBord) {
+ bordIdx_++;
+ mustIncrementBord = false;
+ }
final int r = bords_[bordIdx_][ptIdx_++];
frontierIdx_++;
if (ptIdx_ == bords_[bordIdx_].length) {
- bordIdx_++;
+ mustIncrementBord = true;
ptIdx_ = 0;
}
return r;
@@ -675,18 +698,15 @@
/**
* Un iterateur sur une fronti\xE8re donn\xE9e. N'a pas de de limite : il renvoie les indices en boucle.
- *
+ *
* @author Fred Deniger
* @version $Id: EfFrontier.java,v 1.1 2007-01-19 13:07:20 deniger Exp $
*/
public class FrontierIterator implements FrontierIteratorInterface {
int bordIdx_;
-
int idx_;
-
int idxOnFr_;
-
boolean reverse_;
/**
@@ -705,7 +725,7 @@
/**
* Commence l'iteration a partir du premier point.
- *
+ *
* @param _bordIdx le bord a parcourir
*/
public FrontierIterator(final int _bordIdx) {
Modified: trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/olb/exec/OLBExec.java
===================================================================
--- trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/olb/exec/OLBExec.java 2012-05-10 21:16:56 UTC (rev 7185)
+++ trunk/business/fudaa-ef/io/src/main/java/org/fudaa/dodico/olb/exec/OLBExec.java 2012-05-10 22:27:01 UTC (rev 7186)
@@ -1,9 +1,6 @@
/**
- * @creation 10 d\xE9c. 2003
- * @modification $Date: 2007-06-29 15:10:32 $
- * @license GNU General Public License 2
- * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne
- * @mail de...@fu...
+ * @creation 10 d\xE9c. 2003 @modification $Date: 2007-06-29 15:10:32 $ @license GNU General Public License 2 @copyright (c)1998-2001
+ * CETMEF 2 bd Gambetta F-60231 Compiegne @mail de...@fu...
*/
package org.fudaa.dodico.olb.exec;
@@ -62,7 +59,9 @@
File dir = exe.getParentFile();
if (!dir.canWrite()) {
dir = new File(FuLib.getJavaTmp());
- if (!dir.exists() || !dir.canWrite()) { return null; }
+ if (!dir.exists() || !dir.canWrite()) {
+ return null;
+ }
}
try {
inFile = File.createTempFile("temp", ".olb_in", dir);
@@ -88,12 +87,12 @@
final EfGridInterface init = new EfGridTranslate(_init, -offsetX, -offsetY);
interfaceDunes.setMaillage(init);
CtuluIOOperationSynthese op = DunesMAIFileFormat.getInstance().getLastVersionInstance(null).write(inFile,
- interfaceDunes, _prog);
+ interfaceDunes, _prog);
if (stop_) {
deleteFiles(inFile, outFile);
return null;
}
- if ((_ui != null) && (op.containsFatalError())) {
+ if ((_ui != null) && (op.containsSevereError())) {
_ui.error(null, op.getAnalyze().getFatalError().toString(), false);
deleteFiles(inFile, outFile);
return null;
@@ -111,15 +110,17 @@
return null;
}
op = DunesMAIFileFormat.getInstance().getLastVersionInstance(outFile).read(outFile, _prog);
- if ((_ui != null) && (op.containsFatalError())) {
+ if ((_ui != null) && (op.containsSevereError())) {
_ui.error("OLB", op.getAnalyze().getFatalError(), false);
}
deleteFiles(inFile, outFile);
final DunesInterface r = (DunesInterface) op.getSource();
- if (r == null || r.getGrid() == null) { return null; }
+ if (r == null || r.getGrid() == null) {
+ return null;
+ }
final EfGridInterface resDunes = new EfGridTranslate(r.getGrid(), offsetX, offsetY);
final EfGridInterface resFinal = resDunes.getEltType() == EfElementType.T6 ? checkT6(resDunes) : new EfGridArray(
- resDunes);
+ resDunes);
return resFinal;
}
@@ -161,5 +162,4 @@
public void stop() {
stop_ = true;
}
-
}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|