0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

サーペノイド曲線(Serpenoid Curve)

Last updated at Posted at 2025-02-18

はじめに

ケーキのクリームがうねうねしてる、あの曲線を数学的に知りたかった。
以前、たどり着いたのは、エラスティカ(Elastica)。

今回取り組むのは、サーペノイド曲線(Serpenoid Curve)。

サーペノイド(serpenoid)

意味は、
serpent...宗教等で登場する蛇(アダムとイブや神話など)
snake...一般的な蛇
viper...毒蛇

serpenoid...蛇のような
英辞書にもなく、
英語のwikiもなく、serpenoid curveは一般的でない?
snake curveというのもない。
代わりに、Serpentine Curve(サーペンタイン曲線)が出てきたけど、これは違う。クロソイド曲線と関連深そう。後で要確認。

ChatGPTによると

ChatGPT的には蛇状曲線や、蛇行曲線を訳として提案してきた。

Serpenoid curve(サーペノイド曲線)は、蛇のように波打つ形状を持つ曲線のことを指します。
数学的に明確に定義された特定の曲線ではなく、
一般的には「蛇のようにうねる形状を持つ曲線」を指すことが多いです。

特徴
 周期的な波形
  サイン波や余弦波のように波打つ性質を持ちますが、特定の数式に限定されません。
 スムーズな連続性
  曲線がなめらかに変化し、尖った部分が少ないのが特徴です。
 ジグザグではなく、連続的にうねる形状
  例えば、蛇が進む際の軌跡のような動きをイメージできます。

プログラム

ChatGPTによる定義
image.png
ChatGPTのコードを元に、マウス操作と表示系を修正しました。

Processing
int numPoints = 800; // 曲線を描く点の数
float ds = 2.0;      // 弧長方向の増分
float A = 0.1;       // 曲率の振幅
float B = 0.05;      // 曲率の周波数

void setup() {
  size(800, 400);
  fill(0);
  stroke(0);
}

void draw(){
  background(255);
  A = mouseX*0.001;
  B = mouseY*0.0005;
  text("A = "+A,50,100);
  text("B = "+B,50,120);
  drawSerpenoidCurve();
}

void drawSerpenoidCurve() {
  float x = width / 2;
  float y = height / 4;
  float th = -0.05; // 初期角度

  for (int i = 0; i < numPoints; i++) {
    float kappa = A * cos(B * i * ds); // 曲率の定義
    th += kappa * ds; // 角度の更新
    
    // 座標の更新(オイラー積分)
    float dx = ds * cos(th);
    float dy = ds * sin(th);
    
    float newX = x + dx;
    float newY = y + dy;
    
    line(x, y, newX, newY); // 線を描画

    // 座標の更新
    x = newX;
    y = newY;
  }
}

image.png
image.png
image.png
image.png

アニメーションもできるというので、生成してもらいました。(イマイチです)

Processing
int numPoints = 500; // 曲線を描く点の数
float ds = 2.0; // 弧長方向の増分
float A = 0.1; // 曲率の振幅
float baseB = 0.05; // 基本の曲率周波数
float t = 0; // 時間パラメータ

void setup() {
  size(800, 600);
  background(255);
}

void draw() {
  background(255, 10); // 軌跡を残すために少し透明度を持たせる

  float x = width / 2;
  float y = height / 2;
  float theta = 0; // 初期角度

  float B = baseB + 0.02 * sin(t); // 時間とともに曲率周波数を変化

  for (int i = 0; i < numPoints; i++) {
    float kappa = A * sin(B * i * ds); // 曲率の定義
    theta += kappa * ds; // 角度の更新

    // 座標の更新(オイラー積分)
    float dx = ds * cos(theta);
    float dy = ds * sin(theta);

    float newX = x + dx;
    float newY = y + dy;

    stroke(0, 100, 255); // 青色の曲線
    line(x, y, newX, newY); // 線を描画

    // 座標の更新
    x = newX;
    y = newY;
  }

  t += 0.05; // 時間を進める
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?