Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事にトラックバックする(FC2ブログユーザー)
http://ysrken.blog.fc2.com/tb.php/44-b440ad95

トラックバック

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

リファクタリング講座 - 「美少女、バストカップ数測定スクリプト」編(Part 2)

○前回のあらすじ
 ・音伎さんの「美少女、バストカップ数測定スクリプト」をリファクタリング(改良)してみたよ!
 ・データ入力部分は至極真っ当だったよ!
 ・トップバスト-アンダーバストを計算する部分はマジックナンバーだらけだったよ!
 ・カップ数を計算するコードは酷いものだったよ!
 ・ソース上だとPカップまで測れるけど、ギネス記録ではXカップまであるよ!

 ……以下、前回の続きで、ソースを解説していきます。


○市販用ブラ計測

buy_cup = "ゆったりしたのが好みならば……" + type2[Calc2(u_bust + (5 - (u_bust % 5)) / 2)] + "(" + (u_bust + (5 - (u_bust % 5))) + ")、";
buy_cup = buy_cup + "きつくてもバストを大きくみせたいならば……" + type2[Calc2(u_bust - ((u_bust % 5 ) / 2))] + "(" + (u_bust - (u_bust % 5)) + ")";
(中略)
if((difference > -13.75) && (difference < 31.25)) buy_cup = buy_cup + "、最もフィットするのは……" + jj[0];
if((difference > -13.75) && (difference < 31.25)) buy_cup2 = jj[0] + "、" +jj[1] + "、"+ jj[2] + "、"+ jj[3] + "、" +jj[4];
else buy_cup2 = "";

 ……わかrわからんわっ!!!
 いや確かに他人に見せるためのコードじゃないよ? JavaScriptだからこうして読めるけど、本来ならフリーソフト的な意味で見えないコードだから別に構わないんですけどね? でもこれ、どうやってデバッグしたんだろう?

 まず重要なのが、「5」という数字が異様に多い、ということです。でも、これはマジックナンバーというわけではありません。実は、(日本において)ブラの数字が5刻みであることが、その理由なのです(参考資料:http://kikakurui.com/l/L4006-1998-01.html)。
 基本的に、ブラジャーは「アンダーバストの長さ+内容積」で決まっています。オーダメイド品であれば、前記事で計算したようなアンダーバストが半端な長さのものも作れるのですが(例:B83・W59・H87で身長159cmの女性の場合67.3cm)、実際には65cmのものか70cmのものを選ぶしかありません。要するに、ジャストフィットというわけではない幾つかのサイズのブラから1つを装着しているというとことなのです。
 そう考えてみると、上記2行の謎の数式は、
  ・「ゆったりしたのが好みならば……」→アンダーバストは大きめにして、胸を締め付けすぎないようにカップ数を小さめにする
  ・「きつくてもバストを大きくみせたいならば……」→アンダーバストは小さめにして、その分胸を覆えるようにカップ数を大きくする
といった意味であることが窺えます。……窺うだけで解読出来るほど甘くはありませんが。
 でも、なんとか解読には成功しました。こちらです。

cout << "\n---<最適なブラ>---\n";
int UnderBust2[2], BustDiffs[6], UnderBust3[6], tmp_i;
double UBOffset[2], BraDiff[6], tmp_d;
//キツめ・ゆったりサイズを計算(UBDiffの倍数に調整)
UnderBust2[0] = static_cast(UnderBust / UBDiff) * UBDiff; //キツめ
UnderBust2[1] = UnderBust2[0] + UBDiff; //ゆったり
//アンダーバストに応じたバストカップ数を計算するためのオフセット4種
UBOffset[0] = (UnderBust - UnderBust2[0]) / 2;
UBOffset[1] = static_cast(UBDiff) / 2 - UBOffset[0];
//トップバストとアンダーバストとの差の候補を6種生成
BustDiffs[0] = CupCalc(Bust - UnderBust2[0] - UBOffset[0]); //キツめの時
BustDiffs[1] = BustDiffs[0] + 1; //+1カップ
BustDiffs[2] = BustDiffs[0] - 1; //-1カップ
BustDiffs[3] = CupCalc(Bust - UnderBust2[1] + UBOffset[1]); //ゆったりの時
BustDiffs[4] = BustDiffs[3] + 1; //+1カップ
BustDiffs[5] = BustDiffs[3] - 1; //-1カップ
//6種の候補それぞれにおける当てはまり具合を数値化
BraDiff[0] = UBOffset[0] + fabs(Bust - (2.5 * BustDiffs[0] + UnderBust2[0] + UBOffset[0] + 2.5));
UnderBust3[0] = UnderBust2[0];
BraDiff[1] = UBOffset[0] + fabs(Bust - (2.5 * BustDiffs[1] + UnderBust2[0] + UBOffset[0] + 2.5));
UnderBust3[1] = UnderBust2[0];
BraDiff[2] = UBOffset[0] + fabs(Bust - (2.5 * BustDiffs[2] + UnderBust2[0] + UBOffset[0] + 2.5));
UnderBust3[2] = UnderBust2[0];
BraDiff[3] = UBOffset[1] + fabs(Bust - (2.5 * BustDiffs[3] + UnderBust2[1] - UBOffset[1] + 2.5));
UnderBust3[3] = UnderBust2[1];
BraDiff[4] = UBOffset[1] + fabs(Bust - (2.5 * BustDiffs[4] + UnderBust2[1] - UBOffset[1] + 2.5));
UnderBust3[4] = UnderBust2[1];
BraDiff[5] = UBOffset[1] + fabs(Bust - (2.5 * BustDiffs[5] + UnderBust2[1] - UBOffset[1] + 2.5));
UnderBust3[5] = UnderBust2[1];
//一旦表示(ソート前なので)
cout << "ゆったりタイプ→" << CupNameList[BustDiffs[3]] << "(" << UnderBust2[1] << ")\n";
cout << "キツめタイプ→" << CupNameList[BustDiffs[0]] << "(" << UnderBust2[0] << ")\n";
//当てはまり具合に応じてソート(6項目しかないのでバブルソートでOK)
for(int i = 0; i < 5; i++){
for(int j = i + 1; j < 6; j++){
if(BraDiff[i] > BraDiff[j]){
tmp_d = BraDiff[i]; BraDiff[i] = BraDiff[j]; BraDiff[j] = tmp_d;
tmp_i = BustDiffs[i]; BustDiffs[i] = BustDiffs[j]; BustDiffs[j] = tmp_i;
tmp_i = UnderBust3[i]; UnderBust3[i] = UnderBust3[j]; UnderBust3[j] = tmp_i;
}
}
}
//最適なものを表示
cout << "ピッタリタイプ→" << CupNameList[BustDiffs[0]] << "(" << UnderBust3[0] << ")\n";
//候補上位5つを表示
cout << "使用可能タイプ→";
for(int i = 0; i < 5; i++){
if((BustDiffs[i] >= 0) && (BustDiffs[i] < Cups)){
if(i != 0)
cout << ", ";
cout << CupNameList[BustDiffs[i]] << "(" << UnderBust3[i] << ")";
}
}


 ……わからないわとか言わないでくれ、これが限界だったんだ!
 元のカオスな状況(とにかく長い式)をなんとかするため、変数に置き換え置き換え、上記のようにまとめました。ただ、結局どういった基準で当てはまり度をチェックしているかはよく分かりません。作者に聞くしかないのか?


○ソース配布
 ……以上諸々の改良を加えた美少女(中略)スクリプトを無料配布します。(本家に倣って)
 http://www1.axfc.net/uploader/so/2891342.zipからダウンロードしてください。


○おまけ:某アイドルグループに対して一斉に行った結果
人物名身長(cm)TB(cm)W(cm)UB(cm)TB-UB(cm)推定Cupゆったりキツめピッタリ候補5種
天海春香158835665.018.0DD(65)E(60)D(65)D(65), E(65), E(60), C(65), F(60)
星井美希161865564.721.3FE(65)F(60)E(65)E(65), F(65), F(60), G(60), D(65)
如月千早162725564.87.2AAAA(65)A(60)AA(65)AA(65), AAA(65), A(60), A(65), AA(60)
高槻やよい145745461.512.5BA(65)B(60)B(60)B(60), A(65), C(60), B(65), A(60)
萩原雪歩155815664.516.5DD(65)E(60)D(65)D(65), C(65), E(60), D(60), E(65)
菊地真159755765.89.2AAA(70)A(65)A(65)A(65), AA(65), AA(70), B(65), AAA(70)
双海亜美158785564.213.8CB(65)C(60)B(65)B(65), C(65), C(60), D(60), A(65)
双海真美158785564.213.8CB(65)C(60)B(65)B(65), C(65), C(60), D(60), A(65)
水瀬伊織153775462.714.3CB(65)C(60)B(65)B(65), C(60), C(65), D(60), A(65)
三浦あずさ168915968.722.3FF(70)G(65)F(70)F(70), E(70), G(65), F(65), G(70)
四条貴音169906271.019.0ED(75)E(70)E(70)E(70), D(70), D(75), F(70), C(75)
我那覇響152835664.019.0ED(65)E(60)D(65)D(65), E(65), E(60), F(60), C(65)
秋月律子156855765.419.6ED(70)E(65)E(65)E(65), D(65), D(70), F(65), C(70)



おしまいっ。
関連記事
スポンサーサイト
この記事にトラックバックする(FC2ブログユーザー)
http://ysrken.blog.fc2.com/tb.php/44-b440ad95

トラックバック

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

Appendix

プロフィール

YSR

Author:YSR
「YSR」「YSRKEN」「◆YSRKENkO6Y(~2013/08/25)」「◆YSRKEN.ceVZZ(2013/08/26~)」として活動しています。
プログラミングと艦これが趣味です。
プロフ画像はCrystalDiskInfoの水晶雫ちゃんです。
主な創作物についてはhttp://ysrken.blog.fc2.com/blog-entry-76.htmlをご覧ください。

カレンダー(月別)

06 ≪│2017/07│≫ 08
- - - - - - 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 - - - - -

全記事表示リンク

全ての記事を表示する

QRコード

QR

総アクセス数

アクセス数

現在の閲覧者数:
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。