うしブログ

うしブログ

趣味で運営する、GeoGebraの専門ブログ。

(作業メモ)StartPoint要検証(2行の場合;テキスト変更時未定義問題)

(要修復)ToggleButton・RollPolygonWithoutSlipping・貯金時計・直感力トレーニング

テキストの高さ、および描画開始点の位置

テキストのピクセル

テキストオブジェクトは、スタイルバーまたはプリファレンスで、サイズを指定できる。選べるサイズは、微小(Extra Small)、特小(Very Small)、小(Small)、中(Medium)、大(Large)、特大(Very Large)、巨大(Extra Large)である(カッコ内は英語モードでの名前)。

下図は、スタイルバーでサイズを指定する際の画面である。

f:id:usiblog:20181007224357p:plain

テキストの幅は、文字の種類および数によって変化する。これに対して、テキストの高さは、文字の種類および数によらず一定である。

そして、テキストの高さは、フォントサイズと、テキストサイズによって変化する。

フォントサイズおよびテキストサイズと、テキストの高さおよび描画開始点の位置との間に、何らかの法則性を見出すことはできるだろうか。

なお、本記事は、テキストオブジェクトの行数が1行である場合を前提としている。2行以上のテキストオブジェクトには、以下の議論は当てはまらない。

 

以下の表は、フォントサイズの値(pt)およびテキストサイズの値(sizeM*1)に応じて、テキストの高さ、および描画開始点の位置を測定した結果である。

f:id:usiblog:20181107060324p:plain

表中の測定値は、ピクセル単位である。測定値の意味は、下図の通りである。

f:id:usiblog:20181107060432p:plain

詳細な分析

ptやsizeMの値を変化させたときの、各種測定値の変化を観察できるアプレットを作成した。

sizeMとテキストサイズ – GeoGebra

一般化

上記アプレットによる分析の結果、以下の法則が成り立っていることが確認できた。

なお、以下では、テキストの高さをheight, 隅4〜開始点の高さをspHeightと表記する。

 

pt,sizeMからheightを求める

height = floor(1.5floor( pt(sizeM-1) )+1.5pt+6)・・・①

ただし、ptの値にかかわらず、heightの最小値は12である。

 

pt,heightからsizeMを求める

ptを定数とする。このとき、あるheightを与えるsizeMは、一意には求まらない*2。しかし、

sizeM* = (height - 5) / (1.5pt)

とすると、sizeMをsizeM*に設定することによって、テキストの高さをheight*3にすることができる。

 

隅4〜開始点の幅

隅4〜開始点の幅 = 3(一定)

 

pt,sizeMからspHeightを求める

spHeight = floor( pt(sizeM-1) )+pt+3

ただし、ptの値にかかわらず、spHeightの最小値は7である*4

 

pt,spHeightからsizeMを求める

ptを定数とする。このとき、テキストにあるspHeightを与えるsizeMは、一意には求まらない。しかし、

sizeM** = (spHeight - 3) / pt

とすると、sizeMをsizeM**に設定することによって、隅4〜開始点の高さをspHeightにすることができる。

 

heightからspHeightを求める

spHeight = floor( (height - 5) / 1.5 + 3 )

 

pt,sizeMからsizeを求める

 size = ceil( pt(sizeM-1) )

 

バージョン情報

この記事の内容は、以下のバージョンのGeoGebraで検証した。

Version: 6.0.509.0-w (04 November 2018)

*1:sizeMは、XMLデータのfont タグ内にみられる値であり、テキストサイズの関数であると思われる。

*2:当該heightを与えるsizeMが存在しない場合もある。たとえば、pt=16で、height=44を与えるsizeMは存在しない。

*3:当該heightを与えるsizeMが存在しない場合には、当該heightに1を加えた値。

*4:

①より、heightに最小値12を与えるsizeMの一つは、

sizeM* = (12 - 5) / (1.5pt)

である。sizeMの値がsizeM*であるとき、

spHeight = floor( pt(sizeM*-1) )+pt+3

= floor( pt( ( (12 - 5) / (1.5pt) )-1) )+pt+3・・・(★)

(★)の値は、ptが整数であるならば、一定値7をとる。 観察によると、これが、spHeightの最小値であることが分かった。