HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0309
hspailエッジがぼけた円の描画4未解決


hspail

リンク

2009/3/9(Mon) 10:23:18|NO.23772

こんにちは。
↓のようにしてアンチエイリアスをかけて円を描画することができました。

#module // DrawCircle 位置X, 位置Y, 直径, 分割数 #deffunc DrawCircle double mx, double my, double r, int div sx = mx - r sy = my - r dx = mx + r dy = my + r dr = r * div dmx = mx * div dmy = my * div x = sx y = sy repeat repeat if x > dx : break // ピクセル内をさらに div * div 個に分割し、内外判定 i = 0 : j = 0 : c = 0 repeat div repeat div if (((x*div+i) - dmx)*((x*div+i) - dmx)) + (((y*div+j) - dmy)*((y*div+j) - dmy)) < dr * dr : c++ i++ : loop j++ : i = 0 : loop d = 255 - (255 * c / (div * div)) color d, d, d pset x, y x++ : loop if y > dy : break x = sx y++ : loop return #global DrawCircle 100, 100, 30, 5

http://livedocs.adobe.com/fireworks/8_jp/fwhelp/images/fill_edg.jpg
↑の画像の右の円のようにさらにぼかした円を描画をしたいと思っているのですが、アルゴリズムが思いつかず困っています。
どなたかご教授いただけないでしょうか。よろしくお願いします。



この記事に返信する


GENKI

リンク

2009/3/9(Mon) 23:56:51|NO.23783

HSPでアンチエイリアシングといえば、GDI+を使ったこれですね。

gpmodule
http://sprocket.babyblue.jp/html/hsp_gpm.htm
Artlet2D
http://sprocket.babyblue.jp/html/hsp_artlet2d.htm


> fill_edg.jpg

JPEGなのでジャギがつぶれてますが、左のが普通のcircle命令、
真ん中がアンチエイリアシング処理済み、
右がぼかしがかかったものですね。

フィルタ使ってぼかせばいいと思います。
平均化フィルタ何回かかければよさそう。(あるいは対象要素を3*3より大きくすれば回数少なくてすむかも?)
最近は流行らないのか、いい解説サイトが見当たらないですが、このへんがわかりやすいかな。
http://www.sit.info.gifu-u.ac.jp/~nakane/cs/cpage02fui.html



natu

リンク

2009/3/10(Tue) 01:14:37|NO.23785

>フィルタ使ってぼかせばいいと思います。
>平均化フィルタ何回かかければよさそう。(あるいは対象要素を3*3より大きくすれば回数少なくてすむかも?)
フィルタのモジュールが出来上がったので、単純移動平均法によるぼかしのサンプルを作ってみました.
imgfilter.hsp の場所です:
http://www.geocities.jp/natu_oyasumi/library/imgfilter.zip

ぼかしのサンプル:

#include "imgfilter.hsp" r = 15 buffer 2, 128, 128 mref vram, 66 wx = ginfo_winx wy = ginfo_winy circle r, r, wx-r, wy-r gsel repeat 20 avfilter vram, wx, wy gcopy 2,,,wx,wy await 10 loop
ただし、画面の左下からフィルタをかけているので、左下は黒がにじんでません.
円周に沿って平均化フィルタをかけていけばよいと思います.



ほげ

リンク

2009/3/10(Tue) 23:05:58|NO.23803

中心からの距離を使ってぼかし円を描いてみた
平滑化フィルタでぼかすよりもくっきりした感じになっているので
もう少し工夫したいところだなー

#module // DrawCircle 位置X, 位置Y, 直径, ぼかし幅 #deffunc DrawCircle double mx, double my, double r, int smw sx = mx - r sy = my - r dx = mx + r dy = my + r x = sx y = sy repeat repeat if x > dx : break dis = sqrt( (x-mx)*(x-mx) + (y-my)*(y-my) ) if dis <= r{ edis = r - dis if edis < smw{ d = 255.0 * ( 1.0 - ( edis / smw )) }else :d = 0 color d, d, d pset x, y } x++ loop if y > dy : break x = sx y++ loop return #global DrawCircle 100, 100, 50, 0 DrawCircle 230, 100, 50, 1 DrawCircle 360, 100, 50, 10 DrawCircle 490, 100, 50, 20



hspail

リンク

2009/3/11(Wed) 14:30:58|NO.23818

GENKIさん、natuさん、ほげさん、ありがとうございます。
平均化フィルタですか、難しそうですね。

ほげさんのようなスクリプトをnatuさんのサンプルのようにきれいに行くように改良してみます。
完成したら投稿しますね。なので、解決はチェックしないでおきます。
よろしくお願いします。



ONION software Copyright 1997-2023(c) All rights reserved.