2011/07/31

[js][canvas]中抜けのパスを描画する

このエントリーをはてなブックマークに追加
canvasのパス描画の話です。

重ねたところを中抜きさせる方法です。
逆周りのパス書くと相殺されるようです。

●逆順のパスを描く



基準となるパスと、逆周りのパスを重ねると、重複したところが抜けます。arcメソッドの最後の引数はtrueとfalseでパスの向きが変わるような仕様でした。こうやって使うためのものなのか、というのが解った。

// 中空きのパスなら問題なく描画できる
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.fillStyle = "red";
ctx.beginPath();
ctx.arc(100, 100, 100, 0, Math.PI * 2, true);
ctx.arc(100, 100, 80, 0, Math.PI * 2, false);
ctx.fill();
ctx.fillStyle = "blue";
ctx.beginPath();
ctx.arc(200, 100, 100, 0, Math.PI * 2, true);
ctx.arc(200, 100, 80, 0, Math.PI * 2, false);
ctx.fill();





円と、逆回転のパスで描いた円を僅かにスライドさせて重ねると、排他的論理和のベン図のような図形ができる。なるほど、ここまではいい。
だけどこうなると三種類の円での排他的論理和のベン図は無理そうです。
当然、上記の円を三つ重ねても望みどおりの図形はできない。

うーむ。
やっぱりまだ納得がいっていない。
完全に、すっぽり中空の図形だったら問題はないのです。だけど中が抜ける図形であることが描画前にわかってない場合は、内包判定しないといけなくて、これは限りなく面倒でしょう。


●globalCompositeOperationを使う方法


globalCompositeOperationを使うことでも、似たようなことはできます。

globalCompositeOperation="source-out"とかやれば、すでに描画されてるところを背景色で塗りつぶすように指定ができるわけです。

Canvasリファレンス - globalCompositeOperation = "合成方法"
http://www.htmq.com/canvas/globalCompositeOperation.shtml

感じとしては、前者の方法(逆順のパスを描く方法)のほうが、塗りつぶしの描画が一回で住む分、きっと高速でしょう。

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
// source-overで上書き(初期値)
// source-out(xor)で排他描画
ctx.globalCompositeOperation = "source-over";
ctx.fillStyle = "red";
ctx.beginPath();
ctx.arc(100, 100, 100, 0, Math.PI * 2, true);
ctx.fill();
ctx.globalCompositeOperation = "source-out";
ctx.beginPath();
ctx.arc(100, 100, 80, 0, Math.PI * 2, true);
ctx.fill();
ctx.globalCompositeOperation = "source-over";
ctx.fillStyle = "blue";
ctx.beginPath();
ctx.arc(200, 100, 100, 0, Math.PI * 2, true);
ctx.fill();
ctx.globalCompositeOperation = "source-out";
ctx.beginPath();
ctx.arc(200, 100, 80, 0, Math.PI * 2, true);
ctx.fill();




もちろん、描画されているかどうかで判断されるので背景が描画されてたら使えないのです。
これも条件が厳しすぎて、まあ使い勝手がいいとは言えない。


●fill("everodd")を使う方法

追記:20161017

久しぶりにcanvasをいじってたら、どうやら塗りつぶしのタイミングで奇遇規則を指定できるようなので補足しておきます。
この記事の公開当時からこの設定があったかどうかは不明です。
ctx.fill("everodd");
fillを呼ぶタイミングで、evenoddを指定すると偶数奇数ルール(奇偶規則)が設定されます。
なおnonzeroを指定すると、省略時と同じ非ゼロ回転数ルールとなります。

うーん、こんなに簡単に…。

http://stackoverflow.com/questions/12446790/using-even-odd-fill-on-html-canvas

2011/07/21

MacOSX Lion発売と、その他リニューアル

このエントリーをはてなブックマークに追加


MacOSX 10.7(Lion)が発売されました。
AppStoreで2600円です。

アップル - Mac
http://www.apple.com/jp/mac/

・同時に、MacBookAir、MacMini一新
MacMini、こんな躯体でCorei7、本当に大丈夫なのかと思ってしまう。熱暴走しそうで、怖い。
MacMiniのServerはこの躯体にHDD二台も搭載できるのですか。どうやって入ってるんだろう。すごすぎる。

・MacMiniにDVDドライブがなくなった
MacBookAirにもないからね。DVDは壊れやすいパーツだし、そっちに未来はないと見ているわけですね。
Lionの提供もAppStore経由しかないようで、もはやDVDお役御免とばかりに、そっちに一気になだれ込む気ですね。

・MacBookがなくなった
まあ確かに素材だけの違いで、MacBookProとスペックは何年か横並びでした。

・Thunderboltは、さすがにまだ様子見したい
でもまあ、邪魔になるものでもないので、先行投資という感じで、使わないで放置してても別によさげではある。
強力な潜在能力は感じます。そのうち、USBメモリならぬ、Thunderboltメモリとか、巷に溢れるわけですね。USBメモリのように互換性に守られて自然と広まるような感じじゃないから、出だしのコストパフォーマンスはよくないだろうなあ。

・iWork11はまだでした
残念。ていうか11後半に差し掛かっております。


Macのリリースログを残しておくのは、どのくらいのタイミングでアップデートされるかを予想するときのタイムラインのためなのです。全然まとめてないけど。

2011/07/16

tracking boids

このエントリーをはてなブックマークに追加

tracking boids - jsdo.it - share JavaScript, HTML5 and CSS



思いのほかスローライフです。

Chrome12とFirefox5で動作確認。
※クリックで分散します。


●ルール
①視界に入った自分より大きいもののなかで、最小サイズのやつを追跡する。
②近すぎるやつは引き離す。

boidsをモデルにしてますが、もはや別物になりました。


●何か暗喩的なこと
・隅っこに追い詰められても自然にほどける。
・末端では離脱するやつが出やすい。
・大規模な改革は、うまくやらないと構造そのものが散り散りになってしまうことがある。
・一つの統制された組織になるのは簡単そうで難しい。
・前に進む推進力は、引っ張る力というより、小突かれる力。

2011/07/15

MacOSX Lion間近?

このエントリーをはてなブックマークに追加


MacOSX Lionを楽しみにしています。2600円、AppStoreの起爆剤ですね。

アップデートを躊躇させる懸念は一点。
Rosettaの非サポートです。これが残念。

GoGo! Machead! - Mac OS X LionでAppleが捨てるモノ
http://ameblo.jp/gogo-machead/entry-10815303691.html

PowerPC時代のアプリを動かすためのエミュレータです。要するに古いアプリを動かす仕掛けですね。
仕事で古くから付き合いがあるアプリもあって、それらが動かなくなるのです。

IllustratorCSとPhotoShopCSが動かなくなるわけか。これは切実。まあしかし、今でも、かなり無理をしてるので、実際のところあまり利用しないのです。起動させると、動くことは動くのですが、異様に重い。

当方の環境では、MacBookProの裏にBootcampでWindows7を入れていて、もっぱらそっちがメインで、そっちにもIllustratorを入れてしまったので、それを使えば不都合はない。
ということで、悩ましくも、新しいものに飛びつこうと画策している所存でした。

IntelMac対応は、CS3からなので、以前のバージョンをそれと知らずに利用されている人は注意しましょう。
アップデートしたあとに気付いて、戻さないといけないことになるなんて非常に面倒です。

再インストール時のためのメディア作成のやりかたとか、まあ、おいおい調べよう。
なんとかなるでしょう。最悪、SnowLeopardをもう一回再インストールする覚悟のために、ファイル整理しておくことにする。