- 日時: 2023/01/23 21:48
- 名前: REDCHEEKS
- (1) Point? startPoint = null; // 始点(初期値は未設定)
Point? startPoint とは、始点(X座標, Y座標)の事だな、繰り返し処理(for文)の外で定義しているのは、繰り返し処理の中で前回の終点を次の始点として保存しておくため(繰り返し処理の中に書いてしまうと保持できない) 但し、そのため、一回目は、値が入っていないので、それを示すため、null を設定する。 null を設定するため、変数の型は、Point ではなく Point? を使う。 (? がついていると、null が許容される、つまり Nullable なわけだ)
(2) var pen = new Pen(Color.Red, 5); // ペンの色と太さを設定する
線の色と太さを設定する、REDCHEEKS は太い "真っ赤な" 赤が大好き。
(3) for (double x = 0; x < Width; x++) // 表示されたウインドウの幅(Width)繰り返す
ウインドウの幅(Width)分繰り返す、数学関数を使うときは、倍精度浮動小数点(double)型を使う。
(4) double y = 0;
y座標にも同様に、倍精度浮動小数点(double)型を使う。
(5) 数学計算を行う y += Math.Sin(x / 30) * 0.8; // 波動1を追加する y += Math.Sin(x / 20) * 0.3; // 波動2を追加する y *= Math.Pow(0.998, x); // 減衰計算
まあこの辺の数式は、イメージして、適当に試すとよい。 お尻のお肉は左右に割れているから、色々な振動があるだろうね
(6) Y座標の符号反転 y = -y; // 符号反転(数学のY座標は、上がプラスなので)
数学の座標系と、コンピュータの座標系は異なるため変換する(X座標は同じだが、Y座標は異なる)。 プリンタ印刷の関係から、コンピュータのY座標は、下の方がプラス、それを数学の座標(上がプラス)に合わせるため。
(7) その他、微調整 y += 1; // ウインドウの高さの中に入るように調整 y *= (Height / 2); // ウインドウの高さ(Height)の中に入るように調整
ウインドウは、左上が原点(0,0) のため、ウインドウの範囲に表示するための各種調整
(8) 終点(X,Y)の設定 var endPoint = new Point((int)x, (int)y); // 終点
ここで、(int) とは、倍精度浮動小数点(double)型 を 整数(int)型に変換している。 数学関数には、倍精度浮動小数点(double)型が必要だが、画面表示には、画面のドット以下(小数点以下)は不要のため、切り捨てる。
(9) if (startPoint.HasValue) // 始点が設定されている場合 始点は前回の終点を使うため、最初の一発目は、値が入っていない。 エラー発生を防ぐため、始点が設定されている場合のみに制限している。
(10) e.Graphics.DrawLine(pen, startPoint.Value, endPoint); // 線を引く 始点から終点に線を引く、ここで startPoint は、endPoint と違って、.Value がついていることに注意、これは null が許容される型を使っているためである。
(11) startPoint = endPoint; // 次の始点として、現在の終点を設定する 次の始点として、現在の終点を設定する(代入時の startPoint の .Valueは、省略可能)
【課題】ぱっしーん、ぷるぷるん...(5) の数式を調整して、お好みの肉振動を合成しよう
p.s. それでバイブレータをしこしこ作動させ "三角関数を調整しながらお好みの肉振動を作り出し" 射精出来たら最高だね 麻生太郎さんは国会で「三角関数なんて使わない」なんて言っていたけど、三角関数でおなに()は最高
|