---
category: swing
folder: PathIterator
title: PathIteratorからSVGを生成
tags: [Icon, Shape, PathIterator]
author: aterai
pubdate: 2009-03-30T14:13:46+09:00
description: ShapeからPathIteratorを取得し、このPathをSVGに変換します。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTQ-2m7pMI/AAAAAAAAAgc/B55RHlb8ajM/s800/PathIterator.png
hreflang:
    href: https://java-swing-tips.blogspot.com/2013/02/get-svg-from-pathiterator.html
    lang: en
---
* 概要 [#summary]
`Shape`から`PathIterator`を取得し、この`Path`を`SVG`に変換します。

#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTQ-2m7pMI/AAAAAAAAAgc/B55RHlb8ajM/s800/PathIterator.png)

* サンプルコード [#sourcecode]
#code(link){{
private StringBuilder makeStarburstSvg(
      PathIterator pi, int sz, String style, String desc) {
  StringBuilder sb = new StringBuilder();
  sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
  // ...
  sb.append(String.format(
      "<svg width=\"%d\" height=\"%d\" xmlns=\"%s\">%n", sz, sz, w3));
  sb.append(String.format("  <desc>%s</desc>%n", desc));
  sb.append("  <path d=\"");
  double[] c = new double[6];
  while (!pi.isDone()) {
    switch (pi.currentSegment(c)) {
      case PathIterator.SEG_MOVETO:
        sb.append(String.format("M%.2f,%.2f ", c[0], c[1])); break;
        sb.append(String.format("M%.2f,%.2f ", c[0], c[1]));
        break;
      case PathIterator.SEG_LINETO:
        sb.append(String.format("L%.2f,%.2f ", c[0], c[1])); break;
        sb.append(String.format("L%.2f,%.2f ", c[0], c[1]));
        break;
      case PathIterator.SEG_QUADTO:
        sb.append(String.format("Q%.2f,%.2f,%.2f,%.2f ",
                                c[0], c[1], c[2], c[3]));
        break;
      case PathIterator.SEG_CUBICTO:
        sb.append(String.format("C%.2f,%.2f,%.2f,%.2f,%.2f,%.2f ",
                                c[0], c[1], c[2], c[3], c[4], c[5]));
        break;
      case PathIterator.SEG_CLOSE:
        sb.append("Z");
        break;
    }
    pi.next();
  }
  sb.append(String.format("\" style=\"%s\" />%n</svg>%n", style));
  return sb;
}
}}

* 解説 [#explanation]
上記のサンプルでは、`Shape`から`PathIterator`を取得しそのパスを辿って`SVG`ファイルを生成しています。

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/java/awt/geom/PathIterator.html PathIterator (Java Platform SE 8)]
- [http://www.hcn.zaq.ne.jp/___/SVG11-2nd/index.html SVG 1.1 仕様 (第2版) 日本語訳]
-- [http://www.hcn.zaq.ne.jp/___/SVG11-2nd/paths.html パス – SVG 1.1 (第2版)]
- [http://www.w3schools.com/svg/svg_path.asp SVG Path]
- [http://www.inkscape.org/ Inkscape 自由に描く。]

* コメント [#comment]
#comment
- サンプルコードにはコードすべて表示(記入)した方がいいと思います。 -- &user(名無し); &new{2012-03-27 (火) 21:48:06};
- 追記:そうじゃなくてはわかりにくいので。例えばJavaDriveさんのように -- &user(名無し); &new{2012-03-27 (火) 21:48:48};
-- ご指摘ありがとうございます。現状、大きめのサンプルではコードを丸ごと貼り付けるとページが長くなる、小さいサンプルでもあまり意味のないコードが毎回でてくる…、などの理由でコードの一部(`Tips for the Code Snippets`)だけ表示するようにしています。コード全部を見たい場合は、`src.zip`を展開して好みのエディタで開くか、リポジトリ(`svn repository`)をたどってくださいという姿勢なんですが、自分でもたまにリポジトリをクリックしていくのが面倒なことがあるので、一気に`*.java`にジャンプできるようなリンクでも追加できないか検討してみます。 -- &user(aterai); &new{2012-03-28 (水) 15:58:59};
- `<pre>`の右上の`view plain`リンクをクリックすると`svn`リポジトリのソースコードを表示するようにしてみました。`MainPanel.java`固定で、`HogeHogeUI.java`などにはリンクしていませんが、面倒なので多分このままです。 -- &user(aterai); &new{2012-06-14 (木) 21:25:49};
- 現状のままで良いかと。主要な部分だけ見えれば参考になりますしおすし --  &new{2013-02-08 (金) 09:55:45};
-- おすし。もうすこし工夫すれば、多少見やすく(使いやすく)なりそうな気はするのですが、上にも書いたようにしばらくはこのままです。 -- &user(aterai); &new{2013-02-09 (土) 00:00:18};

#comment