2013-04-13 8 views
6

目的: 2点が与えられたら、それらを結ぶ弧の座標を見つけてプロットします。 実装:円弧の点(circleFun)とそれをプロットする関数(plottest)の1つの関数。色は赤から緑へのパスの方向を示します。なぜlines関数がR内のパスを閉じますか?

circleFun <- function(x,y) 
{ 
    center <- c((x[1]+y[1])/2,(x[2]+y[2])/2) 
    diameter <- as.numeric(dist(rbind(x,y))) 

    r <- diameter/2 
    tt <- seq(0,2*pi,length.out=1000) 
    xx <- center[1] + r * cos(tt) 
    yy <- center[2] + r * sin(tt) 
    res <- data.frame(x = xx, y = yy) 

    if((x[1]<y[1] & x[2]>y[2]) | (x[1]>y[1] & x[2]<y[2])){ 
    res <- res[which(res$x>min(c(x[1],y[1])) & res$y>min(c(x[2],y[2]))),] 
    } else { 
    res <- res[which(res$x<max(c(x[1],y[1])) & res$y>min(c(x[2],y[2]))),] 
    } 
    return(res) 
} 

plottest <- function(x1,y1) 
{ 
    plot(c(x1[1],y1[1]),c(x1[2],y1[2]), 
     xlim=c(-2,2),ylim=c(-2,2),col=2:3,pch=20,cex=2,asp=1) 
    lines(circleFun(x1,y1)) 
} 

par(mfrow=c(2,2)) 
plottest(c(1,-1),c(-1, 1)) 
plottest(c(-1, 1),c(1,-1)) 
plottest(c(-1,-1),c(1, 1)) 
plottest(c(1, 1),c(-1,-1)) 

結果:

enter image description here

質問:lines機能は図中のパス[1,1]と[1,2]を閉じ、なぜ私が把握することはできませんそれはしばらく図[2,1]と[2,2]ではそうではありません。期待される結果は、すべての図が第2列のものとすべきである。

ありがとうございました!

答えて

6

言いました。これは、あなたの期待される出力と、あなたの関数のはるかに単純なバージョンです。 direc変数は、半円形の時計回りまたは反時計回りに描画するか否かを決定するものである

circleFun <- function(x, y) { 

    center <- (x + y)/2 
    radius <- sqrt(sum((x - y)^2))/2 
    angle <- atan2((y - x)[2], (y - x)[1]) 
    direc <- ifelse(abs(angle) > pi/2, -1, 1) 
    tt <- seq(0, direc * pi, length.out = 1000) 

    return(data.frame(x = center[1] + radius * cos(angle + tt), 
        y = center[2] + radius * sin(angle + tt))) 
} 

open semi-circles

+1

1:この機能は、それが他の1つの入力点からプロット利益を有します。サークル内の点の数を(例えば)10に減らすと、OPの関数にプロット内のいずれかの端点が含まれていないことがわかります。 – Simon

+1

awsome、非常にエレガントなコード – Emer

3

私はlines機能に関するご質問に答えることができますが、私は期待される動作を生成するために、あなたのcircleFunを修正する方法を見つけ出すためにあなたにそれを残します:

lines()は、彼らが表示される順序で点を結びますデータ。また、パスは、最初のポイントがデータの最後に再び含まれる場合にのみ閉じられます。次の図は、この動作を示しています。他の人のように

par(mfrow=c(1, 2)) 

plot(x=c(-1, 0, 1), y=c(-1, 1, -1), xlim=c(-2, 2), ylim=c(-2, 2), 
    type="l", asp=1) 
points(x=c(-1, 1), y=c(-1, -1)) 

plot(x=c(-1, 0, 1, -1), y=c(-1, 1, -1, -1), xlim=c(-2, 2), ylim=c(-2, 2), 
    type="l", asp=1) 
points(x=c(-1, 1), y=c(-1, -1)) 

enter image description here

関連する問題