2010-08-06 18 views
5

Sto cercando di capire come farlo. Essenzialmente ho punti A e B di cui conosco la posizione. Poi ho il punto C e il punto D che conosco solo le coordinate di C. Conosco la lunghezza di C-D e so che C-D deve essere parallelo a A-B. Come potrei generalmente risolvere per D dato A, B, C e la lunghezza di C-D. GrazieAiuto con questo problema?

alt text http://img706.imageshack.us/img706/4494/imgclr.png

+3

esigenze "appartiene a mathoverflow" opzione vicino, se avessero probabilmente fiamma per chiedere una semplice domanda così: p – meagar

+1

@meager: Da quello che ho' Hanno visto, si fermerebbero a corto di fiamma, ma potrebbero essere un po 'condiscendente. :-) –

+1

Sono un grande programmatore, ma le mie abilità matematiche sono sempre state NULL – jmasterx

risposta

9

D = C ± (B-A)/| B-A | * | C-D |

Se B = A non esiste una soluzione come la linea AB degenera in un punto e parallelety di una linea ad un punto non è definito.

Spiegazione

(B-A)/| B-A | è un vettore di direzione di lunghezza unitaria. Moltiplicazione per la lunghezza | C-D | risultati nel vettore offset corretto.

Modifiche: modificato + su ± per fornire entrambe le soluzioni. Aggiunto il caso banale B = A.

+3

corretto. Anche 'C- (B-A)/| B-A | * | C-D |' è una soluzione (camminando nella direzione opposta da 'C'). – phimuemue

0

Conoscendo la posizione di A & B, si può facilmente trovare la lunghezza e la pendenza della linea AB.

Per posizionare D è necessario conoscere la lunghezza e la pendenza della linea CD. Conosci già la lunghezza e la pendenza del CD è la stessa di Slope of AB dato che sono parellel.

1

Introdurre il vettore v = A - B. Questa direzione sarà la stessa della direzione tra C e D. Quindi D =C + & lambda; v e abbiamo solo bisogno di determinare & lambda ;. La distanza tra C e D è noto, d. Ma la distanza è d = | D - C | = | C + & lambda; v - C | = | & Lambda; | v, dove v = | v | è la lunghezza di v. Così | & Lambda; | = d/v in modo che & lambda; = ± d/v.

FYI, la lunghezza | u | di un vettore u = (x, y) è dato da | u | = sqrt (x^2 + y^2), dal teorema di Pitagora.

0

T (x) è una traduzione sul punto x

Se T (a) = c, allora T (b) = d

Fondamentalmente, elaborare il movimento richiesto per ottenere da A a C e applicare la stessa funzione a b.

Modifica: Anche se tecnicamente, dalle informazioni che ci hai fornito, puoi calcolare solo due posizioni diverse per d, non una. Conoscere la lunghezza non è sufficiente - d potrebbe essere su entrambi i lati di c.

3

Questa risposta è simile ad alcuni altri, ma penso che spieghi di più la matematica e dovrebbe consentirvi di incorporarla più facilmente in un programma.

È possibile trovare la pendenza della linea "conosciuto" facendo (Ay-By)/(Ax-Bx) (dove Ay è la coordinata y di A, etc.). Chiamiamo solo questo M poiché è interamente calcolabile.

Se le due linee sono parallele, allora si può lavorare fuori il gradiente dell'altra linea nello stesso modo:

gradiente = (Cy-Dy)/(Cx-Dx) = M

riordinando a (Cy-Dy) = M*(Cx-Dx)

Sappiamo anche che C->D è una determinata lunghezza (chiamiamola L). Quindi possiamo dire

(Cy-Dy)^2+(Cx-Dx)^2 = L^2 

Utilizzando la nostra equazione gradiente possiamo sostituire per ottenere:

(M^2+1)(Cx-Dx)^2 = L^2 

Dato che sappiamo che cosa M, L e DX sono possiamo facilmente risolvere questo:

Cx = ((L^2)/(M^2+1))^0.5 + Dx 

quindi possiamo utilizzare questo valore di Cx insieme a entrambe le equazioni (il gradiente è probabilmente il più semplice) per ottenere Cy.

Di nota è che l'ultima equazione ha una radice quadrata che può essere positiva o negativa in modo da ottenere due valori possibili di Cx e quindi due possibili valori di Cy. Questo è l'equivalente del movimento nelle due direzioni opposte sulla linea parallela da D.

Edit:

Come notato nei commenti questo fallirà se la linea è verticale (cioè Ax-Bx = 0). Avresti bisogno di un caso speciale, ma in questo caso la risposta diventa un caso banale di aggiungere o sottrarre la tua lunghezza dal valore di Cy.

+1

Questa è una soluzione più esplicita. È tuttavia valido solo per il caso speciale R^2. –

+1

@Peter G .: questo è vero. Il diagramma qui sopra era solo in R^2. ;-) Ho principalmente messo questa risposta giù perché se l'OP affermava di avere competenze matematiche NULL non ero sicuro che sarebbe stato in grado di tradurre necessariamente le soluzioni vettoriali in codice. – Chris

+0

Bene, la maggior parte delle immagini PNG sono piatte ... Ma il contenuto dell'immagine potrebbe benissimo da un'immagine in R^3. –

0

Ci sono due formule che si applicano qui.

Il primo è pendenza (dislivello durante la corsa), che = (Yb-Ya)/(Xb-Xa) nonché (Yd-Yc)/(Xd-Xc) poiché i segmenti di linea sono paralleli.

Il secondo è il teorema di Pitagora, L^2 = (Xd-Xc)^2 + (Yd-Yc)^2, dove L è la lunghezza data di C-D.

Rappresentando la pendenza come m e risolvendo le equazioni per punto D's X e Y valori rendimenti (credo) queste due formule:

Xd = Xc + (L^2/(1 + m^2))^0.5

Yd = Yc + m (Xd - Xc)