(95)
ハート曲線
── ハートの形状とハート係数
最近、インターネット上でハート曲線を表す式に出会った。誰が作ったものかは知らない。その出典も明らかではない。しかし見事なほどに美しい式である(図1を参照)。
![](images/heartcurve.jpg)
図1 ハート曲線
この式を見ていると、式を考案した人の意図(円から出発して、その一部を膨らませるという意図)が見えてくるから面白い。なるほどと納得させられるものがある。しかしハート曲線の形状をつぶさに観察すると、図の曲線が実は上下の方向に若干圧縮されていることに気がつく。式の表すハートの形状を、作者の好みに合わせて修正したものと思われる。
もし圧縮されていなければ、この式はどういう形状になるのだろう。私は知的好奇心を刺激され、早速コンピュータ上で表示し確認してみることにした。それが以下のものである。
ただしコンピュータ上で実装する際には、上下の方向に伸び縮みできるよう式を若干手直ししてある。定数 h を導入し“ハート係数”と名付けてプログラム化したのである。
![](images/heartF2.jpg)
ハート係数 h の値を 1 としたものが、オリジナルの式に対応するハート曲線である。以下の図2に示すような形状になることが分かった。
![](images/blueH1.0-5-005.jpg)
図2 h=1 のハート曲線
確かに少し縦長である。圧縮したくなった気持ちが理解できる。ハート係数 h の値を 1.2 とすると、以下に示すように程良い形のハート型になった。おそらく、式の作者もこの形状を理想としたのではないかと思う。
![](images/purpleH1.2-5-005.jpg)
図3 h=1.2 のハート曲線
ハートの形とは不思議なもので、縦に長いと何か上品な印象を与えるように思う。逆に縦が短く横広がりのハートは、何というか、そう「幼い感じ」と表現したらよいかもしれない。私はそんな気がするのである。これは個人的な好みに類するものであろうが。
私が推奨するハート曲線方程式は以下のものである。
![](images/heartF3.jpg)
ハート係数の値をいろいろに変えて表示してみたものを一つにまとめてみた(図4 クリックで拡大可)。
![](images/rh-all-2.jpg) 図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記)■
![](/cgi-bin/user/skinoshita/Count.cgi?df=ct95.count)
[ ]
|