/* * Copyright (c) 2011-2013, Peter Abeles. All Rights Reserved. * * This file is part of BoofCV (http://boofcv.org). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package boofcv.gui.feature; import boofcv.struct.feature.TupleDesc; import javax.swing.*; import java.awt.*; /** * Visualizes the a {@link boofcv.struct.feature.TupleDesc_F64}. * * @author Peter Abeles */ public class TupleDescPanel extends JPanel { TupleDesc desc; public TupleDesc getDesc() { return desc; } public void setDescription(TupleDesc desc) { this.desc = desc; } @Override public synchronized void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; TupleDesc desc = this.desc; if( desc == null ) { g2.setColor(Color.WHITE); g2.fillRect(0,0,getWidth(),getHeight()); } else { int h = getHeight(); int w = getWidth(); int m = h/2; int []x = new int[ desc.size() ]; int []y = new int[ desc.size() ]; // find the maximum magnitude of any of the elements double max = 0; for( int i = 0; i < desc.size(); i++ ) { double d = desc.getDouble(i); if( max < Math.abs(d)) { max = Math.abs(d); } } // draw a normalized histogram plot double stepX = 1.0/desc.size(); for( int i = 0; i < desc.size(); i++ ) { x[i] = (int)(w*i*stepX); y[i] = (int)((m*desc.getDouble(i)/max)+m); } g2.setColor(Color.GRAY); g2.drawLine(0,m,w,m); g2.setStroke(new BasicStroke(2)); g2.setColor(Color.RED); g2.drawPolyline(x,y,x.length); // print out the magnitude g2.setColor(Color.BLACK); String s = String.format("%4.1e",max); g2.drawString(s,0,20); g2.setColor(Color.BLUE); for( int i = 0; i < desc.size(); i++ ) { int r = 1; w = r*2+1; g2.fillOval(x[i]-r,y[i]-r,w,w); } } } }