東大問題の解法より時間を要した、ggplot2 による図形の描画を記す。
他にも簡潔で良い方法があるのかもしれないが、これが私なりに考えた方法。基本的な描画関数を組み合わせただけ。この理解で、かなりの図形を描画できるような気がして超嬉しい!!
東大問題も楽しかったが、R による図形描画はそれ以上だった。何だか「コンピューターの内部では、こんな風に描画されているのかもしれない」と、多分どこか誤解しながらも楽しんだ。
描画ステップ
まずは「単位円」の描画。これは「R で円の描画:誰もがプログラマーに」で紹介した通りだが再掲する。
circleFun <- function(center = c(0,0),diameter = 1, npoints = 100){
r = diameter / 2
tt <- seq(0,2*pi,length.out = npoints) # radians, from 0 to 2π
xx <- center[1] + r * cos(tt) # x values
yy <- center[2] + r * sin(tt) # y values
return(data.frame(x = xx, y = yy)) # return the result
}
dat <- circleFun(c(0,0),2,npoints = 100)
p <- ggplot(dat,aes(x,y)) + geom_path()
p
p2<-p+geom_segment(aes(x=-1.2,y=0,xend=1.2,yend=0),size=0.1)+geom_segment(aes(x=0,y=-1.2,xend=0,yend=1.2),size=0.1)
p2
これ以降では、三角形の移動前の図 A と移動後の図 B では、この p2 の変数に追加して描画する。また、変数化した α, β の角度を用いる。
図 A
p3<-p2+geom_segment(aes(x=0,y=0,xend=cos(radA),yend=sin(radA)))+geom_point(aes(cos(radA),y=sin(radA)),size=2)+geom_text(x=cos(radA)+0.19,y=sin(radA)+0.03,label="P(cosα,sinα)",size=5,alpha=0.01)+geom_curve(aes(x=0.2,y=sin(radA)/cos(radA)*0.2,xend=0.22,yend=0),curvature=-0.4,size=0.1,alpha=0.05)+geom_text(x=0.3,y=0.05,label="α",size=5,alpha=0.01)
p4<-p3+geom_segment(aes(x=0,y=0,xend=cos(-radB),yend=sin(-radB)))+geom_point(aes(cos(-radB),y=sin(-radB)),size=2)+geom_text(x=cos(-radB)+0.28,y=sin(-radB)-0.01,label="R(cos(-β),sin(-β))",size=5,alpha=0.01)+geom_curve(aes(x=0.05,y=sin(-radB)/cos(-radB)*0.05,xend=0.08,yend=0),curvature=0.4,size=0.1,alpha=0.05)+geom_text(x=0.15,y=-0.08,label="β",size=5,alpha=0.01)
p3<-p2+geom_segment(aes(x=0,y=0,xend=cos(radAB),yend=sin(radAB)))+geom_point(aes(cos(radAB),y=sin(radAB)),size=2)+geom_text(x=cos(radAB)+0.3,y=sin(radAB)+0.05,label="Q(cos(α+β),sin(α+β))",size=5,alpha=0.01) + geom_curve(aes(x=0.05,y=sin(radAB)/cos(radAB)*0.05,xend=0.18,yend=0),curvature = -0.4,size=0.1, alpha=0.05)+geom_text(aes(x=0.2,y=0.15),label="α+β",size=5,alpha=0.01)+geom_segment(aes(x=0,y=0,xend=1,yend=0))+geom_point(aes(x=1,y=0),size=2)+geom_text(x=1.1,y=0.06,label="A(1,0)",size=5,alpha=0.01)
p5+geom_point(aes(0,sin(radA)),size=2)+geom_segment(aes(x=0,y=sin(radA),xend=cos(radA),yend=sin(radA)),linetype=8)+geom_point(aes(cos(-radB),sin(radA)))+geom_segment(aes(x=cos(-radB),y=sin(radA),xend=cos(-radB),yend=sin(-radB)),linetype=8)+geom_text(aes(cos(-radB),sin(radA)+0.05),label="S(cos(-β),sinα)",size=5,alpha=0.01)
図 B2
p4+geom_point(aes(cos(radAB),sin(radAB)),size=2)+geom_segment(aes(x=cos(radAB),y=sin(radAB),xend=cos(radAB),yend=0),linetype=8)+geom_point(aes(cos(radAB),0),size=2)+geom_text(aes(cos(radAB),-0.05),label="B(cos(α+β),0)",size=5,alpha=0.01)
r = diameter / 2
tt <- seq(0,2*pi,length.out = npoints) # radians, from 0 to 2π
xx <- center[1] + r * cos(tt) # x values
yy <- center[2] + r * sin(tt) # y values
return(data.frame(x = xx, y = yy)) # return the result
}
dat <- circleFun(c(0,0),2,npoints = 100)
p <- ggplot(dat,aes(x,y)) + geom_path()
p
p2<-p+geom_segment(aes(x=-1.2,y=0,xend=1.2,yend=0),size=0.1)+geom_segment(aes(x=0,y=-1.2,xend=0,yend=1.2),size=0.1)
p2
これ以降では、三角形の移動前の図 A と移動後の図 B では、この p2 の変数に追加して描画する。また、変数化した α, β の角度を用いる。
a <- 1/10
b <- 3/10
radA <- pi*a
radB <- pi*b
radAB<-pi*(a+b)
図 A
p3<-p2+geom_segment(aes(x=0,y=0,xend=cos(radA),yend=sin(radA)))+geom_point(aes(cos(radA),y=sin(radA)),size=2)+geom_text(x=cos(radA)+0.19,y=sin(radA)+0.03,label="P(cosα,sinα)",size=5,alpha=0.01)+geom_curve(aes(x=0.2,y=sin(radA)/cos(radA)*0.2,xend=0.22,yend=0),curvature=-0.4,size=0.1,alpha=0.05)+geom_text(x=0.3,y=0.05,label="α",size=5,alpha=0.01)
p4<-p3+geom_segment(aes(x=0,y=0,xend=cos(-radB),yend=sin(-radB)))+geom_point(aes(cos(-radB),y=sin(-radB)),size=2)+geom_text(x=cos(-radB)+0.28,y=sin(-radB)-0.01,label="R(cos(-β),sin(-β))",size=5,alpha=0.01)+geom_curve(aes(x=0.05,y=sin(-radB)/cos(-radB)*0.05,xend=0.08,yend=0),curvature=0.4,size=0.1,alpha=0.05)+geom_text(x=0.15,y=-0.08,label="β",size=5,alpha=0.01)
p5 <- p4+geom_segment(aes(x=cos(radA),y=sin(radA),xend=cos(-radB),yend=sin(-radB)),colour="red",size=0.01)+geom_segment(aes(x=0,y=0,xend=1,yend=0))
p5
図 Bp5
p3<-p2+geom_segment(aes(x=0,y=0,xend=cos(radAB),yend=sin(radAB)))+geom_point(aes(cos(radAB),y=sin(radAB)),size=2)+geom_text(x=cos(radAB)+0.3,y=sin(radAB)+0.05,label="Q(cos(α+β),sin(α+β))",size=5,alpha=0.01) + geom_curve(aes(x=0.05,y=sin(radAB)/cos(radAB)*0.05,xend=0.18,yend=0),curvature = -0.4,size=0.1, alpha=0.05)+geom_text(aes(x=0.2,y=0.15),label="α+β",size=5,alpha=0.01)+geom_segment(aes(x=0,y=0,xend=1,yend=0))+geom_point(aes(x=1,y=0),size=2)+geom_text(x=1.1,y=0.06,label="A(1,0)",size=5,alpha=0.01)
p4<-p3+geom_segment(aes(x=1,y=0, xend=cos(radAB),yend=sin(radAB)),colour="red",size=0.01)+geom_segment(aes(x=0,y=0,xend=1,yend=0))
p4
p4
p5+geom_point(aes(0,sin(radA)),size=2)+geom_segment(aes(x=0,y=sin(radA),xend=cos(radA),yend=sin(radA)),linetype=8)+geom_point(aes(cos(-radB),sin(radA)))+geom_segment(aes(x=cos(-radB),y=sin(radA),xend=cos(-radB),yend=sin(-radB)),linetype=8)+geom_text(aes(cos(-radB),sin(radA)+0.05),label="S(cos(-β),sinα)",size=5,alpha=0.01)
図 B2
p4+geom_point(aes(cos(radAB),sin(radAB)),size=2)+geom_segment(aes(x=cos(radAB),y=sin(radAB),xend=cos(radAB),yend=0),linetype=8)+geom_point(aes(cos(radAB),0),size=2)+geom_text(aes(cos(radAB),-0.05),label="B(cos(α+β),0)",size=5,alpha=0.01)






0 件のコメント:
コメントを投稿