phpで色順のソート


#ffffff、#000000、#ccffcc.......などを
これらの文字順ではなく、
色が似た順にソートしたいのですが可能でしょうか。

可能だとしたら、ソートの方法を教えて下さい。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/08/22 17:58:10
  • 終了:2011/08/26 12:56:18

ベストアンサー

id:otchy210 No.4

Otchy回答回数8ベストアンサー獲得回数32011/08/23 15:12:48

ポイント100pt

他の方の言われている回答と合わせて、こんな風にしたら概ね似た色を選べると思います。

1) RGB それぞれの数値を取り出す。

2) RGB を X 軸 Y 軸 Z 軸と見なす。

3) 各色同士の空間的な距離を計算する。(数学の教科書を引っ張り出してきて下さい)

4) 総距離が最短になるよう、全ての色を一筆書きでつなぐ軌跡を割り出す。

この 4 の順番が似た色の順になっているはずです。

id:worldtravel

ありがとうございます。

これまた更に難しそう.....--;

既に誰かが作った関数か何かが

どこかにあるかなと思っていたのですが

無さそうですね。

2011/08/24 00:06:16

その他の回答(3件)

id:mdfmk No.1

mdfmk回答回数981ベストアンサー獲得回数1972011/08/22 18:13:28

ポイント10pt

http://saito-art.com/blog/blosxom.cgi/etc/color.html

こちらに色相順に並べるphpのソースが公開されていました。

こういった事をされたいということで合っていますか?

id:worldtravel

ありがとうございます。

似ているようですけど違いました。

手元にランダムな色のデータがあるのですが、

これを似ている色順に並び替えたいのです。

2011/08/22 18:23:23
id:TransFreeBSD No.2

TransFreeBSD回答回数664ベストアンサー獲得回数2652011/08/22 19:26:55

ポイント10pt

http://www.php.net/manual/ja/function.usort.php

色同士の大小関係を判断する関数を定義できれば可能です。

問題は色空間は一次元的ではない、ということです。

黒、白、赤、青とそれぞれの中間色があった時、それを1次元で並べる事が可能でしょうか?

不完全でも目的に合致するような大小関係を矛盾なく定義できるかだと思います。

id:worldtravel

ありがとうございます。

確かに何となく思っているだけで

100色くらいの色を自分で並べてみろと言われると

どう並べればよいか、という時点で悩みそうです。

2011/08/24 00:06:28
id:kyart No.3

kyart回答回数9ベストアンサー獲得回数12011/08/23 01:14:21

ポイント10pt

c13a72、cccccc、e45991はそれぞれ最初の二文字がR(赤)、真ん中の二文字がG(緑)、最後の二文字がB(青)を表してますよね。それをsubstrか何かで、切り分けて、hexdecで10進数にしてから、似せたい色味に合わせてソートしたらどうでしょうか?あるいは面倒ですが、その3つの値をそれぞれ比較する関数を作って、差の少ない順に似ていると判断するとか。

他の方も指摘しているように色というのは多面的(色相以外にも、彩度とか明度とか)なので単純には何をもって「似ている」と判断するか難しいように思いますが、似ているとは何かがある程度明確ならできそうですね。

id:worldtravel

ありがとうございます。

やはり、簡単にはいかなそうですね.....。

2011/08/24 00:03:07
id:otchy210 No.4

Otchy回答回数8ベストアンサー獲得回数32011/08/23 15:12:48ここでベストアンサー

ポイント100pt

他の方の言われている回答と合わせて、こんな風にしたら概ね似た色を選べると思います。

1) RGB それぞれの数値を取り出す。

2) RGB を X 軸 Y 軸 Z 軸と見なす。

3) 各色同士の空間的な距離を計算する。(数学の教科書を引っ張り出してきて下さい)

4) 総距離が最短になるよう、全ての色を一筆書きでつなぐ軌跡を割り出す。

この 4 の順番が似た色の順になっているはずです。

id:worldtravel

ありがとうございます。

これまた更に難しそう.....--;

既に誰かが作った関数か何かが

どこかにあるかなと思っていたのですが

無さそうですね。

2011/08/24 00:06:16
  • id:taknt
    これらの文字順が 色が似た順になります。

    というか 色が似た順というのも難しい。
  • id:worldtravel
    ありがとうございます。

    例えば、#c13a72、#cccccc、#e45991、を文字順でソートすると
    ピンク、グレー、ピンク、となってしまいます。

    これを、ピンク、ピンク、グレー、と言うようにしたいのですが.....

    無理なのでしょうか。。。。。
  • id:otchy210
    回答の追記ですが、4) の部分はいわゆる「最短経路問題」と言われる種類のアルゴリズムになります。
    別途調べれば方法は見つかるかと思います。
  • id:mdfmk
    分からないなりにしつこく回答しますが、
    色は決まったパレットなどはあるのでしょうか?

    例えばWebセーフカラーとか。


    もしあるようでしたら配列を作って、
    並べたい順番に合わせてラベル付けをすれば良いのではないでしょうか。
    0: #000000
    ・ ・ ・
    ・ ・ ・
    ・ ・ ・
    55: #ccffcc
    ・ ・ ・
    ・ ・ ・
    ・ ・ ・
    217: #ffffff


    といった具合です。
    で、このテーブルに無い色は一番近い色との差を取って、
    その差の大きさによって並べ順を決めるイメージです。
  • id:worldtravel
    ありがとうございます。

    > 色は決まったパレットなどはあるのでしょうか?

    いえ、ありません。
    漠然としています。
    すみません。

    そもそも、考えていることに近いことをした人がいて
    その関数か何かがどこかにあると嬉しいな〜くらいに考えていました。

    仰っている方法は何となくわかってきたのですが、
    例えば、#c13a72、と、#e45991、は個人的には近い色と感じているのですが
    文字にすると凄く離れている感じになってしまいます。
    これを「近い」と判断させる設定を、まず手作業でとなると、
    相当暇なときでないとできない気がするので諦めます ^^;;;

    それ以遠に先ずはどう並べたいのかを考えなければダメですよね。
  • id:otchy210
    4) のソート部分は「巡回セールスマン問題」と言うらしく、解法が簡単でなかったので、そこはざっくりとしたアルゴリズムですが、試しに JavaScript で実装してみました。
    http://jsdo.it/Otchy/sort_colors
    何となく綺麗に並べられているかなーと思います。
  • id:TransFreeBSD
    id:otchy210さん
    意外と簡単に出来るものですね。勉強になります。
    色空間をLabとかにしたらどうだろうと、ちょっと思ったけれどRGBとどれくらい違うかはわかんないです。
    TSP solverって検索すると色々出てはくるけど、よくわかんないです。
  • id:worldtravel
    Otchyさん、ありがとうございます。
    私のイメージとしてはこのような感じでした。
    じっくりと色々な色の場合で試させて頂きます。
    恐らくこちらを使わせて頂きます。
    ありがとうございます!!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません