図形と方程式

内分・外分

まずはグラフを各場所を確保しましょう。
> plot(c(-1,7),c(-1,7),type="n")
> grid()
> plot(c(-1,7),c(-1,7),type="n")
> grid(6,6,col="blue")
好きな数のグリッド線を書き入れます。

次に内分点を求めてみましょう。
> naibun <- function(x1,y1,x2,y2,m,n) {
+ x <- (n*x1+m*x2)/(m+n)
+ y <- (n*y1+m*y2)/(m+n)
+ c(x,y)
+ }
パラメータを指定すると内分点を求める関数を作ってみました。

> naibun2 <- function(x1,y1,x2,y2,m,n){
+ points(x1,y1)
+ points(x2,y2)
+ points(naibun(x1,y1,x2,y2,m,n)[1],naibun(x1,y1,x2,y2,m,n)[2],col="red")
+ naibun(x1,y1,x2,y2,m,n)
+ }
さらにそれをグラフ上に表示する機能もつけました。

外分点も同じようにしてみます。
> gaibun <- function(x1,y1,x2,y2,m,n) {
+ x <- (-n*x1+m*x2)/(m-n)
+ y <- (-n*y1+m*y2)/(m-n)
+ c(x,y)
+ }

さらにグラフ表示機能付です。
> gaibun2 <- function(x1,y1,x2,y2,m,n){
+ points(x1,y1)
+ points(x2,y2)
+ points(gaibun(x1,y1,x2,y2,m,n)[1],gaibun(x1,y1,x2,y2,m,n)[2],col="red")
+ gaibun(x1,y1,x2,y2,m,n)
+ }
それでは試してみましょう。
> naibun2(2,3,5,6,1,2)
[1] 3 4
> gaibun2(1,2,3,1,1,2)
[1] -1 3



直線

複数の点を指定してそれを通る線を求めるには二個以上の点を指定してそれをつなぐ 折れ線を求めるlinesと、二個だけの点を指定してそれをつなぐ線分を求めるsegmentsと ありますが、直線を求める関数はないので作ってみます。
> lines2 <- function(x1,y1,x2,y2){
+ katamuki <- (y2-y1)/(x2-x1)
+ seppen <- -katamuki*x1+y1
+ abline(seppen,katamuki)
+ points(x1,y1,col="red")
+ points(x2,y2,col="red")
+ }
> plot(c(-1,7),c(-1,7),type="n")
> grid(6,6,col="blue")
> lines2(1,1,4,6)
方法は二点の情報から傾きと切片を求め、それを関数「abline(切片,傾き)」に 代入して求めます。

次に二点間の距離を求める関数です。
> dist <- function(x1,y1,x2,y2)
+ sqrt((x1-x2)^2+(y1-y2)^2)

一点と一直線を指定するとその距離を求める関数を作ります。
> dist2 <- function(x1,y1,a,b,c)
+ abs(a*x1+b*y1+c)/sqrt(a^2+b^2)




中心と半径を与えて円を描く関数を作ってみましょう。
> circle <- function(x1,y1,r){
+ x <- seq(x1-r,x1+r,length=10000)
+ points(x,y1+sqrt(r^2-(x-x1)^2),pch=".")
+ points(x,y1-sqrt(r^2-(x-x1)^2),pch=".")
+ points(x1,y1,col="red")
+ }
> plot(c(-1,7),c(-1,7),type="n")
> grid(6,6,col="blue")
> circle(2,3,2)
プロットはyについて陽関数の形が必要なので二つに分けてかきました。また 次のような方法でも円を描けます。
> circle2 <- function(x1,y1,r){
+ theta <- seq(0,2*pi,length=10000)
+ points(x1+r*cos(theta),y1+r*sin(theta),pch=".")
+ points(x1,y1,col="red")
+ }
> circle2(3,3,2)
これは数学Cなどで媒介変数表示を習えばすぐにわかります。

次に円の中心(x0,y0)と半径と接点(x1,y1)を与えて、接線を求める関数です。
> sessen <- function(x0,y0,r,x1,y1){
+ katamuki <- -(x1-x0)/(y1-y0)
+ seppen <- (r^2+(x1-x0)*x0)/(y1-y0)+y0
+ abline(seppen,katamuki,pch=".")
+ c(katamuki,seppen)
+ }
> sessen(3,3,2,3-sqrt(2),3+sqrt(2))
x1*x+y1*y=r^2の変形ですね。この関数はy軸と平行になるときにエラーと なってしまいます。if文を使えばこれを回避することはできますが煩雑になるので ここでは省略します。




軌跡と領域

まず軌跡です。
> x <- runif(10000,-10,10)
> y <- runif(10000,-10,10)
> plot(c(-7,7),c(-5,9),type="n")
> grid(12,12,col="blue")
> d1 <- dist(x,y,-2,3)
> d2 <- dist(x,y,2,5)
> points(-2,3,col="red")
> points(2,5,col="red")
> lines2(-2,3,2,5)
> points(x[abs(d1-d2)<0.1],y[abs(d1-d2)<0.1])
> points(x[abs(2*d1-d2)<0.1],y[abs(2*d1-d2)<0.1],col="green")
> points(x[abs(d1-2*d2)<0.1],y[abs(d1-2*d2)<0.1],col="yellow")
二点(-2,3)と(2,5)から等距離の点と1:2の点、2:1の点をそれぞれ求めます。あとの二つは アポロニウスの円と呼ばれるものです。













y>x^2の領域とそれとy<2*x+5の共通部分を求めます。
> x <- runif(10000,-5,5)
> y <- runif(10000,-10,30)
> xl <- x^2
> plot(x[y>xl],y[y>xl])
> points(x,x^2,pch=".",col="red")
> plot(x,x^2,pch=".",col="red")
> points(x[y>xl & y<2*x+5],y[y>xl & y<2*x+5],col="yellow")
> points(x,2*x+5,pch=".",col="green")
最初にx座標,y座標それぞれ乱数で10000個指定し、10000個のランダムな点を作ります。 ここで「runif(個数,最小,最大)」は最小から最大間に指定した個数の一様乱数を発生させます。
















原点中心の半径3の円の内部と外部を求めます。
> x <- runif(10000,-10,10)
> y <- runif(10000,-10,10)
> plot(c(-10,10),c(-10,10),type="n")
> grid(20,20,col="blue")
> points(x[x^2+y^2<3^2],y[x^2+y^2<3^2],col="red")
> points(x[x^2+y^2>3^2],y[x^2+y^2>3^2],col="green")



















(2*x-3*y+4)*(3*x+2*y-2)<0の領域を求めます。
> x <- runif(10000,-10,10)
> y <- runif(10000,-10,10)
> plot(x[(2*x-3*y+4)*(3*x+2*y-2)<0],y[(2*x-3*y+4)*(3*x+2*y-2)<0],col="yellow")
> points(x,(2*x+4)/3,pch=".",col="red")
> points(x,(-3*x+2)/2,pch=".",col="green")


ホームヘ