2012-09-04 24 views
8

के साथ दो बिंदुओं (त्रिज्या ज्ञात) के आधार पर सर्कल सेंटर निर्धारित करता है मेरे पास अंक की एक जोड़ी है और मैं इन दो बिंदुओं द्वारा निर्धारित ज्ञात आर की मंडलियों को ढूंढना चाहता हूं। मैं इसे x और y के लिए अनुकरण और संभावित स्थान में उपयोग कर रहा हूं सीमाएं हैं (-200, 200 का एक बॉक्स कहें)।हल/ऑप्टिमाइज़

It is known कि त्रिज्या के वर्ग

(x-x1)^2 + (y-y1)^2 = r^2 
(x-x2)^2 + (y-y2)^2 = r^2 

मैं अब दो संभावित चक्र केन्द्रों प्राप्त करने के लिए समीकरणों के इस गैर रेखीय प्रणाली का समाधान चाहते हैं। मैंने पैकेज BB का उपयोग करने का प्रयास किया। यहां मेरा कमजोर प्रयास है जो केवल एक बिंदु देता है। जो मैं प्राप्त करना चाहता हूं वह दोनों संभव अंक हैं। सही दिशा में किसी भी संकेतक को पहले संभावित अवसर पर मानार्थ बियर के साथ मुलाकात की जाएगी।

library(BB) 
known.pair <- structure(c(-46.9531139599816, -62.1874917150412, 25.9011462171242, 
16.7441676243879), .Dim = c(2L, 2L), .Dimnames = list(NULL, c("x", 
"y"))) 

getPoints <- function(ps, r, tr) { 
    # get parameters 
    x <- ps[1] 
    y <- ps[2] 

    # known coordinates of two points 
    x1 <- tr[1, 1] 
    y1 <- tr[1, 2] 
    x2 <- tr[2, 1] 
    y2 <- tr[2, 2] 

    out <- rep(NA, 2) 
    out[1] <- (x-x1)^2 + (y-y1)^2 - r^2 
    out[2] <- (x-x2)^2 + (y-y2)^2 - r^2 
    out 
} 

slvd <- BBsolve(par = c(0, 0), 
       fn = getPoints, 
       method = "L-BFGS-B", 
       tr = known.pair, 
       r = 40 
       ) 

ग्राफिक रूप से आप इसे निम्न कोड के साथ देख सकते हैं, लेकिन आपको कुछ अतिरिक्त पैकेज की आवश्यकता होगी।

library(sp) 
library(rgeos) 
plot(0,0, xlim = c(-200, 200), ylim = c(-200, 200), type = "n", asp = 1) 
points(known.pair) 
found.pt <- SpatialPoints(matrix(slvd$par, nrow = 1)) 
plot(gBuffer(found.pt, width = 40), add = T) 

enter image description here

परिशिष्ट

आप अपने सभी मूल्यवान टिप्पणियों और कोड के लिए धन्यवाद। मैं पोस्टर्स द्वारा उत्तरों के लिए समय प्रदान करता हूं जिन्होंने कोड के साथ अपने उत्तरों की सराहना की।

test replications elapsed relative user.self sys.self user.child sys.child 
4 alex   100 0.00  NA  0.00  0   NA  NA 
2 dason   100 0.01  NA  0.02  0   NA  NA 
3 josh   100 0.01  NA  0.02  0   NA  NA 
1 roland   100 0.15  NA  0.14  0   NA  NA 
+1

अंक करो परिधि पर झूठ? – James

+0

हाथों से समीकरण प्रणाली को हल करना और सूत्रों का उपयोग करना संभव है – MBo

+0

@ जेम्स, हाँ बिंदु परिधि पर कहीं झूठ बोलते हैं। मैंने अपना जवाब अपडेट कर दिया है जो परिणाम दिखाता है। –

उत्तर

4

यह हल करने के बारे में जाने का मूल ज्यामितीय तरीका है कि हर कोई इसका उल्लेख कर रहा है। मैं परिणामी वर्गबद्ध समीकरण की जड़ें प्राप्त करने के लिए पॉलीरूट का उपयोग करता हूं लेकिन आप आसानी से केवल वर्गबद्ध समीकरण का उपयोग कर सकते हैं।

# x is a vector containing the two x coordinates 
# y is a vector containing the two y coordinates 
# R is a scalar for the desired radius 
findCenter <- function(x, y, R){ 
    dy <- diff(y) 
    dx <- diff(x) 
    # The radius needs to be at least as large as half the distance 
    # between the two points of interest 
    minrad <- (1/2)*sqrt(dx^2 + dy^2) 
    if(R < minrad){ 
     stop("Specified radius can't be achieved with this data") 
    } 

    # I used a parametric equation to create the line going through 
    # the mean of the two points that is perpendicular to the line 
    # connecting the two points 
    # 
    # f(k) = ((x1+x2)/2, (y1+y2)/2) + k*(y2-y1, x1-x2) 
    # That is the vector equation for our line. Then we can 
    # for any given value of k calculate the radius of the circle 
    # since we have the center and a value for a point on the 
    # edge of the circle. Squaring the radius, subtracting R^2, 
    # and equating to 0 gives us the value of t to get a circle 
    # with the desired radius. The following are the coefficients 
    # we get from doing that 
    A <- (dy^2 + dx^2) 
    B <- 0 
    C <- (1/4)*(dx^2 + dy^2) - R^2 

    # We could just solve the quadratic equation but eh... polyroot is good enough 
    k <- as.numeric(polyroot(c(C, B, A))) 

    # Now we just plug our solution in to get the centers 
    # of the circles that meet our specifications 
    mn <- c(mean(x), mean(y)) 
    ans <- rbind(mn + k[1]*c(dy, -dx), 
       mn + k[2]*c(dy, -dx)) 

    colnames(ans) = c("x", "y") 

    ans 
} 

findCenter(c(-2, 0), c(1, 1), 3) 
1

यहां जवाब की हड्डियां हैं, अगर मेरे पास समय है तो मैं उन्हें बाहर निकाल दूंगा। यदि आप शब्दों के साथ आकर्षित करते हैं, तो यह पालन करना आसान होना चाहिए, क्षमा करें मेरे पास आपके लिए तस्वीर खींचने के लिए इस कंप्यूटर पर सही सॉफ़्टवेयर नहीं है।

अलग-अलग मामलों को छोड़ दें जहां अंक समान (अनंत समाधान) हैं या आपके चुने हुए त्रिज्या (कोई समाधान नहीं) के समान सर्कल पर झूठ बोलने के अलावा बहुत दूर हैं।

अंक X और Y और 2 सर्किल c1 और c2 के अज्ञात केंद्र बिंदु लेबल करें। c1 और c2XY के लंबवत द्विभाजक पर झूठ बोलते हैं; इस लाइन को c1c2 पर कॉल करें, इस स्तर पर यह असंभव है कि हम c1 और c2 के स्थानों के सभी विवरण नहीं जानते हैं।

तो, लाइन c1c2 के समीकरण को समझें। यह XY के आधे रास्ते के माध्यम से गुजरता है (इस बिंदु को Z पर कॉल करें) और XY के नकारात्मक पारस्परिक के बराबर ढलान है। अब आपके पास c1c2 का समीकरण है (या यदि आप इन हड्डियों पर कोई मांस थे)।

अब एक बिंदु से त्रिकोण को रेखा के चौराहे और उसके लंबवत द्विभाजक और सर्कल के केंद्र बिंदु (XZc1 कहें) का निर्माण करें। आप अभी भी नहीं जानते कि c1 कहां है, लेकिन किसी ने भी ज्यामिति को स्केच करने से रोका नहीं है। आपके पास दो तरफ की लंबाई के साथ एक सही त्रिकोण है (XZ और Xc1), इसलिए Zc1 ढूंढना आसान है। अन्य त्रिकोण और सर्कल केंद्र के लिए प्रक्रिया दोहराएं।

बेशक, यह दृष्टिकोण ओपी के प्रारंभिक दृष्टिकोण से काफी अलग है और अपील नहीं कर सकता है।

1

कुछ चेतावनियों से छुटकारा पाने के लिए, लेकिन यह आपको शुरू करना चाहिए। एक प्रदर्शन मुद्दा हो सकता है, इसलिए बुनियादी ज्यामिति के साथ इसे पूरी तरह से हल करना बेहतर दृष्टिकोण हो सकता है।

known.pair <- structure(c(-46.9531139599816, -62.1874917150412, 25.9011462171242, 
          16.7441676243879), .Dim = c(2L, 2L), .Dimnames = list(NULL, c("x", 
                         "y"))) 

findCenter <- function(p,r) { 
    yplus <- function(y) { 
    ((p[1,1]+sqrt(r^2-(y-p[1,2])^2)-p[2,1])^2+(y-p[2,2])^2-r^2)^2 
    } 


yp <- optimize(yplus,interval=c(min(p[,2]-r),max(p[,2]+r)))$minimum 
xp <- p[1,1]+sqrt(r^2-(yp-p[1,2])^2) 
cp <- c(xp,yp) 
names(cp)<-c("x","y") 

yminus <- function(y) { 
    ((p[1,1]-sqrt(r^2-(y-p[1,2])^2)-p[2,1])^2+(y-p[2,2])^2-r^2)^2 
} 


ym <- optimize(yminus,interval=c(min(p[,2]-r),max(p[,2]+r)))$minimum 
xm <- p[1,1]-sqrt(r^2-(ym-p[1,2])^2) 
cm <- c(xm,ym) 
names(cm)<-c("x","y") 


list(c1=cp,c2=cm) 
} 

cent <- findCenter(known.pair,40) 
0

मुझे उम्मीद है कि आप कुछ बुनियादी ज्यामिति जानते हैं, क्योंकि मैं दुर्भाग्य से इसे आकर्षित नहीं कर सकता।

लम्बवत द्विभाजक रेखा वह रेखा है जहां एक सर्कल के प्रत्येक मध्य बिंदु ए और बी दोनों को पार करता है।

अब आपके पास एबी और आर के बीच है, तो आप बिंदु ए, एबी के बीच और सर्कल के अज्ञात मध्य बिंदु के साथ एक सही त्रिकोण खींच सकते हैं।

अब एबी के मध्य बिंदु से सर्कल के मध्य बिंदु से दूरी प्राप्त करने के लिए पाइथागोरस प्रमेय का उपयोग करें, और सर्कल की स्थिति की गणना मूल पाप/कॉस संयोजनों का उपयोग करके यहां से कठिन नहीं होनी चाहिए।

3

कोई संख्यात्मक समीकरण हल करने की आवश्यकता नहीं है। बस सूत्र:

  1. आप जानते हैं कि चूंकि दोनों बिंदु ए और बी सर्कल पर स्थित हैं, इसलिए प्रत्येक से एक दिए गए केंद्र से दूरी त्रिज्या आर है।
  2. आधार पर दो ज्ञात बिंदुओं और सर्कल केंद्र पर तीसरे बिंदु की तार के साथ एक समद्विभुज त्रिकोण बनाएं।
  3. ए और बी के बीच त्रिभुज मिडवे को विभाजित करें, जिससे आपको दाएं-कोण त्रिकोण मिलते हैं।
  4. http://mathworld.wolfram.com/IsoscelesTriangle.html आपको आधार लंबाई और त्रिज्या के संदर्भ में ऊंचाई देता है।
  5. ऊंचाई से प्रत्येक दिशा में गणना की ऊंचाई की दूरी के लिए एबी तार (See this SO Answer) पर सामान्य का पालन करें।
9

निम्नलिखित कोड आपको दो वांछित मंडलियों के केंद्रों पर अंक प्राप्त करेगा। इस पर टिप्पणी करने के लिए अभी कोई समय नहीं है या परिणामों को Spatial* ऑब्जेक्ट्स में कनवर्ट करें, लेकिन इससे आपको अच्छी शुरुआत मिलनी चाहिए।

सबसे पहले, यहां बिंदु नामों को पेश करने के लिए एक ASCII-art आरेख है। k और K ज्ञात अंक हैं, B क्षैतिज k के माध्यम से तैयार पर एक बिंदु है, और C1 और C2 हलकों के केन्द्रों आप कर रहे हैं के बाद:

 C2 





          K 


        k----------------------B 






             C1 

अब कोड:

# Example inputs 
r <- 40 
known.pair <- structure(c(-46.9531139599816, -62.1874917150412, 
25.9011462171242, 16.7441676243879), .Dim = c(2L, 2L), 
.Dimnames = list(NULL, c("x", "y"))) 

## Distance and angle (/_KkB) between the two known points 
d1 <- sqrt(sum(diff(known.pair)^2)) 
theta1 <- atan(do.call("/", as.list(rev(diff(known.pair))))) 

## Calculate magnitude of /_KkC1 and /_KkC2 
theta2 <- acos((d1/2)/r) 

## Find center of one circle (using /_BkC1) 
dx1 <- cos(theta1 + theta2)*r 
dy1 <- sin(theta1 + theta2)*r 
p1 <- known.pair[2,] + c(dx1, dy1) 

## Find center of other circle (using /_BkC2) 
dx2 <- cos(theta1 - theta2)*r 
dy2 <- sin(theta1 - theta2)*r 
p2 <- known.pair[2,] + c(dx2, dy2) 

## Showing that it worked 
library(sp) 
library(rgeos) 
plot(0,0, xlim = c(-200, 200), ylim = c(-200, 200), type = "n", asp = 1) 
points(known.pair) 
found.pt <- SpatialPoints(matrix(slvd$par, nrow = 1)) 
points(p1[1], p1[2], col="blue", pch=16) 
points(p2[1], p2[2], col="green", pch=16) 

enter image description here

4

@ PhilH के समाधान के बाद, सिर्फ आर में त्रिकोणमिति का उपयोग कर:

radius=40 

त्रिज्या पर मूल अंक ड्रा

plot(known.pair,xlim=100*c(-1,1),ylim=100*c(-1,1),asp=1,pch=c("a","b"),cex=0.8) 

ab के मध्य c का पता लगाएं (जो भी है de के मध्य बिंदु दो सर्कल केंद्र)

AB.bisect=known.pair[2,,drop=F]/2+known.pair[1,,drop=F]/2 
C=AB.bisect 
points(AB.bisect,pch="c",cex=0.5) 

दो हलकों

CD.len=sqrt(diff(c(AB.len/2,radius)^2)) 
CD.angle=AB.angle-pi/2 

की गणना के केन्द्रों को c से लंबाई और तार ab

AB.vector=known.pair[2,,drop=F]-known.pair[1,,drop=F] 
AB.len=sqrt(sum(AB.vector^2)) 
AB.angle=atan2(AB.vector[2],AB.vector[1]) 
names(AB.angle)<-NULL 

लंबाई और रेखा के कोण की गणना के कोण का पता लगाएं और की स्थिति साजिश दो केंद्र d और e लंबवत से ab और लंबाई:

center1=C+CD.len*c(x=cos(CD.angle),y=sin(CD.angle)) 
center2=C-CD.len*c(x=cos(CD.angle),y=sin(CD.angle)) 
points(center1[1],center1[2],col="blue",cex=0.8,pch="d") 
points(center2[1],center2[2],col="blue",cex=0.8,pch="e") 

शो:

enter image description here