2013-03-01 8 views
5

मैं अपने डेटा के 3 डी प्लॉट बनाने के लिए आरजीएल पैकेज का उपयोग कर रहा हूं। कुछ कारणों से (3 डी पीसीए बायप्लॉट्स) मुझे वैक्टर की आवश्यकता है - एक तीर वाला एक रेखा खंड। और मैं अटक गया हूं, क्योंकि मैं 3 डी शंकु तीर के सिर के रूप में रखना चाहता हूं।मैं आर में 3 डी तीर कैसे आकर्षित करूं?

किसी भी तरह, मैं समस्या के ज्यामिति के आसपास अपने सेनेइल दिमाग को लपेट नहीं सकता। कहो, मैं

segments3d(rbind(c(0, 0, 0), c(3, 3, 3))) 

साथ वेक्टर आकर्षित होता है कि, उपयोगकर्ता का उद्गम से एक सदिश [3,3,3] के लिए समन्वय प्रणाली।

मैं टिप के साथ एक शंकु [3,3,3] पर बनाना चाहता हूं। शंकु का आधार एक सर्कल के साथ बनाया जा सकता है। r त्रिज्या के साथ (y तल पर लम्ब) XZ विमान पर एक चक्र आकर्षित आसान है: इस तरह के

n <- 10 
sin.t <- sin(seq(0, 2 * pi, len= n)) 
cos.t <- cos(seq(0, 2 * pi, len= n)) 
r <- 0.1 
xv <- x + r * sin.t 
yv <- rep(y, n) 
zv <- z + r * cos.t 

लेकिन मैं अब कैसे बदलना है इन बातों में उस मंडली वेक्टर करने के लिए खड़ा है? और इसके केंद्र 0.2 वेक्टर दिशा के साथ टिप से? एक बार मेरे पास यह परिवर्तन हो जाने के बाद, मैं triangles3d फ़ंक्शन के साथ त्रिकोण खींचूंगा, प्रत्येक त्रिभुज टिप पर एक कोने और सर्कल के बिंदुओं के भीतर दो कोष्ठक रखेगा।

यह मूल गणित है, और मुझे पता है कि 18 वर्षीय मुझे कोई समस्या नहीं होगी (या यहां तक ​​कि 28 वर्षीय मुझे भी)। किसी भी हुक (मछली के विपरीत) की सराहना की जाएगी।

उत्तर

7

आरजीएल के लिए डेमो में एक cone3d फ़ंक्शन है। यह आधार और टिप को अलग-अलग लेता है। किसी भी घटना में आप कुछ इस तरह कर सकता है:

cone3d <- function(base=c(0,0,0),tip=c(0,0,1),rad=1,n=30,draw.base=TRUE,qmesh=FALSE, 
        trans = par3d("userMatrix"), ...) { 
    ax <- tip-base 
    if (missing(trans) && !rgl.cur()) trans <- diag(4) 
    ### is there a better way? 
    if (ax[1]!=0) { 
    p1 <- c(-ax[2]/ax[1],1,0) 
    p1 <- p1/sqrt(sum(p1^2)) 
    if (p1[1]!=0) { 
     p2 <- c(-p1[2]/p1[1],1,0) 
     p2[3] <- -sum(p2*ax) 
     p2 <- p2/sqrt(sum(p2^2)) 
    } else { 
     p2 <- c(0,0,1) 
    } 
    } else if (ax[2]!=0) { 
    p1 <- c(0,-ax[3]/ax[2],1) 
    p1 <- p1/sqrt(sum(p1^2)) 
    if (p1[1]!=0) { 
     p2 <- c(0,-p1[3]/p1[2],1) 
     p2[3] <- -sum(p2*ax) 
     p2 <- p2/sqrt(sum(p2^2)) 
    } else { 
     p2 <- c(1,0,0) 
    } 
    } else { 
    p1 <- c(0,1,0); p2 <- c(1,0,0) 
    } 
    degvec <- seq(0,2*pi,length=n+1)[-1] 
    ecoord2 <- function(theta) { 
    base+rad*(cos(theta)*p1+sin(theta)*p2) 
    } 
    i <- rbind(1:n,c(2:n,1),rep(n+1,n)) 
    v <- cbind(sapply(degvec,ecoord2),tip) 
    if (qmesh) 
    ## minor kluge for quads -- draw tip twice 
    i <- rbind(i,rep(n+1,n)) 
    if (draw.base) { 
    v <- cbind(v,base) 
    i.x <- rbind(c(2:n,1),1:n,rep(n+2,n)) 
    if (qmesh) ## add base twice 
     i.x <- rbind(i.x,rep(n+2,n)) 
    i <- cbind(i,i.x) 
    } 
    if (qmesh) v <- rbind(v,rep(1,ncol(v))) ## homogeneous 
    if (!qmesh) 
    triangles3d(v[1,i],v[2,i],v[3,i],...) 
    else 
    return(rotate3d(qmesh3d(v,i,material=...), matrix=trans)) 
}  
:

vec=rbind(c(0, 0, 0), c(3, 3, 3)) 
segments3d(vec) 


cone3d(base=vec[2,]-(vec[1,]+vec[2,]/6), 
    #this makes the head go 1/6th the length of the arrow 
     rad=0.5, 
     tip=vec[2,], 
     col="blue", 
     front="lines", 
     back="lines") 

यहाँ cone3d समारोह है

संबंधित मुद्दे