2014年4月6日日曜日

モチーフの形状による分類

モチーフをいくつかの形状で分類してみたいと思います。

花柄型モチーフ

六点モチーフ

60度ごとに配置してモチーフとし、亀甲配置でパターンを作成した例です。

碁盤・石垣配置には 90, 180度、亀甲配置には 60, 120, 180度を利用すると綺麗なパターンを作りやすいと思います。

花柄になりやすいのでこの名前を付けましたが、様々な条件によって花とは縁遠いものとなります。

蝶々型モチーフ

scale を利用し、線対称クローンで作成したモチーフです。

石垣配置の例

作りによっては碁盤配置と石垣配置が混ざって見える、不思議なモチーフです。

モチーフの数による分類

モチーフの枚数による分類をしてみようと思います。

単数型モチーフ

配置による分類を参考にしてください。

二枚型モチーフ

市松型モチーフ

モチーフを二種類利用して一枚のモチーフにするものです。

碁盤型

石垣配置の単純化を回避するために使われていることもあります。

石垣型

碁盤配置の単純化を回避するために使われていることもあります。

縦横比が1:1の場合は45°傾けると同じにパターンになります。

三枚以上

増やせば増やすほど豪華になっていきます。キリがないので割愛します。

2014年4月5日土曜日

モチーフの配置による分類

シームレスパターンの作成に興味を持った時に、勝手に名前を付けて分類していたものです。

分類

碁盤配置

碁盤の目のように配置する最も単純なパターンです。

石垣配置

モチーフを互い違いに並べることでパターンに変化をもたせています。

亀甲配置

石垣配置の縦横比を 1 : 1.732... にすると正六角形を敷き詰めることができるので、亀甲配置として区別します。

2014年4月4日金曜日

Inkscape Extension用同梱モジュール

基本セット

inkex.py

simplestyle.py

formatStyle(attr)
引数

属性値の辞書

戻り値

文字列

サンプル
import simplestyle
...
    attr = {'stroke':'none','fill':'#000000',...}
    obj.set('style', simplestyle.formatStyle(attr))
<svg>
...
    <path 'style'='stroke:none;fill:#000000;...' .../>

属性値が少ない場合は直接設定できますが、多い場合や変数が混ざっている場合はこれを使う方が良いでしょう。

simplepath.py

parsePath(d)
引数

pathのd属性

戻り値

[[command, [座標リスト]],...]

参考

cubicsuperpath.parsePath()メソッドで使用されている。
座標データが欲しいだけならそちらの方が良い。

cubicsuperpath.py

parsePath(d)
引数

pathのd属性

戻り値

[[[[入る側ハンドルのX座標, Y座標],[ノードのX座標, Y座標],[出る側ハンドルのX座標, Y座標]],...],[あれば合成パスのデータが続く],...]

使用例
import cubicsuperpath
...
    for id, path in self.selected.iteritems():
        for pathData in cubicsuperpath.parsePath(path.get('d')):
            for pointData in pathData:
                handleIn  = pointData[0]
                node      = pointData[1]
                handleOut = pointData[2]
                ...
                attr = {
                    inkex.addNS('cx', 'sodipodi'): str(node[0]),
                    inkex.addNS('cy', 'sodipodi'): str(node[1]),
                    ...
                }

simpletransform.py

fuseTransform(path)

指定パスに適用されているtransform属性をd属性に適用してtransform属性を削除します。

引数
node(svg:path)
戻り値
---
使用例
import simpletransform
...
    for id, path in self.selected.iteritems():
        simpletransform.fuseTransform(path)
補足

roughBBox(cubicPath)

cubicPathデータ内で最大最小の座標を返します。

引数
cubicPath(cubicsuperpath.parsePath(d)の戻り値)
戻り値
[minX, maxX, minY, maxY]
使用例
import simpletransform, cubicsuperpath
...
    bbox = simpletansform.roughBBox(cubicsuperpath.parsePath(path.get('d')))
refinedBBox(cubicPath)

cubicPathデータで描かれるパスのバウンディングボックスの座標を返します。

引数
cubicPath(cubicsuperpath.parsePath(d)の戻り値)
戻り値
[minX, maxX, minY, maxY]
使用例
import simpletransform, cubicsuperpath
...
    bbox = simpletansform.refinedBBox(cubicsuperpath.parsePath(path.get('d')))

※roughBBox()とrefinedBBox()の違い

computeBBox(pathlist)

複数パス(Font除く)全体のバウンディングボックスの座標を返します。

引数
pathlist
戻り値
[minX, maxX, minY, maxY]
使用例
import simpletransform
...
    alist = []
    for id, path in self.selected.iteritems():
        alist.append(path)
    bbox = simpletransform.computeBBox(alist)

引数はパスリストのみを受け付けるので、idが入っているとエラーが返ってきます。
選択アイテムのバウンディングボックスを取得する場合は上のようにリストの作りなおしをする必要があります。

その他
d属性を持たないオブジェクトのバウンディングボックス(Font除く)も取得でき、パスの変換も必要ないので、refinedBBox()より使い勝手が良いかもしれません。

Links