59
59
* @author Robert Rödler
61
* @apiviz.has SelectionResult oneway - - visualizes
62
* @apiviz.has DBIDSelection oneway - - visualizes
63
* @apiviz.uses GrahamScanConvexHull2D
61
* @apiviz.stereotype factory
62
* @apiviz.uses Instance oneway - - «create»
65
public class SelectionConvexHullVisualization extends AbstractScatterplotVisualization implements DataStoreListener {
64
public class SelectionConvexHullVisualization extends AbstractVisFactory {
67
66
* A short name characterizing this Visualizer.
69
68
private static final String NAME = "Convex Hull of Selection";
72
* Generic tag to indicate the type of element. Used in IDs, CSS-Classes etc.
74
public static final String SELECTEDHULL = "selectionConvexHull";
81
public SelectionConvexHullVisualization(VisualizationTask task) {
83
context.addResultListener(this);
84
context.addDataStoreListener(this);
89
protected void redraw() {
91
DBIDSelection selContext = context.getSelection();
92
if(selContext != null) {
93
DBIDs selection = selContext.getSelectedIds();
94
GrahamScanConvexHull2D hull = new GrahamScanConvexHull2D();
95
for(DBIDIter iter = selection.iter(); iter.valid(); iter.advance()) {
97
hull.add(new Vector(proj.fastProjectDataToRenderSpace(rel.get(iter))));
99
catch(ObjectNotFoundException e) {
103
Polygon chres = hull.getHull();
104
if(chres != null && chres.size() >= 3) {
105
SVGPath path = new SVGPath(chres);
107
Element selHull = path.makeElement(svgp);
108
SVGUtil.addCSSClass(selHull, SELECTEDHULL);
109
// TODO: use relative selection size for opacity?
110
layer.appendChild(selHull);
116
* Adds the required CSS-Classes
118
* @param svgp SVG-Plot
120
private void addCSSClasses(SVGPlot svgp) {
121
// Class for the dot markers
122
if(!svgp.getCSSClassManager().contains(SELECTEDHULL)) {
123
CSSClass cls = new CSSClass(this, SELECTEDHULL);
124
// cls = new CSSClass(this, CONVEXHULL);
125
cls.setStatement(SVGConstants.CSS_STROKE_PROPERTY, context.getStyleLibrary().getColor(StyleLibrary.SELECTION));
126
cls.setStatement(SVGConstants.CSS_STROKE_WIDTH_PROPERTY, context.getStyleLibrary().getLineWidth(StyleLibrary.SELECTION));
127
cls.setStatement(SVGConstants.CSS_FILL_PROPERTY, context.getStyleLibrary().getColor(StyleLibrary.SELECTION));
128
cls.setStatement(SVGConstants.CSS_OPACITY_PROPERTY, ".25");
129
cls.setStatement(SVGConstants.CSS_STROKE_LINECAP_PROPERTY, SVGConstants.CSS_ROUND_VALUE);
130
cls.setStatement(SVGConstants.CSS_STROKE_LINEJOIN_PROPERTY, SVGConstants.CSS_ROUND_VALUE);
131
svgp.addCSSClassOrLogError(cls);
136
* Factory for visualizers to generate an SVG-Element containing the convex
137
* hull of the selected points
73
public SelectionConvexHullVisualization() {
75
thumbmask |= ThumbnailVisualization.ON_DATA | ThumbnailVisualization.ON_SELECTION;
79
public Visualization makeVisualization(VisualizationTask task) {
80
return new Instance(task);
84
public void processNewResult(HierarchicalResult baseResult, Result result) {
85
Collection<SelectionResult> selectionResults = ResultUtil.filterResults(result, SelectionResult.class);
86
for(SelectionResult selres : selectionResults) {
87
Collection<ScatterPlotProjector<?>> ps = ResultUtil.filterResults(baseResult, ScatterPlotProjector.class);
88
for(ScatterPlotProjector<?> p : ps) {
89
final VisualizationTask task = new VisualizationTask(NAME, selres, p.getRelation(), this);
90
task.level = VisualizationTask.LEVEL_DATA - 2;
91
baseResult.getHierarchy().add(selres, task);
92
baseResult.getHierarchy().add(p, task);
139
100
* @author Robert Rödler
141
* @apiviz.stereotype factory
142
* @apiviz.uses SelectionConvexHullVisualization oneway - - «create»
102
* @apiviz.has SelectionResult oneway - - visualizes
103
* @apiviz.has DBIDSelection oneway - - visualizes
104
* @apiviz.uses GrahamScanConvexHull2D
144
public static class Factory extends AbstractVisFactory {
150
thumbmask |= ThumbnailVisualization.ON_DATA | ThumbnailVisualization.ON_SELECTION;
154
public Visualization makeVisualization(VisualizationTask task) {
155
return new SelectionConvexHullVisualization(task);
159
public void processNewResult(HierarchicalResult baseResult, Result result) {
160
Collection<SelectionResult> selectionResults = ResultUtil.filterResults(result, SelectionResult.class);
161
for(SelectionResult selres : selectionResults) {
162
Collection<ScatterPlotProjector<?>> ps = ResultUtil.filterResults(baseResult, ScatterPlotProjector.class);
163
for(ScatterPlotProjector<?> p : ps) {
164
final VisualizationTask task = new VisualizationTask(NAME, selres, p.getRelation(), this);
165
task.put(VisualizationTask.META_LEVEL, VisualizationTask.LEVEL_DATA - 2);
166
baseResult.getHierarchy().add(selres, task);
167
baseResult.getHierarchy().add(p, task);
106
public class Instance extends AbstractScatterplotVisualization implements DataStoreListener {
108
* Generic tag to indicate the type of element. Used in IDs, CSS-Classes
111
public static final String SELECTEDHULL = "selectionConvexHull";
118
public Instance(VisualizationTask task) {
120
context.addResultListener(this);
121
context.addDataStoreListener(this);
126
protected void redraw() {
128
DBIDSelection selContext = context.getSelection();
129
if(selContext != null) {
130
DBIDs selection = selContext.getSelectedIds();
131
GrahamScanConvexHull2D hull = new GrahamScanConvexHull2D();
132
for(DBIDIter iter = selection.iter(); iter.valid(); iter.advance()) {
134
hull.add(new Vector(proj.fastProjectDataToRenderSpace(rel.get(iter))));
136
catch(ObjectNotFoundException e) {
140
Polygon chres = hull.getHull();
141
if(chres != null && chres.size() >= 3) {
142
SVGPath path = new SVGPath(chres);
144
Element selHull = path.makeElement(svgp);
145
SVGUtil.addCSSClass(selHull, SELECTEDHULL);
146
// TODO: use relative selection size for opacity?
147
layer.appendChild(selHull);
153
* Adds the required CSS-Classes
155
* @param svgp SVG-Plot
157
private void addCSSClasses(SVGPlot svgp) {
158
// Class for the dot markers
159
if(!svgp.getCSSClassManager().contains(SELECTEDHULL)) {
160
final StyleLibrary style = context.getStyleResult().getStyleLibrary();
161
CSSClass cls = new CSSClass(this, SELECTEDHULL);
162
// cls = new CSSClass(this, CONVEXHULL);
163
cls.setStatement(SVGConstants.CSS_STROKE_PROPERTY, style.getColor(StyleLibrary.SELECTION));
164
cls.setStatement(SVGConstants.CSS_STROKE_WIDTH_PROPERTY, style.getLineWidth(StyleLibrary.SELECTION));
165
cls.setStatement(SVGConstants.CSS_FILL_PROPERTY, style.getColor(StyleLibrary.SELECTION));
166
cls.setStatement(SVGConstants.CSS_OPACITY_PROPERTY, ".25");
167
cls.setStatement(SVGConstants.CSS_STROKE_LINECAP_PROPERTY, SVGConstants.CSS_ROUND_VALUE);
168
cls.setStatement(SVGConstants.CSS_STROKE_LINEJOIN_PROPERTY, SVGConstants.CSS_ROUND_VALUE);
169
svgp.addCSSClassOrLogError(cls);