2010-07-22 12 views
19

Biorąc pod uwagę punkt (x1, y1) i równanie dla linii (y = mx + c), potrzebuję jakiegoś pseudokodu do określenia punktu (x2, y2), który jest odbiciem pierwszego punktu na linii. Spędziłem około godziny próbując to rozgryźć bez powodzenia!Algorytm dla odzwierciedlenia punktu na linii

Zobacz tutaj wizualizacji - http://www.analyzemath.com/Geometry/Reflection/Reflection.html

+2

Cóż, naprawdę nie algorytmu, ale pisałem kilka wyjaśnień: http://martin-thoma.com/reflecting-a-point-over-a-line/ –

+0

dzięki za artykuł @moose. Przykład byłby jeszcze lepszy –

Odpowiedz

32

Ok, mam zamiar dać Ci metodę cookbook, aby to zrobić. Jeśli jesteś zainteresowany tym, jak go wyprowadziłem, powiedz mi, a ja to wyjaśnię.

Biorąc pod uwagę (x,y) i linię chcemy, aby punkt (x', y') odzwierciedlenie na linii.

Set d:= (x + (y - c)*a)/(1 + a^2)

Następnie x' = 2*d - x

i y' = 2*d*a - y + 2c

+0

To trochę mylące, że używasz 'y' jako współrzędnej punktu i formuły do ​​opisania linii. – Qbyte

0

Ten link zawiera algorytm, który jest podobny do tego, co staramy się robić:

czyli odbijają promień poza normalnym.

alt text http://local.wasp.uwa.edu.au/~pbourke/geometry/reflected/diagram.gif

+0

-1: ponownie przeczytaj pytanie - chce odzwierciedlić * punkt * w poprzek * linii * –

+2

ponownie przeczytać moją odpowiedź: To dlatego powiedziałem, że jest PODOBNE. W języku angielskim oznacza to, że odnosi się do lub odnosi się do. Normalny ma tych samych wewnętrznych elementów danych, co linia. Punkt ma również tych samych wewnętrznych elementów danych, co wektor. Właśnie dlatego powiedziałem, że jest to PODOBNY problem. –

18

Jest to proste wyjaśnienie rozwiązania Il-Bhima jest. Sztuką jest zauważenie, że to, czego chcesz, to rzutowanie tego punktu ortogonalnie na linię, przesuwanie go o tyle, a następnie przesuwanie go jeszcze raz, w tym samym kierunku.

W przypadku tego typu problemów łatwiej jest pracować z nieco bardziej redundantną reprezentacją linii. Zamiast y = m x + b, oznaczmy linię przez punkt p, który jest na linii i wektor d w kierunku linii. Nazwijmy ten punkt p = (0, b), wektor d = (1, m), a twoim punktem wejściowym będzie p1. Prognozowany punkt na linii będzie pl i punkt wyjścia p2 jest więc p1 + 2 * (pl - p1) = 2 * pl - p1

Formuła trzeba tutaj jest rzutem wektora v na linii, która przechodzi przez początek układu współrzędnych w kierunku d. Jest on podany przez d * <v, d>/<d, d>, gdzie <a, b> jest iloczynem punktowym między dwoma wektorami.

Aby znaleźć pl, musimy przesunąć cały problem tak, że linia przechodzi przez początek układu współrzędnych przez odjęcie p od p1, według powyższego wzoru, i przesuwając ją do tyłu. Następnie, pl = p + (d * <p - p1, d>/<d, d>), więc , pl_y = p_y + (m * p1_x)/(1 + m * m), a następnie użyć p2 = 2 * pl - p1, aby uzyskać ostateczne wartości.

+1

+1 To wspaniałe wyjaśnienie! –

2

W odniesieniu do rys. in here.

Chcemy znaleźć odbicie punktu A(p,q) na linii L1, eqn y = m*x + c.Powiedzieć odzwierciedlenie w tym, A'(p',q')

Załóżmy, Linia łącząca pomiędzy punktami A i A”L2 z eqn: Y = M '* x + c' L1 & L2 przecinają się w punkcie M (a, b)

Algorytm znajdowania odbicia punktu jest następujący: 1) Znajdź nachylenie L2 wynosi = -1/m, ponieważ L1 i L2 są prostopadłe 2) Używanie m 'i A (x, y) find c "przy użyciu równania L2 3) Znajdź punkt przecięcia" M "L1 anSd L2 4) Jak teraz mamy współrzędne A i M, więc współrzędne A 'można łatwo uzyskać za pomocą relacji [ A(p,q)+A'(p',q') ]/2 = M(a,b)

nie zostały sprawdzone następujące kodu, ale surową formę kodu w FORTRAN jest

SUBROUTINE REFLECTION(R,p,q) 

IMPLICIT NONE 

REAL,INTENT(IN)  :: p,q 

REAL, INTENT(OUT) :: R(2) 

REAL    :: M1,M2,C1,C2,a,b 

M2=-1./M1      ! CALCULATE THE SLOPE OF THE LINE L2 

C2=S(3,1)-M2*S(3,2)    ! CALCULATE THE 'C' OF THE LINE L2 

q= (M2*C1-M1*C2)/(M2-M1)  ! CALCULATE THE MID POINT O 

p= (q-C1)/M1 

R(1)=2*a-p      ! GIVE BACK THE REFLECTION POINTS COORDINATE 

R(2)=2*b-q 

END SUBROUTINE REFLECTION 
0

Odbicie punkcie linii danego punktu P (x, y), a następnie p linii L1 (X, Y) jest punktem odbitym na linii L1 Jeśli połączymy punkt P z P ', aby uzyskać L2, wówczas gradient L2 = 1/m1 gdzie m1 jest gradientem L1 L1 i L2 są do siebie prostopadłe Otrzymaj punkt przecięcia L1 i L2 oznacza m (a, b) Ponieważ m (a, b) jest punktem środkowym PP 'tj. L2, to M =
tj = z tego, że można uzyskać współrzędne przykładu Znajdź obraz punktu P (4,3) na podstawie odbicia w linii
M1 = 1 być -1 M2 Equ. L2 z punktami, (4,3), (x, y) grad -1 to

Punkt przecięcia powiedzmy, M (a, b) Należy zauważyć, że L1 = L2; Następnie Daje to punkt dla M, który jest M (6,1) Następnie;

  This gives x = 8 and y = -1 hence, 

P '(x, y) = P' (8: 1)

1

Odbicie może znaleźć się w dwóch etapach. Najpierw przetłumacz (zmień) wszystko na jednostki b, aby punkt stał się V=(x,y-b), a linia stała się y=mx. Następnie wektor wewnątrz linii to L=(1,m). Teraz obliczyć odbicie od linii przez początek układu współrzędnych,

(x',y') = 2(V.L)/(L.L) * L - V 

gdzie V.L i L.L są kropka produkt i * jest skalarne wielokrotność.

Na koniec przenieś wszystko z powrotem, dodając b, a ostateczna odpowiedź to (x',y'+b).

Jako afinicznej transformacji można napisać powyższą operację jako kompozycji (preparatu) trzech macierzy najpierw reprezentujący zmianę y => y-b, to odbicie przez linię przez początek układu, a następnie przesunięcie y => y+b:

[ 1 0 0] [(1-m^2)/(1+m^2)  2m/(1+m^2) 0] [ 1 0 0] [x] 
[ 0 1 b] [  2m/(1+m^2) (m^2-1)/(1+m^2) 0] [ 0 1 -b] [y] 
[ 0 0 1] [    0    0 1] [ 0 0 1] [1] 

Sytuacja jest bardzo podobna do macierzy obrotowych w geometrii afinicznej. Jeśli masz już dostępne procedury mnożenia macierzy, ponieważ na przykład robisz rotacje, może to być najbardziej obsługiwany sposób implementacji odbić.

0

Odbicie punktu A (x, y) w linii y = mx + c.
Podany punkt P (x, y) i wiersz L1 y = mx + c.
Następnie P (X, Y) jest punktem odbitym na linii L1.
Jeśli połączymy punkt P z P ', aby otrzymać L2, wówczas gradient L2 = -1/m1, gdzie m1 jest gradientem L1.

L1 and L2 are perpendicular to each other. 
     therefore, 
    Get the point of intersection of L1 and L2 say m(a,b) 
    Since m(a,b) is the midpoint of PP’ i.e. L2, then 
    M= (A+A')/2 
    i.e. m(a,b)=(A(x,y)+ A^' (x^',y^'))/2. 
     from this we can get coordinates of A^' (x^',y^') 

Przykład

Find the image of point P(4,3) under a reflection in the line y=x-5 
M1=1 
M2 will be -1 
Equ. L2 with points, (4,3) , (x ,y) grad -1 is 
    y=-x+7 
Point of intersection say, M(a ,b) 
Note that, L1 =L2 ; 
    Then x-5=-x+7 
    This gives the point for M that is M(6,1) 
     Then; 
     M(6,1)=(P(4,3)+P^' (x^',y^'))/2 
      M(6,1)=[(4+x)/2 ,(3+y)/2] 
       This gives x = 8 and y = -1 hence, 
        P^' (x^',y^')=   P^' (8,-1) 
0

Znajdź zbocza danej linii. Powiedz, że to m. Tak więc nachylenie linii łączącej punkt i jego odbicie lustrzane to -1/m. Użyj wzoru punktu nachylenia, aby znaleźć równanie linii i znaleźć jego powiązanie z daną linią. Na koniec użyj punktu przecięcia w formule punktu środkowego, aby uzyskać wymagany punkt. Pozdrawiam, Shashank Deshpande

1

mam prostszy i łatwy sposób zaimplementować w C++

#include<graphics.h> 
#include<iostream> 
#include<conio.h> 
using namespace std; 

int main(){ 
cout<<"Enter the point"; 
float x,y; 
int gm,gd=DETECT; 
initgraph(&gd,&gm,"C:\\TC\\BGI"); 

cin>>x; 
cin>>y; 
putpixel(x,y,RED); 
cout<<"Enter the line slop and intercept"; 
float a,c; 
cin>>a; 
cin>>c; 
float x1,y1; 
x1 = x-((2*a*x+2*c-y)/(1+a*a))*a; 
y1=(2*a*x+2*c-y)/(1+a*a); 
cout<<"x = "<<x1; 
cout<<"y = "<<y1; 

putpixel(x1,y1,BLUE); 
getch(); 

}