/*
* $Id: PlotMark.java,v 1.7 2003/09/17 21:37:18 dwd Exp $
*
* This software is provided by NOAA for full, free and open release. It is
* understood by the recipient/user that NOAA assumes no liability for any
* errors contained in the code. Although this software is released without
* conditions or restrictions in its use, it is expected that appropriate
* credit be given to its author and to the National Oceanic and Atmospheric
* Administration should the software be included by the recipient as an
* element in other product development.
*/
package sgtplot;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.BorderLayout;
import java.awt.FontMetrics;
import java.awt.Font;
import java.awt.Color;
import javax.swing.*;
import org.freehep.graphics2d.VectorGraphics;
import sgtplot.util.Dimension2D;
/**
* Support class used to draw a PlotMark. Plot mark codes are defined
* in the following table.
*
*
*
* @author Donald Denbo
* @version $Revision: 1.7 $, $Date: 2003/09/17 21:37:18 $
* @since 2.0
* @see PointCartesianRenderer
* @see sgtplot.swing.PlotMarkIcon
*/
public class PlotMark {
protected int mark_;
protected int tableSize_ = 51;
protected int firstPoint_;
protected int lastPoint_;
protected double markHeight_;
protected int fillMark_ = 44;
protected boolean fill_ = false;
protected boolean circle_ = false;
protected static final int[][] markTable
= {{ 5, 9}, { 11, 15}, { 14, 15}, { 11, 12}, // 0
{ 26, 31}, { 32, 37}, { 38, 43}, { 44, 49}, // 4
{ 1, 5}, { 64, 67}, { 5, 15}, { 50, 54}, // 8
{ 1, 9}, { 55, 63}, { 15, 19}, { 21, 25}, // 12
{ 50, 53}, { 51, 54}, { 72, 77}, { 84, 98}, // 16
{ 18, 22}, { 11, 19}, { 64, 66}, { 68, 71}, // 20
{ 68, 70}, { 78, 83}, {102, 106}, {113, 118}, // 24
{119, 124}, {125, 130}, {131, 136}, {105, 110}, // 28
{107, 112}, {137, 139}, { 99, 106}, {103, 108}, // 32
{140, 144}, {140, 147}, {156, 163}, {148, 155}, // 36
{170, 183}, {184, 189}, {188, 193}, {164, 169}, // 40
{ 1, 5}, { 64, 67}, { 55, 63}, { 15, 19}, // 44
{ 68, 71}, {164, 169}, {164, 169}}; // 48
protected static final int[] table
= { 9, 41, 45, 13, 9, 45, 0, 13, 41, 0, // 0
25, 29, 0, 11, 43, 29, 11, 25, 43, 11, // 10
25, 29, 11, 43, 29, 18, 27, 34, 0, 27, // 20
24, 20, 27, 36, 0, 27, 30, 20, 27, 18, // 30
0, 3, 27, 36, 27, 34, 0, 27, 51, 41, // 40
13, 45, 9, 41, 4, 2, 16, 32, 50, 52, // 50
38, 22, 4, 9, 29, 41, 9, 13, 25, 45, // 60
13, 13, 27, 31, 0, 27, 45, 9, 27, 29, // 70
0, 27, 41, 13, 20, 18, 9, 0, 18, 34, // 80
0, 20, 36, 0, 45, 36, 34, 41, 19, 35, // 90
0, 21, 17, 33, 37, 21, 19, 35, 33, 17, // 100
21, 37, 20, 29, 25, 0, 17, 33, 21, 37, // 110
35, 19, 17, 33, 21, 37, 19, 35, 33, 17, // 120
21, 19, 43, 0, 37, 33, 21, 37, 25, 12, // 130
44, 0, 42, 10, 0, 17, 37, 26, 30, 0, // 140
12, 44, 0, 8, 40, 13, 45, 0, 43, 11, // 150
0, 9, 41, 4, 41, 30, 9, 52, 4, 12, // 160
20, 21, 13, 12, 0, 9, 45, 0, 33, 41, // 170
42, 34, 33, 14, 44, 10, 0, 9, 41, 0, // 180
42, 12, 46, 0, 0, 0, 0, 0, 0, 0}; // 190
/**
* Construct a PlotMark using the code and height from the
* LineAttribute.
*/
public PlotMark(LineAttribute attr) {
setLineAttribute(attr);
}
/**
* Construct a PlotMark using the code and height from the
* PointAttribute.
*/
public PlotMark(PointAttribute attr) {
setPointAttribute(attr);
}
/**
* Construct a PlotMark using the code from the
* mark code. Default height = 0.08.
*/
public PlotMark(int mark) {
setMark(mark);
markHeight_ = 0.08;
}
/**
* Set the mark and height from the PointAttribute.
*/
public void setPointAttribute(PointAttribute attr) {
int mark = attr.getMark();
setMark(mark);
markHeight_ = attr.getMarkHeightP()/8.0;
}
/**
* Set the mark and height from the LineAttribute.
*/
public void setLineAttribute(LineAttribute attr) {
int mark = attr.getMark();
setMark(mark);
markHeight_ = attr.getMarkHeightP()/8.0;
}
/**
* Set the mark.
*/
public void setMark(int mark) {
if(mark <= 0) mark = 0;
fill_ = mark > fillMark_;
circle_ = mark >= 50;
if(circle_) fill_ = mark == 51;
if(mark > tableSize_) mark = tableSize_;
firstPoint_ = markTable[mark-1][0]-1;
lastPoint_ = markTable[mark-1][1];
mark_ = mark;
}
/**
* Get the mark code.
*/
public int getMark() {
return mark_;
}
/**
* Set the mark height.
*/
public void setMarkHeightP(double mHeight) {
markHeight_ = mHeight/8.0;
}
/**
* Get the mark height
*/
public double getMarkHeightP() {
return markHeight_*8.0;
}
/**
* Used internally by sgtplot.
*/
public void paintMark(VectorGraphics g, Layer ly, int xp, int yp) {
int count, ib;
int xdOld = 0, ydOld = 0;
int movex, movey;
int xt, yt;
double xscl = ly.getXSlope()*markHeight_;
double yscl = ly.getYSlope()*markHeight_;
if(circle_) {
xt = (int)(xscl*-2) + xp;
yt = (int)(xscl*-2) + yp;
int w = (int)(xscl*4.0) - 1;
if(fill_) {
g.fillOval(xt, yt, w, w);
} else {
g.drawOval(xt, yt, w, w);
}
return;
}
int[] xl = new int[lastPoint_-firstPoint_];
int[] yl = new int[lastPoint_-firstPoint_];
boolean penf = false;
int i=0;
for(count = firstPoint_; count < lastPoint_; count++) {
ib = table[count];
if(ib == 0) {
penf = false;
} else {
movex = (ib>>3) - 3;
movey = -((ib&7) - 3);
xt = (int)(xscl*(double)movex) + xp;
yt = (int)(yscl*(double)movey) + yp;
if(penf) {
if(fill_) {
xl[i] = xt;
yl[i] = yt;
i++;
} else {
g.drawLine(xdOld, ydOld, xt, yt);
}
}
penf = true;
xdOld = xt;
ydOld = yt;
}
if(fill_) g.fillPolygon(xl, yl, i);
}
}
public static void main(String[] args) {
/**
* hack code to create a "list" of plot marks.
*/
JFrame frame = new JFrame("Plot Marks");
frame.getContentPane().setLayout(new BorderLayout());
frame.setSize(500, 700);
JPane pane = new JPane("Plot Mark Pane", frame.getSize());
Layer layer = new Layer("Plot Mark Layer", new Dimension2D(5.0, 7.0));
pane.setBatch(true);
pane.setLayout(new StackedLayout());
frame.getContentPane().add(pane, BorderLayout.CENTER);
pane.add(layer);
frame.setVisible(true);
pane.setBatch(false);
PlotMark pm = new PlotMark(1);
Graphics g = pane.getGraphics();
VectorGraphics g2 = VectorGraphics.create(g);
g2.setFont(new Font("Helvetica", Font.PLAIN, 14));
pm.setMarkHeightP(0.32);
int w = pane.getSize().width;
int h = pane.getSize().height;
g2.setColor(Color.white);
g2.fillRect(0, 0, w, h);
g2.setColor(Color.black);
FontMetrics fm = g2.getFontMetrics();
int hgt = fm.getAscent()/2;
String label;
int xt = 100;
int yt = 400;
int wid = 0;
int mark = 1;
for(int j=0; j < 13; j++) {
yt = 45*j + 100;
for(int i=0; i < 4; i++) {
xt = 120*i + 75;
label = mark + ":";
wid = fm.stringWidth(label) + 20;
g2.setColor(Color.blue.brighter());
g2.drawString(label, xt - wid, yt);
pm.setMark(mark);
g2.setColor(Color.black);
pm.paintMark(g2, layer, xt, yt - hgt);
mark++;
if(mark > 51) break;
}
}
}
public String toString() {
return "PlotMark: " + mark_;
}
}
Ads help maintain this website.