XYLineGraph.java
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008, AIST, the University of Tokyo and General Robotix Inc.
3  * All rights reserved. This program is made available under the terms of the
4  * Eclipse Public License v1.0 which accompanies this distribution, and is
5  * available at http://www.eclipse.org/legal/epl-v10.html
6  * Contributors:
7  * General Robotix Inc.
8  * National Institute of Advanced Industrial Science and Technology (AIST)
9  */
10 package com.generalrobotix.ui.view.graph;
11 
12 import org.eclipse.swt.SWT;
13 import org.eclipse.swt.events.PaintEvent;
14 import org.eclipse.swt.events.PaintListener;
15 import org.eclipse.swt.graphics.Color;
16 import org.eclipse.swt.graphics.FontMetrics;
17 import org.eclipse.swt.graphics.GC;
18 import org.eclipse.swt.graphics.RGB;
19 import org.eclipse.swt.widgets.Canvas;
20 import org.eclipse.swt.widgets.Composite;
21 
23 
24 import java.util.*;
25 import java.text.*;
26 
33 public class XYLineGraph extends Canvas implements PaintListener {
34 
35  // -----------------------------------------------------------------
36  // 定数
37  // 軸定数
38  public static final int AXIS_LEFT = 0; // 左軸
39  public static final int AXIS_RIGHT = 1; // 右軸
40  public static final int AXIS_TOP = 2; // 上軸
41  public static final int AXIS_BOTTOM = 3; // 下軸
42  // グラフの最小サイズ
43  private static final int MIN_HEIGHT = 30; // グラフの最小高
44  private static final int MIN_WIDTH = 30; // グラフの最小幅
45  // ティックとラベルの隙間
46  private static final int LABEL_GAP_LEFT = 5;
47  private static final int LABEL_GAP_RIGHT = 4;
48  private static final int LABEL_GAP_TOP = 3;
49  private static final int LABEL_GAP_BOTTOM = -5;
50  // 描画フラグ
51  private static final int DRAW_AXIS = 1; // 軸描画
52  private static final int DRAW_TICK = 2; // ティック描画
53  private static final int DRAW_LABEL = 4; // ラベル描画
54  private static final int DRAW_GRID = 8; // グリッド描画
55  private static final int DRAW_MARKER = 16; // マーカ描画
56 
57  private static final int EPS_SCALE = 20; // EPS時スケール
58  //private static final double EPS_LINE_WIDTH = 0.3; // EPS線幅
59 
60  // -----------------------------------------------------------------
61  // インスタンス変数
62  // マージン
63  private int leftMargin_; // 左マージン
64  private int rightMargin_; // 右マージン
65  private int topMargin_; // 上マージン
66  private int bottomMargin_; // 下マージン
67  // 軸
68  private AxisInfo[] axisInfo_; // 軸情報
69  // データ系列
70  private ArrayList<DataSeries> dsList_; // データ系列リスト
71  private HashMap<DataSeries, DataSeriesInfo> dsInfoMap_; // データ系列情報マップ
72  // 凡例
73  private LegendPanel legendPanel_; // 凡例パネル
74  // 色
75  private Color backColor_; // 背景色
76  private Color borderColor_; // 周辺色
77 // private Color nullAxisColor_; // 軸が無い場合の色
78 
79  private boolean epsMode_;
80 
81  // -----------------------------------------------------------------
82  // コンストラクタ
91  public XYLineGraph(
92  Composite parent,
93  int leftMargin, // 左マージン
94  int rightMargin, // 右マージン
95  int topMargin, // 上マージン
96  int bottomMargin // 下マージン
97  ) {
98  super(parent,SWT.NO_BACKGROUND | SWT.DOUBLE_BUFFERED);
99  // マージン設定
100  leftMargin_ = leftMargin;
101  rightMargin_ = rightMargin;
102  topMargin_ = topMargin;
103  bottomMargin_ = bottomMargin;
104 
105  // 凡例パネル生成
106 
107 
108  // デフォルト色設定
109  backColor_ = Activator.getDefault().getColor("black");
110  borderColor_ = Activator.getDefault().getColor("black");
111 // nullAxisColor_ = Color.darkGray;
112 
113  // 軸情報クリア
114  axisInfo_ = new AxisInfo[4];
115  axisInfo_[AXIS_LEFT] = null;
116  axisInfo_[AXIS_RIGHT] = null;
117  axisInfo_[AXIS_TOP] = null;
118  axisInfo_[AXIS_BOTTOM] = null;
119 
120  // データ系列管理データ初期化
121  dsList_ = new ArrayList<DataSeries>(); // データ系列リスト
122  dsInfoMap_ = new HashMap<DataSeries, DataSeriesInfo>(); // データ系列情報マップ
123 
124  // EPSモード
125  epsMode_ = false;
126 
127  addPaintListener(this);
128  }
129 
130  // -----------------------------------------------------------------
131  // メソッド
137  public void setEPSMode(
138  boolean flag
139  ) {
140  epsMode_ = flag;
141  }
142 
148  public void setBackColor(
149  Color color
150  ) {
151  backColor_ = color;
152  }
153 
159  public void setBorderColor(
160  Color color
161  ) {
162  borderColor_ = color;
163  }
164 
174  public void addDataSeries(
175  DataSeries ds,
176  AxisInfo xai,
177  AxisInfo yai,
178  RGB rgb,
179  String legend
180  ) {
181  Color color=Activator.getDefault().getColor(rgb);
182  DataSeriesInfo dsi = new DataSeriesInfo( xai, yai, color, new LegendInfo(color, legend));
183  legendPanel_.addLegend(dsi.legend);
184  dsList_.add(ds);
185  dsInfoMap_.put(ds, dsi);
186  }
187 
193  public void removeDataSeries(
194  DataSeries ds
195  ) {
196  int ind = dsList_.indexOf(ds);
197  dsList_.remove(ind);
198  DataSeriesInfo dsi = (DataSeriesInfo)dsInfoMap_.get(ds);
199  legendPanel_.removeLegend(dsi.legend);
200  dsInfoMap_.remove(ds);
201  }
202 
208  public Iterator getDataSeries() {
209  return (Iterator)dsList_.listIterator();
210  }
211 
220  public void setAxisInfo(
221  int axis,
222  AxisInfo ai
223  ) {
224  axisInfo_[axis] = ai;
225  }
226 
235  int axis
236  ) {
237  return axisInfo_[axis];
238  }
239 
246  public void setStyle(DataSeries ds, RGB rgb) {
247  DataSeriesInfo dsi = (DataSeriesInfo)dsInfoMap_.get(ds);
248  dsi.color = Activator.getDefault().getColor(rgb);
250  }
251 
258  public RGB getStyle(DataSeries ds) {
259  DataSeriesInfo dsi = (DataSeriesInfo)dsInfoMap_.get(ds);
260  return dsi.color.getRGB();
261  }
262 
269  public void setLegendLabel(DataSeries ds, String legend) {
270  DataSeriesInfo dsi = (DataSeriesInfo)dsInfoMap_.get(ds);
271  dsi.legend.label = legend;
272  }
273 
280  public String getLegendLabel(DataSeries ds) {
281  DataSeriesInfo dsi = (DataSeriesInfo)dsInfoMap_.get(ds);
282  return dsi.legend.label;
283  }
284 
290  public Canvas getLegendPanel() {
291  return null;//legendPanel_;
292  }
293 
299  public void paintControl(PaintEvent e) {
300 
301  // サイズの決定
302  int width = getSize().x;
303  int height = getSize().y;
304  e.gc.setBackground(backColor_);
305  e.gc.fillRectangle(0, 0, width, height);
306  int minWidth = leftMargin_ + MIN_WIDTH + rightMargin_;
307  int minHeight = topMargin_ + MIN_HEIGHT + bottomMargin_;
308  if (width < minWidth) {
309  width = minWidth;
310  }
311  if (height < minHeight) {
312  height = minHeight;
313  }
314 
315  // 角座標の決定
316  int xl = leftMargin_;
317  int xr = width - rightMargin_ - 1;
318  int yt = topMargin_;
319  int yb = height - bottomMargin_ - 1;
320 
321  // スケールを変更する
322  //TODO hattori
323  /*
324  if (epsMode_) {
325  EPSGraphics eg = (EPSGraphics)g;
326  eg.setScale(EPS_SCALE);
327  //eg.setLineWidth(EPS_LINE_WIDTH);
328  width *= EPS_SCALE;
329  height *= EPS_SCALE;
330  xl *= EPS_SCALE;
331  xr *= EPS_SCALE;
332  yt *= EPS_SCALE;
333  yb *= EPS_SCALE;
334  }
335  */
336  // グリッドの描画
337  int flag = DRAW_GRID;
338  drawAxis(e.gc, xl, yt, xr, yb, /*width, height,*/ AXIS_LEFT, flag);
339  drawAxis(e.gc, xl, yt, xr, yb, /*width, height,*/ AXIS_RIGHT, flag);
340  drawAxis(e.gc, xl, yt, xr, yb, /*width, height,*/ AXIS_TOP, flag);
341  drawAxis(e.gc, xl, yt, xr, yb, /*width, height,*/ AXIS_BOTTOM, flag);
342 
343  // クリッピング(EPS時のみ)
344  if (epsMode_) {
345  e.gc.setClipping(xl, yt, xr - xl, yb - yt);
346  }
347 
348 
349 
350  // データ系列の描画
351  ListIterator li = dsList_.listIterator();
352  while (li.hasNext()) {
353  DataSeries ds = (DataSeries)li.next();
354 
355  DataSeriesInfo dsi = (DataSeriesInfo)dsInfoMap_.get(ds);
356 
357  double xbase = dsi.xAxisInfo.base;
358  double ybase = dsi.yAxisInfo.base;
359  double xscale = (xr - xl) / dsi.xAxisInfo.extent;
360  double yscale = (yb - yt) / dsi.yAxisInfo.extent;
361  double factor = dsi.yAxisInfo.factor;
362 
363  double xOffset = ds.getXOffset();
364  double xStep = ds.getXStep();
365  double[] data = ds.getData();
366  int headPos = ds.getHeadPos();
367  int length = data.length;
368  int ox = 0, oy = 0;
369  int nx = 0, ny = 0;
370  boolean connect = false;
371  e.gc.setForeground(dsi.color);
372  int iofs = - headPos;
373  //System.out.println("headPos=" + headPos);
374  //System.out.println("headPos=" + headPos + " length=" + length);
375  for (int i = headPos; i < length; i++) {
376  if (Double.isNaN(data[i])) { // データなし?
377  //if (i == headPos) {
378  // System.out.println("data[i]=NaN");
379  //}
380  if (connect) {
381  //System.out.println("1 ox=" + ox + " oy=" + oy);
382  e.gc.drawLine(ox, oy, ox, oy);
383  connect = false;
384  }
385  } else { // データあり?
386  nx = xl + (int)(((xStep * (i + iofs) + xOffset) - xbase) * xscale);
387  //if (i == headPos) {
388  // System.out.println("iofs=" + iofs);
389  // System.out.println("xOffset" + xOffset);
390  // System.out.println("xbase" + xbase);
391  // System.out.println("xscale" + xscale);
392  //}
393  ny = yb - (int)((data[i] * factor - ybase) * yscale);
394  if (connect) {
395  //System.out.println("2 ox=" + ox + " oy=" + oy + " nx=" + nx + " ny=" + ny);
396  e.gc.drawLine(ox, oy, nx, ny);
397  ox = nx;
398  oy = ny;
399  } else {
400  ox = nx;
401  oy = ny;
402  connect = true;
403  }
404  }
405  }
406  iofs = length - headPos;
407  for (int i = 0; i < headPos; i++) {
408  if (Double.isNaN(data[i])) { // データなし?
409  if (connect) {
410  //System.out.println("3 ox=" + ox + " oy=" + oy);
411  e.gc.drawLine(ox, oy, ox, oy);
412  connect = false;
413  }
414  } else { // データあり?
415  nx = xl + (int)(((xStep * (i + iofs) + xOffset) - xbase) * xscale);
416  ny = yb - (int)((data[i] * factor - ybase) * yscale);
417  if (connect) {
418  //System.out.println("4 ox=" + ox + " oy=" + oy + " nx=" + nx + " ny=" + ny);
419  e.gc.drawLine(ox, oy, nx, ny);
420  ox = nx;
421  oy = ny;
422  } else {
423  ox = nx;
424  oy = ny;
425  connect = true;
426  }
427  }
428  }
429 
430 
431  }
432 
433 
434  if (epsMode_) {
435  // クリッピング解除
436  //TODO hattori
437  //e.gc.setClipping(null);
438  } else {
439  // マスク処理
440  e.gc.setBackground(borderColor_);
441  e.gc.fillRectangle(0, 0, xl, height);
442  e.gc.fillRectangle(xr + 1, 0, width, height);
443  e.gc.fillRectangle(0, 0, width, yt);
444  e.gc.fillRectangle(0, yb + 1, width, height);
445  }
446 
447  // 各軸の描画
448  flag = DRAW_AXIS + DRAW_TICK + DRAW_LABEL + DRAW_MARKER;
449  drawAxis(e.gc, xl, yt, xr, yb, /*width, height,*/ AXIS_LEFT, flag);
450  drawAxis(e.gc, xl, yt, xr, yb, /*width, height,*/ AXIS_RIGHT, flag);
451  drawAxis(e.gc, xl, yt, xr, yb, /*width, height,*/ AXIS_TOP, flag);
452  drawAxis(e.gc, xl, yt, xr, yb, /*width, height,*/ AXIS_BOTTOM, flag);
453 
454  /* ★実験 (半透明のテスト)
455  width = getSize().width;
456  height = getSize().height;
457  g.setColor(new Color(0.5f, 0.5f, 0.5f, 0.5f));
458  g.fillRect(0, 0, width, height);
459  g.setColor(new Color(0.5f, 0.5f, 0.5f, 0.5f));
460  g.fillRect(0, 0, width, height);
461  */
462 
463  // スケールをリセットする
464  if (epsMode_) {
465  //TODO hattori
466  //EPSGraphics eg = (EPSGraphics)g;
467  //eg.setScale(1);
468  }
469 
470 
471  }
472 
482  private void drawAxis(
483  GC gc,
484  //int width,
485  //int height,
486  int xl,
487  int yt,
488  int xr,
489  int yb,
490  int axis,
491  int flag
492  ) {
493  // 四隅の座標の決定
494  //int xl = leftMargin_;
495  //int xr = width - rightMargin_ - 1;
496  //int yt = topMargin_;
497  //int yb = height - bottomMargin_ - 1;
498 
499  // 軸の描画
500  AxisInfo ai = axisInfo_[axis]; // 軸情報取得
501  if (ai != null) { // 軸情報あり?
502  int tickLength = ai.tickLength;
503  int unitXOfs = ai.unitXOfs;
504  int unitYOfs = ai.unitYOfs;
505  int ascale = 1;
506  if (epsMode_) {
507  tickLength *= EPS_SCALE;
508  unitXOfs *= EPS_SCALE;
509  unitYOfs *= EPS_SCALE;
510  ascale = EPS_SCALE;
511  }
512  // 軸
513  if ((flag & DRAW_AXIS) != 0) {
514  gc.setForeground(ai.color);
515  switch (axis) {
516  case AXIS_LEFT:
517  gc.drawLine(xl, yt, xl, yb);
518  break;
519  case AXIS_RIGHT:
520  gc.drawLine(xr, yt, xr, yb);
521  break;
522  case AXIS_TOP:
523  gc.drawLine(xl, yt, xr, yt);
524  break;
525  case AXIS_BOTTOM:
526  gc.drawLine(xl, yb, xr, yb);
527  break;
528  }
529  }
530  double base = ai.base;
531  double extent = ai.extent;
532  double scale = 1;
533  switch (axis) {
534  case AXIS_LEFT:
535  case AXIS_RIGHT:
536  scale = (yb - yt) / extent;
537  break;
538  case AXIS_TOP:
539  case AXIS_BOTTOM:
540  scale = (xr - xl) / extent;
541  break;
542  }
543  double min = base;
544  double max = base + extent;
545  if (ai.minLimitEnabled && min < ai.min) {
546  min = ai.min;
547  }
548  if (ai.maxLimitEnabled && max > ai.max) {
549  max = ai.max;
550  }
551  // ティック
552  double every = ai.tickEvery;
553  if (every > 0.0 && ((flag & DRAW_TICK) != 0)) {
554  gc.setForeground(ai.color);
555  int cfrom = (int)(Math.ceil(min / every));
556  int cto = (int)(Math.floor(max / every));
557  int pos;
558  switch (axis) {
559  case AXIS_LEFT:
560  for (int i = cfrom; i <= cto; i ++) {
561  pos = yb - (int)((every * i - base) * scale);
562  gc.drawLine(xl, pos, xl - tickLength, pos);
563  }
564  break;
565  case AXIS_RIGHT:
566  for (int i = cfrom; i <= cto; i ++) {
567  pos = yb - (int)((every * i - base) * scale);
568  gc.drawLine(xr, pos, xr + tickLength, pos);
569  }
570  break;
571  case AXIS_TOP:
572  for (int i = cfrom; i <= cto; i ++) {
573  pos = xl + (int)((every * i - base) * scale);
574  gc.drawLine(pos, yt, pos, yt - tickLength);
575  }
576  break;
577  case AXIS_BOTTOM:
578  for (int i = cfrom; i <= cto; i ++) {
579  pos = xl + (int)((every * i - base) * scale);
580  gc.drawLine(pos, yb, pos, yb + tickLength);
581  }
582  break;
583  }
584  }
585  // グリッド
586  every = ai.gridEvery;
587  if (every > 0.0 && ((flag & DRAW_GRID) != 0)) {
588  gc.setForeground(ai.gridColor);
589  int cfrom = (int)(Math.ceil(min / every));
590  int cto = (int)(Math.floor(max / every));
591  int pos;
592  switch (axis) {
593  case AXIS_LEFT:
594  case AXIS_RIGHT:
595  for (int i = cfrom; i <= cto; i ++) {
596  pos = yb - (int)((every * i - base) * scale);
597  gc.drawLine(xl + 1, pos, xr - 1, pos);
598  }
599  break;
600  case AXIS_TOP:
601  case AXIS_BOTTOM:
602  for (int i = cfrom; i <= cto; i ++) {
603  pos = xl + (int)((every * i - base) * scale);
604  gc.drawLine(pos, yt + 1, pos, yb - 1);
605  }
606  break;
607  }
608  }
609  // ラベル
610  every = ai.labelEvery;
611  if (every > 0.0 && ((flag & DRAW_LABEL) != 0)) {
612  DecimalFormat lformat = new DecimalFormat(ai.labelFormat);
613  gc.setForeground(ai.labelColor);
614  gc.setFont(ai.labelFont);
615  FontMetrics lmetrics = gc.getFontMetrics();
616  int cfrom = (int)(Math.ceil(min / every));
617  int cto = (int)(Math.floor(max / every));
618  int xpos, ypos;
619  String lstr;
620  switch (axis) {
621  case AXIS_LEFT:
622  for (int i = cfrom; i <= cto; i ++) {
623  lstr = lformat.format(every * i);
624  xpos = xl - tickLength - ascale * LABEL_GAP_LEFT
625  - ascale * lmetrics.getAverageCharWidth();
626  ypos = yb - (int)((every * i - base) * scale)
627  + (int)(ascale * lmetrics.getHeight() / 3.5);
628  gc.drawString(lstr, xpos, ypos);
629  }
630  break;
631  case AXIS_RIGHT:
632  for (int i = cfrom; i <= cto; i ++) {
633  lstr = lformat.format(every * i);
634  xpos = xr + tickLength + ascale * LABEL_GAP_RIGHT;
635  ypos = yb - (int)((every * i - base) * scale)
636  + (int)(ascale * lmetrics.getHeight() / 3.5);
637  gc.drawString(lstr, xpos, ypos);
638  }
639  break;
640  case AXIS_TOP:
641  ypos = yt - tickLength - ascale * LABEL_GAP_TOP;
642  for (int i = cfrom; i <= cto; i ++) {
643  lstr = lformat.format(every * i);
644  xpos = xl + (int)((every * i - base) * scale)
645  - ascale * lmetrics.getAverageCharWidth() / 2;
646  gc.drawString(lstr, xpos, ypos);
647  }
648  break;
649  case AXIS_BOTTOM:
650  ypos = yb + tickLength
651  + ascale * LABEL_GAP_BOTTOM
652  + ascale * lmetrics.getHeight();
653  for (int i = cfrom; i <= cto; i ++) {
654  lstr = lformat.format(every * i);
655  xpos = xl + (int)((every * i - base) * scale)
656  - ascale * lmetrics.getAverageCharWidth() / 2;
657  gc.drawString(lstr, xpos, ypos);
658  }
659  break;
660  }
661  // 単位
662  //gc.setFont(ai.unitFont);
663  FontMetrics umetrics = gc.getFontMetrics();
664  int ux, uy;
665  gc.setForeground(ai.unitColor);
666 
667  switch (axis) {
668  case AXIS_LEFT:
669  ux = xl - unitXOfs - ascale * umetrics.getAverageCharWidth();
670  uy = yt - unitYOfs;
671  gc.drawString(ai.unitLabel, ux, uy);
672  break;
673  case AXIS_RIGHT:
674  ux = xr + unitXOfs;
675  uy = yt - unitYOfs;
676  gc.drawString(ai.unitLabel, ux, uy);
677  break;
678  case AXIS_TOP:
679  ux = xr + unitXOfs;
680  uy = yt - unitYOfs;
681  gc.drawString(ai.unitLabel, ux, uy);
682  break;
683  case AXIS_BOTTOM:
684  ux = xr + unitXOfs;
685  uy = yb + unitYOfs + ascale * umetrics.getHeight();
686  gc.drawString(ai.unitLabel, ux, uy);
687  break;
688  }
689  }
690  // マーカ
691  if (ai.markerVisible
692  //&& ai.markerPos >= min && ai.markerPos <= max
693  && ((flag & DRAW_MARKER) != 0)) {
694  gc.setForeground(ai.markerColor);
695  int pos;
696  switch (axis) {
697  case AXIS_LEFT:
698  case AXIS_RIGHT:
699  //pos = yb - (int)((ai.markerPos - base) * scale);
700  //pos = yb - (int)(ai.markerPos * scale);
701  pos = yb - (int)(ai.markerPos * (yb - yt));
702  gc.drawLine(xl + 1, pos - 1, xr - 1, pos - 1);
703  gc.drawLine(xl + 1, pos, xr - 1, pos);
704  gc.drawLine(xl + 1, pos + 1, xr - 1, pos + 1);
705  break;
706  case AXIS_TOP:
707  case AXIS_BOTTOM:
708  //pos = xl + (int)((ai.markerPos - base) * scale);
709  //pos = xl + (int)(ai.markerPos * scale);
710  pos = xl + (int)(ai.markerPos * (xr - xl));
711  gc.drawLine(pos - 1, yt + 1, pos - 1, yb - 1);
712  gc.drawLine(pos, yt + 1, pos, yb - 1);
713  gc.drawLine(pos + 1, yt + 1, pos + 1, yb - 1);
714  break;
715  }
716  //gc.setPaintMode();
717  }
718  } /* else { // 軸情報なし?
719  if ((flag & DRAW_AXIS) != 0) {
720  g.setColor(nullAxisColor_);
721  switch (axis) {
722  case AXIS_LEFT:
723  g.drawLine(xl, yt + 1, xl, yb - 1);
724  break;
725  case AXIS_RIGHT:
726  g.drawLine(xr, yt + 1, xr, yb - 1);
727  break;
728  case AXIS_TOP:
729  g.drawLine(xl + 1, yt, xr - 1, yt);
730  break;
731  case AXIS_BOTTOM:
732  g.drawLine(xl + 1, yb, xr - 1, yb);
733  break;
734  }
735  }
736  } */
737  }
738 
739  // -----------------------------------------------------------------
740  // 内部クラス
745  private class DataSeriesInfo {
746 
747  // -----------------------------------------------------------------
748  // インスタンス変数
749  public AxisInfo xAxisInfo; // X軸情報
750  public AxisInfo yAxisInfo; // Y軸情報
751  public Color color; // 描画色
752  public LegendInfo legend; // 凡例情報
753 
754  // -----------------------------------------------------------------
755  // コンストラクタ
765  AxisInfo xAxisInfo,
766  AxisInfo yAxisInfo,
767  Color color,
768  LegendInfo legend
769  ) {
770  this.xAxisInfo = xAxisInfo;
771  this.yAxisInfo = yAxisInfo;
772  this.color = color;
773  this.legend = legend;
774  }
775  }
776 
777  public void setLegend(LegendPanel legend) {
778  legendPanel_ = legend;
779  }
780 
781 }
void setAxisInfo(int axis, AxisInfo ai)
XYLineGraph(Composite parent, int leftMargin, int rightMargin, int topMargin, int bottomMargin)
#define null
our own NULL pointer
Definition: IceTypes.h:57
static int min(int a, int b)
png_bytep png_bytep png_size_t length
Definition: png.h:1541
png_uint_32 i
Definition: png.h:2735
void drawAxis(GC gc, int xl, int yt, int xr, int yb, int axis, int flag)
png_infop png_uint_32 * width
Definition: png.h:2309
png_infop png_uint_32 png_uint_32 * height
Definition: png.h:2309
DataSeriesInfo(AxisInfo xAxisInfo, AxisInfo yAxisInfo, Color color, LegendInfo legend)
void addDataSeries(DataSeries ds, AxisInfo xai, AxisInfo yai, RGB rgb, String legend)
typedef int
Definition: png.h:1113
void setStyle(DataSeries ds, RGB rgb)
HashMap< DataSeries, DataSeriesInfo > dsInfoMap_
org
JSAMPIMAGE data
Definition: jpeglib.h:945
png_infop png_uint_32 flag
Definition: png.h:2159
static int max(int a, int b)
void setLegendLabel(DataSeries ds, String legend)


openhrp3
Author(s): AIST, General Robotix Inc., Nakamura Lab of Dept. of Mechano Informatics at University of Tokyo
autogenerated on Thu Sep 8 2022 02:24:06