|
From: <de...@us...> - 2013-01-16 21:26:42
|
Revision: 8213
http://fudaa.svn.sourceforge.net/fudaa/?rev=8213&view=rev
Author: deniger
Date: 2013-01-16 21:26:35 +0000 (Wed, 16 Jan 2013)
Log Message:
-----------
optimisation maillage important
Modified Paths:
--------------
trunk/soft/fudaa-mesh/src/main/java/org/fudaa/fudaa/meshviewer/layer/MvIsoLayerQuickPainter.java
Modified: trunk/soft/fudaa-mesh/src/main/java/org/fudaa/fudaa/meshviewer/layer/MvIsoLayerQuickPainter.java
===================================================================
--- trunk/soft/fudaa-mesh/src/main/java/org/fudaa/fudaa/meshviewer/layer/MvIsoLayerQuickPainter.java 2013-01-16 21:26:13 UTC (rev 8212)
+++ trunk/soft/fudaa-mesh/src/main/java/org/fudaa/fudaa/meshviewer/layer/MvIsoLayerQuickPainter.java 2013-01-16 21:26:35 UTC (rev 8213)
@@ -8,6 +8,8 @@
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
+import org.fudaa.ctulu.CtuluLib;
+import org.fudaa.ctulu.CtuluLibArray;
import org.fudaa.ctulu.CtuluListSelection;
import org.fudaa.ebli.commun.EbliLib;
import org.fudaa.ebli.geometrie.GrBoite;
@@ -92,16 +94,21 @@
}
private boolean isLineAllPaintedByNode(int minX, int maxX, int minY, int maxY, int[] x, int[] y, int nbPt) {
- if (maxX - minX == 0 && maxY - minY < nbPt) {
- boolean[] dots = new boolean[maxY - minY + 1];
+ final int deltaX = maxX - minX;
+ final int deltaY = maxY - minY;
+ if (deltaX <= 1 && deltaY <= 1) {
+ return true;
+ }
+ if (deltaX == 0 && deltaY < nbPt) {
+ boolean[] dots = new boolean[deltaY + 1];
for (int i = 0; i < nbPt; i++) {
dots[y[i] - minY] = true;
}
return isAllTrue(dots);
}
- if (maxX - minX < nbPt && maxY - minY == 0) {
- boolean[] dots = new boolean[maxX - minX + 1];
+ if (deltaX < nbPt && deltaY == 0) {
+ boolean[] dots = new boolean[deltaX + 1];
for (int i = 0; i < nbPt; i++) {
dots[x[i] - minX] = true;
}
@@ -120,38 +127,33 @@
}
public void paintDonnees(int width, int height, final Graphics2D _g, final GrMorphisme _versEcran, final GrMorphisme _versReel, final GrBoite _clipReel) {
-
int idxElt;
TraceIsoInterface isos = null;
- // TrIsoTraceSurface isos = null;
- boolean keepAntialias = false;
MvIsoModelInterface modelToUse = model;
if (traceIsoLine) {
isos = new TraceIsoLignesAvecPlages(paletteCouleur, alpha, ligneModel);
- keepAntialias = true;
} else {
isos = new TraceIsoSurfacesAvecPlages(paletteCouleur, alpha);
}
GrBoite clipEcran = _clipReel.applique(_versEcran);
isos.setRapide(rapide);
- isos.setDimension(width, height);
+ int w = width + 1;
+ CtuluListSelection memory = new CtuluListSelection(w * height);
+ isos.setDimension(width, height, memory);
isos.setClipEcran(clipEcran);
// pour les surfaces, on voudrait eviter d'utiliser l'anticrenelage
- if (!keepAntialias && isAntaliasing) {
- final RenderingHints renderingHints = _g.getRenderingHints();
- renderingHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
- renderingHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
- _g.setRenderingHints(renderingHints);
- }
+ final RenderingHints renderingHints = _g.getRenderingHints();
+ renderingHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+ renderingHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
+ _g.setRenderingHints(renderingHints);
+// }
final int n = modelToUse.getNbElt();
int[] x = null;
int[] y = null;
GrPoint pt = new GrPoint();
- int w = width + 1;
- CtuluListSelection memory = new CtuluListSelection(w * height);
+
Envelope envReel = _clipReel.getEnv();
-
for (idxElt = 0; idxElt < n; idxElt++) {
if (!modelToUse.isPainted(idxElt)) {
continue;
@@ -169,7 +171,7 @@
if (y == null || y.length < nbPt) {
y = new int[nbPt];
}
- boolean isOnlyOnePoint = true;
+
int maxX = -1;
int minX = Integer.MAX_VALUE;
int maxY = -1;
@@ -183,14 +185,14 @@
final int yi = (int) pt.y_;
x[iPt] = xi;
y[iPt] = yi;
- if (iPt > 0 && isOnlyOnePoint) {
- isOnlyOnePoint = (xi == x[iPt - 1] && yi == y[iPt - 1]);
- }
maxX = Math.max(maxX, xi);
maxY = Math.max(maxY, yi);
minX = Math.min(minX, xi);
minY = Math.min(minY, yi);
}
+ final int deltaX = maxX - minX;
+ final int deltaY = maxY - minY;
+ boolean isOnlyOnePoint = deltaX == 0 && deltaY == 0;
// Trace des isosurfaces / Isolignes (dans la couleur du fond si les isocouleurs sont
// tracees).
if (isos != null) {
@@ -199,45 +201,85 @@
int idxDone = x[0] + y[0] * w;
if (idxDone >= 0 && !memory.isSelected(idxDone)) {
memory.add(idxDone);
- double value = modelToUse.getDatatFor(idxElt, 0);
- final Color c = paletteCouleur == null ? null : ((BPalettePlage) paletteCouleur).getColorFor(value);
+ double ptValue = modelToUse.getDatatFor(idxElt, 0);
+ final Color c = paletteCouleur == null ? null : ((BPalettePlage) paletteCouleur).getColorFor(ptValue);
if (c != null) {
- _g.setColor(EbliLib.getAlphaColor(c, alpha));
+ _g.setColor(rapide ? c : EbliLib.getAlphaColor(c, alpha));
_g.drawLine(x[0], y[0], x[0], y[0]);
}
}
- }
+ }
+ //l'element est un element plat(ligne) ou est contenu dans un carre 2*2
} else if (!traceIsoLine && isLineAllPaintedByNode(minX, maxX, minY, maxY, x, y, nbPt)) {
- for (int iPt = 0; iPt < nbPt; iPt++) {
- if (clipEcran.contientXY(x[iPt], y[iPt])) {
- int idxDone = x[iPt] + y[iPt] * w;
- if (idxDone >= 0 && !memory.isSelected(idxDone)) {
- memory.add(idxDone);
- double value = modelToUse.getDatatFor(idxElt, iPt);
- final Color c = EbliLib.getAlphaColor(paletteCouleur == null ? null : ((BPalettePlage) paletteCouleur).getColorFor(
- value), alpha);
- if (c != null) {
- _g.setColor(c);
- _g.drawLine(x[iPt], y[iPt], x[iPt], y[iPt]);
+
+ boolean painted = false;
+ if (deltaX == 0 || deltaY == 0) {
+ double valueToUse = modelToUse.getDatatFor(idxElt, 0);
+ boolean constant = true;
+ //pour les points sur 2 pixels on ne fait pas le tests pour savoir si meme valeur.
+ if (deltaX >= 1 || deltaY >= 1) {
+ for (int iPt = 1; iPt < nbPt; iPt++) {
+ double val = modelToUse.getDatatFor(idxElt, iPt);
+ if (constant) {
+ constant = CtuluLib.isEquals(val, valueToUse, 1e-10);
+ if (!constant) {
+ break;
+ }
}
}
- }
+ }
+ if (constant) {
+ painted = true;
+ final Color color = paletteCouleur == null ? null : ((BPalettePlage) paletteCouleur).getColorFor(
+ valueToUse);
+ final Color c = rapide ? color : EbliLib.getAlphaColor(color, alpha);
+ if (c != null) {
+ _g.setColor(c);
+ _g.drawLine(minX, minY, maxX, maxY);
+ }
+ for (int iPt = 0; iPt < nbPt; iPt++) {
+ int idxDone = x[iPt] + y[iPt] * w;
+ if (idxDone >= 0) {
+ memory.add(idxDone);
+ }
+ }
+ }
}
+ if (!painted) {
+ for (int iPt = 0; iPt < nbPt; iPt++) {
+ if (clipEcran.contientXY(x[iPt], y[iPt])) {
+ int idxDone = x[iPt] + y[iPt] * w;
+ if (idxDone >= 0 && !memory.isSelected(idxDone)) {
+ memory.add(idxDone);
+ final Color color = paletteCouleur == null ? null : ((BPalettePlage) paletteCouleur).getColorFor(
+ modelToUse.getDatatFor(idxElt, iPt));
+ final Color c = rapide ? color : EbliLib.getAlphaColor(color, alpha);
+ if (c != null) {
+ _g.setColor(c);
+ _g.drawLine(x[iPt], y[iPt], x[iPt], y[iPt]);
+ }
+ }
+ }
+ }
+ }
} else {
value = modelToUse.fillWithData(idxElt, value);
if (value != null) {
- final Polygon p = new Polygon(x, y, nbPt);
- isos.draw(_g, p, value);
- for (int iPoly = 0; iPoly < nbPt; iPoly++) {
- final int memoryIndex = x[iPoly] + y[iPoly] * w;
- if (memoryIndex >= 0) {
- memory.add(memoryIndex);
- }
+ if (rapide && !traceIsoLine && deltaX <= 5 && deltaY <= 5) {
+ double moyenne = CtuluLibArray.getMoyenne(value);
+ final Color c = paletteCouleur == null ? null : ((BPalettePlage) paletteCouleur).getColorFor(
+ moyenne);
+ _g.setColor(c);
+ _g.fillRect(minX, minY, deltaX + 1, deltaY + 1);
+ } else {
+ final Polygon p = new Polygon(x, y, nbPt);
+ isos.draw(_g, p, value);
}
}
}
}
}
+
}
boolean rapide;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|