Graviness Blog

算数・数学・科学・電脳・雑記・アホの順の密度で記事が構成されます.
<< August 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >> ブログランキング・にほんブログ村へ
 
RECOMMEND
ビッグバン宇宙論 (上)
ビッグバン宇宙論 (上) (JUGEMレビュー »)
サイモン・シン, 青木 薫
RECENT COMMENT
  • 豊臣秀吉と曾呂利新左衛門から学ぶ数列の和
    優乃 (07/12)
  • 【誰か解いて】漸化式 a_(n+1) = f(n) * a_n ^ g(n) + h(n) の一般項
    優乃 (02/18)
  • 【誰か解いて】漸化式 a_(n+1) = f(n) * a_n ^ g(n) + h(n) の一般項
    S.S.+ (02/16)
  • 豊臣秀吉と曾呂利新左衛門から学ぶ数列の和
    坂井昭 (03/19)
  • d/dx(x↑↑n): 高さが定数のテトレーションの微分 - 数学的帰納法を用いる方法
    (09/30)
  • 全ての三角形は二等辺三角形
    優乃 (09/28)
  • 全ての三角形は二等辺三角形
    亀レス (09/28)
  • 全ての三角形は二等辺三角形
    優乃 (09/24)
  • 全ての三角形は二等辺三角形
    亀レス (09/23)
  • 【未解決】新しい演算子を創る
    $_ (09/10)
RECENT TRACKBACK
MOBILE
qrcode
PROFILE
無料ブログ作成サービス JUGEM
 
【解決】補正後の値を求める連続関数
グラデーション文字列自動生成の作成時,色の彩度・輝度補正のところででてきた問題です.特に一般的でもなく,面白みはありませんが,厳密には解けてないので,メモ程度です.

上記アプリケーションでは,彩度・輝度の値に対して,「大きくする」「変更しない」「小さくする」という選択項目があります.
このままでは計算できないので,選択項目に対する“重み”として,以下のように値を割り付けます.
「大きくする」:+0.5
「変更しない」:0.0
「小さくする」:-0.5

“重み”としたのは,彩度・輝度が単純に足し引きできるようなものではないからです.彩度・輝度は,一般的に0%〜100%(0.0〜1.0)の範囲をとります.
さて,既存の彩度・輝度の値に対して,「大きくする」などを選択されたとき,彩度・輝度をどう大きくするのかが問題です.

以下で示すpの値が,補正前の彩度・輝度値,sが「大きくする」などに割り付けられた値,p'が補正後の彩度・輝度値です.
【問題】
p' = f_p(s)のグラフ既知の値pと,既知の値である補正量sがある.pとsは以下を満たす.
0 ≦ p ≦ 1
-1 ≦ s ≦ 1
pの補正後の値p'は,補正量sによって求められ,sの値によって以下の条件を満たす.
1) s = -1のとき,p' = 0
2) s = 0のとき,p' = p
3) s = 1のとき,p' = 1
4) p = 0のとき,p' = p = 0
5) p = 1のとき,p' = p = 1
6) -1 ≦ s < 0,p ≠ 0のとき,p'<p
7) 0 < s ≦ 1,p ≠ 1のとき,p'>p
また,p'はpと同様,以下を満たす.
0 ≦ p' ≦ 1
以下のように定義したとき
p' = fp(s)
fp:連続関数
fpの例を挙げよ.

回答】
fpをsの2次関数とする.
fp(s) = a * s2 + b * s + c
条件より,
fp(-1) = a - b + c = 0
fp(0) = c = p
fp(1) = a + b + c = 1
これを解いて,
fp(s) = (1 / 2 - p)s2 + (1/ 2)s + p

偽回答である所以は,条件4), 5), 6), 7)を満たしていないこと f--;
多分,多分だが,4), 5), 6), 7)を同時に満たすfpは存在しない(床関数デルタ関数などの連続していない関数の使用を除く).せめて,条件1), 2), 3), 6) ,7)を満たすfpはないものだろうか・・・.

仕方ないので,プログラム上では以下のように処理した.
p_ = (1 / 2 - p) * (s * s) + (1 / 2) * s + p
if (p_ < 0)
p_ = 0.0
if (p_ > 1)
p_ = 1.0
コメント
from: 優乃   2007/11/12 12:16 AM
記事を投稿した端から諦めモードだけど,どう考えても,全ての条件を満たす解はない.
プログラムのことも考えれば,計算も簡単だし,単純に線形補間した以下が最適解だろう.(解決)

if (-1 <= s && s <= 0) {
  p_ = p(s + 1)
} else {
  p_ = (1 - p)s + p
}
コメントする









 
トラックバック
この記事のトラックバックURL
http://blog.graviness.com/trackback/706292
 

(C) 2017 ブログ JUGEM Some Rights Reserved.