Entries

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

○概要

・バスト○△cm、あの娘の、ブラジャーのカップ数を正確に知りたい
・自分が作ったのオリジナルキャラクターの3サイズを決めたいけど、いまいち基準がよくわからない

 そんなときに威力を発揮する、スクリプトです。

 この文は、音伎さんが開発した、「美少女、バストカップ数測定スクリプト」の冒頭に書かれている文章です。
 ご存じない方のために説明すると、このサイトを利用すると、身長・バスト・ウエストからカップ数を推定することができます。これが凄いと思うかは人によると思いますが、私は普通に凄いと思いました。
 ……で。私はこのサイトをローカルに移植してしまいました。

女性のカップ数を計算する方法を、あなたは知っていますか。
アンダーバストとトップバスト(いわゆる「バスト」は後者)の差を測ることで、2.5cm刻み(例:Aカップは10cm、Dカップは17.5cm)のカップ数が分かるのです。
が、バストに比べてアンダーバストが公開される例はとても少なく(アイドルやエロゲキャラの紹介ですら身長・バスト・ウエスト・ヒップぐらい)、結果として、おおまかなカップ数を推定するために、アンダーバストを予測する必要があります。
割と面倒な計算になるそれを自動的にやってくれる……そんな夢のようなツールは、既に存在しています。そう、知る人ぞ知る、音伎さんの「美少女、バストカップ数測定スクリプト」です。
(http://www.d9.dion.ne.jp/~ne1gi/bustcheck/cupchecker.html)
身長・バスト・ウエストを入力してボタンを押すだけで、推定カップ数や推奨されるブラのサイズなどを表示してくれるという、実際の女性にも役立ちそうなものなのですが、既に更新が止まったサイト上にあるコンテンツなので、将来的に消えてしまう恐れがあります。
そこで今回、僭越ながら、ローカルで動作するソフトウェアとして作成させていただきました。

(URLはhttp://www.vector.co.jp/soft/win95/amuse/se497991.html)
 もちろん、ページ保存して拡張子を.htaにすれば本家版をローカルで使えるのですが、本家版の場合、表示桁数が無駄に多いなどといった問題があります。と言うかそれだと面白くありませんし
 そこで、ここでは本家版のソースコード(JavaScriptなのでバッチリ読める)を振り返りながら、より分かりやすいコードに整形してみようと思います。


○データ入力

//身長、バスト、ウエストの入力を取込み
height = parseFloat(eval("document.Form.Height").value);
bust = parseFloat(eval("document.Form.Bust").value);
waist = parseFloat(eval("document.Form.Waist").value);

 まあ見たまんまですね。ページ上のフォームに入力されたデータを取り込んでいます。
 こんなデータは構造体にしろよと思うのですが、別に大量のデータを処理する用途ではないので、やっつけ的なデータ管理でも問題はないのかもしれません。


○トップバスト-アンダーバストを計算

//バストサイズ計算中
if (document.Form.bai[0].checked == true) difference = (bust - (height * 0.54)) + (((height * 0.38) - waist) * 0.73) + ((height - 158.8) * 0.1087);
else difference = (bust - (height * 0.54)) + (((height * 0.38) - waist) * 0.73) + ((height - 158.8) * 0.3261);
risou_bust = (height * 0.54) + "(" + (bust - height * 0.54) +")";
risou_waist = (height * 0.38) + "(" + (waist - height * 0.38) +")";
risou_hip = (height * 0.54);

    _ □□    _      ___、、、
  //_   [][]//   ,,-―''':::::::::::::::ヽヾヽ':::::/、  誰  書   .こ
//  \\  //  /::::::::::::::::::::::::::::::i l | l i:::::::ミ  だ   .い   の
 ̄      ̄   ̄/ /:::::::::,,,-‐,/i/`''' ̄ ̄ ̄ `i::;|  あ  .た   ソ
―`―--^--、__   /:::::::::=ソ   / ヽ、 /   ,,|/   っ  の   |
/f ),fヽ,-、     ノ  | 三 i <ニ`-, ノ /、-ニニ' 」') !! は   ス
  i'/ /^~i f-iノ   |三 彡 t ̄ 。` ソ ハ_゙'、 ̄。,フ | )         を
,,,     l'ノ j    ノ::i⌒ヽ;;|   ̄ ̄ / _ヽ、 ̄  ゙i )
  ` '' -  /    ノ::| ヽミ   `_,(_  i\_  `i ヽ、 ∧ ∧ ∧ ∧
     ///  |:::| ( ミ   / __ニ'__`i |  Y  Y Y Y Y
   ,-"        ,|:::ヽ  ミ   /-───―-`l  |  //     |
   |  //    l::::::::l\    ||||||||||||||||||||||/  |     // |
  /     ____.|:::::::|    、  `ー-―――┴ /    __,,..-'|
 /゙ー、,-―'''XXXX `''l::,/|    ー- 、__ ̄_,,-"、_,-''XXXXX |
/XX/ XXXXXXXXXX| |         _,  /ノXXXXXXXXXX|

 はい、ワケが分かりませんね。このマジックナンバー達がどういう意味か、一旦振り返ってみましょう。

 そもそもカップ数を計算するには、トップバスト(直立で立った状態で、乳房のもっとも膨らんでいる乳首の上を水平に通る周囲長)とアンダーバスト(直立で立った状態で、乳房のふくらみの下側を水平に通る周囲長)を測定することが必要です。しかし、よくある「B・W・H」表記で分かるのはトップバストだけで、アンダーバストの値は普通分からないものです。
 そこで音伎さんは、「ゴールデンカノン」と呼ばれるプロポーション値(B:身長×0.54 W:身長×0.38 H:身長×0.54)を利用して、この値を推定することにしました。日本人女性の平均身長(1995年度では158.8cm)におけるBWHを計算すると、B85.8・W60.3・H85.8となります。これぐらいのプロポーションを持つ女性をアイドル・AV女優・風俗嬢で探してみると、平均してDカップであることが判明しました。つまり、同じような身長なら、85.8cmからの差で、カップ数がおおよそ推定できることになります(胸以外同体格だとアンダーバストにほとんど差が出ないため)。

 だけど、これだけだとまだ不完全です。例として、B78・W55・H79で身長149cmの女性を考えてみましょう。ゴールデンカノンではB80.5・W56.6・H80.5が理想なので、Dカップと推定される……はずですが、いやそれはないわ。
 要するに、同じような体型でも、背が高い人と低い人とではカップ数に差があると考えるのが合理的ということです。
 そこで音伎さんは、身長が23cm違う毎にカップ数を1つ上下させることにしました。これで上記の女性はCカップであると(無事に)推定されることになります。
 他にも、ウエスト太い奴と細い奴が同じカップ数とかおかしくね?ということで、ウエストが3.42cm違う毎にカップ数を1つ上下させるといった補正も加えました。この工夫により、B90・W65・H89で身長153cmの女性がFカップ扱いになってしまうことが無くなります(正しくはEカップ)。
 以上を踏まえてC++で清書するとこうなります。(変数名の意味は察して下さい)

const double BestHeight = 158.8;
const double perBust = 0.54, perWaist = 0.38, perHip = 0.54;
const double perBustWaist = 2.5 / 3.42;
const double perBustHeight = 2.5 / (BestHeight - 15 / (perBust - (BestHeight * perBust - 17.5) / BestHeight));
const double perBustHeight2 = perBustHeight * 3;

double BestBust, BestWaist, BestHip;
BestBust = Height * perBust;
BestWaist = Height * perWaist;
BestHip = Height * perHip;
double BustDiff;
if(Mode == 0)
BustDiff = (Bust - BestBust) - ((Waist - BestWaist) * perBustWaist) + ((Height - BestHeight) * perBustHeight);
else
BustDiff = (Bust - BestBust) - ((Waist - BestWaist) * perBustWaist) + ((Height - BestHeight) * perBustHeight2);

※作者の書いた根拠文章を元に定数を決めていますので、ソースコードとは微妙にズレています。


○カップ数を計算

if (height <= 0.0) num = 20;
else if(bust <= 0.0) num = 21;
else if(waist <= 0.0) num = 22;
else if(difference < -13.75) num = 0;
else if(difference < -11.25) num = 1;
(中略)
else num = 19;

 ……はい。いけません。延々とelse ifを重ねる、見本のようなダメダメコードですね。そもそも、入力値チェックをこんなところに置くのがおかしいのです(なぜトップバスト-アンダーバストを計算する前にチェックしないし……)。
 後、似たようなコードがずっと後方のCalc2関数にも書いてありますが、どう考えても統一するべきです。
 ルール上、バスト差が0cm以上3.75cm未満にある時はAAAカップですので、17.5cm(Dカップの標準バスト差)だけここの数値にオフセットが掛かっている(158.8cmでゴールデンカノンだとDカップと上で設定しているため)と推定されます。要するに、あらかじめ17.5cm足しておけば、同じコードで判定できるのです。当然そうすべき……でしょう

int CupSize;
CupSize = static_cast(BustDiff / 2.5);
if(CupSize < 0)
CupSize = 0;
//Cupsはカップの種類数(最大のところに、あらかじめ「Pカップ以上」などといったものを用意しておく)
if(CupSize >= Cups)
CupSize = Cups - 1;

 もちろん、カップ数表示辺りはお好みで。


○豆知識 誰かさんが「くっ」とか言いそうな凄まじいおっぱいの話
 現実世界での話。自然乳(整形ではない乳房のこと)の大きさでギネス記録を持っているのはノーマ・スティッツ(本名はアニー・ホーキンズ・ターナー)さん。彼女のトップバスト-アンダーバストはなんと27インチ! 日本流で数えるとXカップですな。
 一方、拡張乳(シリコン等で大きくした乳房のこと)のギネス記録はマキシ・マウンズさんで、トップバスト-アンダーバストは62.23cm。日本流だとUカップとなります。自然乳の方が記録が上、というのは興味深い。

 続きは次回。
関連記事
スポンサーサイト
この記事にトラックバックする(FC2ブログユーザー)
http://ysrken.blog.fc2.com/tb.php/43-dab470ff

トラックバック

コメント

[C61]

のんたんスレから来ました
ためになりました
ありがとうございました

コメントの投稿

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

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をご覧ください。

カレンダー(月別)

10 ≪│2017/11│≫ 12
- - - 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 - -

全記事表示リンク

全ての記事を表示する

QRコード

QR

総アクセス数

アクセス数

現在の閲覧者数: