素歩人徒然 ハート曲線 ハートの形状とハート係数
素歩人徒然
(95)

ハート曲線


── ハートの形状とハート係数

 最近、インターネット上でハート曲線を表す式に出会った。誰が作ったものかは知らない。その出典も明らかではない。しかし見事なほどに美しい式である(図1を参照)。


図1 ハート曲線

 この式を見ていると、式を考案した人の意図(円から出発して、その一部を膨らませるという意図)が見えてくるから面白い。なるほどと納得させられるものがある。しかしハート曲線の形状をつぶさに観察すると、図の曲線が実は上下の方向に若干圧縮されていることに気がつく。式の表すハートの形状を、作者の好みに合わせて修正したものと思われる。

 もし圧縮されていなければ、この式はどういう形状になるのだろう。私は知的好奇心を刺激され、早速コンピュータ上で表示し確認してみることにした。それが以下のものである。
 ただしコンピュータ上で実装する際には、上下の方向に伸び縮みできるよう式を若干手直ししてある。定数 h を導入し“ハート係数”と名付けてプログラム化したのである。


 ハート係数 h の値を 1 としたものが、オリジナルの式に対応するハート曲線である。以下の図2に示すような形状になることが分かった。


図2 h=1 のハート曲線

 確かに少し縦長である。圧縮したくなった気持ちが理解できる。ハート係数 h の値を 1.2 とすると、以下に示すように程良い形のハート型になった。おそらく、式の作者もこの形状を理想としたのではないかと思う。


図3 h=1.2 のハート曲線

 ハートの形とは不思議なもので、縦に長いと何か上品な印象を与えるように思う。逆に縦が短く横広がりのハートは、何というか、そう「幼い感じ」と表現したらよいかもしれない。私はそんな気がするのである。これは個人的な好みに類するものであろうが。
 私が推奨するハート曲線方程式は以下のものである。


 ハート係数の値をいろいろに変えて表示してみたものを一つにまとめてみた(図4 クリックで拡大可)。


図4 各種のハート曲線

 プログラム化するに当たっては、パソコンの画面上に簡単に表示できるので、BASIC言語を用いることにした。以下にそのプログラムを示す。
 貴方(女)の好みのハート係数の値はどのくらいですか。試してみてください。

ハート曲線の表示プログラム
100 REM *ハートマークの表示 ---(c) 2012-7-7 Coded by Knuhs 
110  CLS 3
120  DEF FNA1(P)=SQR(1-P)/H
130  DEF FNA2(P)=EXP(1/3*LOG(P))/H
140  ORGX=300:ORGY=300    '原点の座標
150 REM *パラメータ定義(可変)
160  H=1.2    'ハート係数 :0.7 から 2.0 程度まで
170  C=3      'カラー :青(1),赤(2),紫(3),緑(4),水(5),黄(6),白(7)
180  B=5      '線の太さ   :1 から 5 程度まで
190  S=0.1    '解像度     :1, 0.1, 0.05, 0.01, 0.005
200  Z=1      '座標の表示 :表示しない(0) 表示する(1)

210 REM
220  IF Z=0 THEN GOTO 490  '座標軸の表示をスキップ
230 REM *X軸を描く
240  LINE (ORGX, ORGY-205)-(ORGX, ORGY+165),7
250  LOCATE 35,19:PRINT "O";
260  LOCATE 64,18:PRINT "X";
270  LOCATE 23,19:PRINT "-1.0  -0.5";
280  LOCATE 40,19:PRINT " +0.5   +1.0";
290  LOCATE 33,9: PRINT "+1.5";
300 REM *Y軸を描く
310  LINE (ORGX-205, ORGY)-(ORGX+205, ORGY),7
320  LOCATE 37,4:PRINT "Y";
330  LOCATE 33,12:PRINT "+1.0";
340  LOCATE 33,15:PRINT "+0.5";
350  LOCATE 33,21:PRINT "-0.5";
360  LOCATE 33,24:PRINT "-1.0";
370 REM *X軸の刻み
380  XP=ORGX-200:YP=ORGY
390  FOR I=0 TO 400 STEP 10
400    IF INT(I/50)=I/50 THEN LINE (XP+I,YP-7)-(XP+I,YP),7:GOTO 420
410    LINE (XP+I,YP-3)-(XP+I,YP),7
420  NEXT I
430 REM *Y軸の刻み
440  XP=ORGX:YP=ORGY-200
450  FOR I=0 TO 350 STEP 10
460    IF INT(I/50)=I/50 THEN LINE (XP,YP+I)-(XP+7,YP+I),7:GOTO 480
470    LINE (XP,YP+I)-(XP+4,YP+I),7
480  NEXT I
490 REM *値をプロットする
500  IF B<=0 THEN B=1
510  IF B>5 THEN B=5
520  ON B GOTO 570,560,550,540,530
530  J=-2: CC=7 : GOSUB 600
540  J= 2: CC=7 : GOSUB 600
550  J=-1: CC=C : GOSUB 600
560  J= 1: CC=C : GOSUB 600
570  J= 0: CC=C : GOSUB 600
580  LOCATE 18,30:PRINT "ハート係数(";H;"), 線幅(";B;"), 解像度(";S;")";
590 END
600 REM *プロットするサブルーチン
610  FOR I=0.1 TO 100 STEP S
620    XX = I*I/10000
630    Y1 =  FNA1(XX) + FNA2(XX)
640    Y2 = -FNA1(XX) + FNA2(XX)
650    PSET (ORGX+I+J, ORGY-Y1*100),CC : PSET(ORGX+I+J, ORGY-Y2*100),CC
660    PSET (ORGX-I+J, ORGY-Y2*100),CC : PSET(ORGX-I+J, ORGY-Y1*100),CC
670    PSET (ORGX+I, ORGY+J-Y1*100),CC : PSET(ORGX+I, ORGY+J-Y2*100),CC
680    PSET (ORGX-I, ORGY+J-Y2*100),CC : PSET(ORGX-I, ORGY+J-Y1*100),CC
690  NEXT I
700 RETURN
【プログラムの使い方】

(1) 行番号 160 から 200 までは、各種パラメータの定義で、
  適当に値を変更することができる。

(2) H はハート係数。0.7 から 2.0 程度までが現実的。

(3) C は線の色。
  青(1),赤(2),紫(3),緑(4),水(5),黄(6),白(7)。

(4) B は線の太さ。1 から 5 程度まで。

(5) S は解像度。1, 0.1, 0.05, 0.01, 0.005 程度まで。
  解像度を 0.005 まで上げると、表示にかなり時間がかかる。

(6) Z は座表軸の表示あり(1)、表示なし(0)。

Knuhs (2012-7-24記)