TITLE:PathIteratorからSVGを生成
#navi(../)
#tags()
RIGHT:Posted by &author(aterai); at 2009-03-30
*PathIteratorからSVGを生成 [#h0bc8b69]
ShapeからPathIteratorを取得し、このPathをSVGに変換します。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(http://lh3.ggpht.com/_9Z4BYR88imo/TQTQ-2m7pMI/AAAAAAAAAgc/B55RHlb8ajM/s800/PathIterator.png)

**サンプルコード [#gabf6062]
#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;
      case PathIterator.SEG_LINETO:
        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;
}
}}

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

-%%対応しているのは、PathIterator.SEG_MOVETO、PathIterator.SEG_LINETOのみ%%

**参考リンク [#p458d4b4]
-[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 自由に描く。]

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

#comment