見出し画像

Rで正葉曲線を描く

植物の葉の絵をRの正葉曲線を使って描いてみる。

正葉曲線は、
x = a cos(θ)
y = a sin(θ)
で表せる。

例えば、Rで9枚の葉を描く場合、Rのコンソールに以下の行を順番に入力する。

> t<-c(1:3600)
> u<-2*pi*t/3600
> x<-sin(u*9)
> y<-x*(cos(u))
> z<-x*(sin(u))
> plot(y, z, col = "darkgreen")

せっかくなのでScriptを書いてみる。

leaves<-function(n){
    t<-c(1:3600)
    u<-2*pi*t/3600
    x<-sin(u*n)
    y<-x*(cos(u))
    z<-x*(sin(u))
    plot(y,z,col="darkgreen")
}

これをテキストファイルleaves.Rとしてにデスクトップに保存し、Rで読み込んでスクリプトをrunする。

source('~/Desktop/leaves.R', chdir = TRUE)
> leaves(5)

奇数の場合は、これでOK。

だが、「5」のところに偶数の数値を入れると、2n枚になってしまう。
例えば、6を入力した場合には12枚になる。

偶数の場合には「奇数を入力してください」とメッセージを出すようにした。

leaves<-function(n){
  if (n%%2 == 0) {
    stop("please put odd number")
    }
  else{
    t<-c(1:3600)
    u<-2*pi*t/3600
    x<-sin(u*n)
    y<-x*(cos(u))
    z<-x*(sin(u))
    plot(y,z,col="darkgreen")
    }
}

次に、偶数の場合にn=n/2として計算させる。

leaves<-function(n){
  if (n%%2 == 0) {
    n = n/2
    }
  t<-c(1:3600)
  u<-2*pi*t/3600
  x<-sin(u*n)
  y<-x*(cos(u))
  z<-x*(sin(u))
  plot(y,z,col="darkgreen")
}

ちょっとだけ解決する。

ただし、2, 6, 10, 14, 18…と、n/2 が奇数になる場合には解決できないので、エラーを返すようにした。

leaves<-function(n){
  if (n%%2 == 0) {
    n = n/2
    if (n%%2 == 1){
      stop("please put odd number")
      }
    }
  t<-c(1:3600)
  u<-2*pi*t/3600
  x<-sin(u*n)
  y<-x*(cos(u))
  z<-x*(sin(u))
  plot(y,z,col="darkgreen")
}

errorを返すスクリプト


さらに、近似値の葉の枚数を描くようにした。

leaves<-function(n){
  if (n%%2 == 0) {
    n = n/2
    if (n%%2 == 1){
      print ("Please aware that If you put '2(2n+1)' value, the leaf number is not accurate!")
      n = 2*n+1
      }
    }
  t<-c(1:3600)
  u<-2*pi*t/3600
  x<-sin(u*n)
  y<-x*(cos(u))
  z<-x*(sin(u))
  plot(y,z,col="darkgreen")
}

近似値を描くスクリプト


追記:時間のあるときにもう少し工夫してみるかも。

この記事が気に入ったらサポートをしてみませんか?