2010-07-22 85 views
19

給定一個點(x1,y1)和線的方程(y = mx + c),我需要一些僞代碼來確定點(x2,y2),這是一個反射的第一個點橫過線。花了大約一個小時試圖找出沒有運氣!用於反射線上點的算法

在這裏看到一個可視化 - http://www.analyzemath.com/Geometry/Reflection/Reflection.html

+2

嘛,不是一個真正的算法來實現,但我已經寫了一些解釋:HTTP:/ /martin-thoma.com/reflecting-a-point-over-a-line/ – 2012-12-02 13:34:45

+0

感謝文章@moose。一個例子會更好 – 2014-12-26 08:58:48

回答

32

好吧,我去給你一本食譜的方法來做到這一點。如果你對我如何派生它感興趣,告訴我,我會解釋它。

鑑於(x,y)和一行y = ax + c我們希望點(x', y')反映在行上。

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

然後x' = 2*d - x

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

+0

你用'y'作爲點座標和公式來描述這條線有點令人困惑。 – Qbyte 2017-03-16 17:35:12

0

link包含算法類似於你正在嘗試做的事:

這是反映射線掀起了正常。

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

+0

-1:重讀這個問題 - 他希望在*行上反射一個*點* * – 2010-07-22 08:30:46

+2

重新讀我的回答:這就是爲什麼我說它是類似的。用英語表示涉及或涉及。 Normal具有與行相同的內部數據成員。並且一個點也具有與矢量相同的內部數據成員。最終這就是爲什麼我說這是一個類似的問題。 – 2010-07-22 09:37:50

18

這是伊爾Bhima的解決方案一個簡單的解釋。訣竅是注意你想要的是將該點正交投影到該線上,然後再移動它,然後再次沿同一方向移動它。

對於這些類型的問題,使用略多一點的冗餘表示法可以更容易地處理一條線。代替y = m x + b,讓我們通過線上的點p和線的方向上的矢量d來表示線。我們稱這一點爲p = (0, b),矢量d = (1, m),您的輸入點將爲p1。上線的投影點會pl和你的輸出點p2,那麼,是p1 + 2 * (pl - p1) = 2 * pl - p1

你所需要的計算公式爲載體v的投影其上通過原點進去方向d一條線。它由d * <v, d>/<d, d>給出,其中<a, b>是兩個向量之間的點積。

要找到pl,我們必須移動整個問題,以便通過從p1減去p,使用上述公式並將其移回來,從而使線條穿過原點。然後,pl = p + (d * <p - p1, d>/<d, d>),所以pl_x = p_x + (b * p1_x)/(1 + m * m),pl_y = p_y + (m * p1_x)/(1 + m * m),然後用p2 = 2 * pl - p1來獲得最終值。

+1

+1這是一個很好的解釋! – 2010-07-23 09:12:34

2

參照圖in here

我們想要找到點A(p,q)到點L1的反射,等式y = m*x + c。說反射點是A'(p',q')

假設, 線連接點A和A」是L2與等式:Y = M '* X + C' L1 & L2相交於M(A,B)

查找點反射的算法如下: 1)找到L2的斜率= -1/m,因爲L1和L2垂直 2)使用m'和A(x,y)查找c '使用等式L2 3)找到L1和S1的交點'M'4)現在我們具有A和M的座標,因此可以使用關係式容易地獲得A'的座標[ A(p,q)+A'(p',q') ]/2 = M(a,b)

我沒有檢查下面的代碼,但在FORTRAN代碼的粗製形式是在該行 鑑於點P

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

反射點的(X,Y)和線L1則P (X,Y)是線L1上的反射點如果我們將點P連接到P'以獲得L2,那麼L2的梯度= 1/m1,其中m1是L1的梯度L1和L2彼此垂直 獲取由於m(a,b)是PP'的中點(即L2),因此012和M =
即=從這裏我們可以得到座標 示例 找到點P(4,3)在該行的反射下的圖像
M1 = 1 M2將是-1 Equ。 L2與分,(4,3),(X,Y)GRAD -1

交點說,M(A,B) 。注意,L1 = L2; Then 這給出了M的點,即M(6,1) 然後;

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

P '(X,Y)= P'(8,-1)

1

反射可以在兩個步驟中找到。首先將所有東西都翻譯(移位)到b單位,所以點數變成V=(x,y-b),行變成y=mx。然後該行內的矢量是L=(1,m)。現在通過原點計算由線的反射,

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

其中V.LL.L是點積和*是標量倍數。

最後,通過添加b來改變一切,最終答案是(x',y'+b)

作爲仿射變換可以寫上述操作的三個矩陣的組合物(產品),第一表示移位y => y-b,然後通過線經過原點的反射,則移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] 

這種情況與仿射幾何中的旋轉矩陣非常相似。如果你已經有矩陣乘法例程可用,因爲你也做旋轉例如,這可能是實現反射的最可維護的方式。

0

在線y = mx + c中的點A(x,y)的反射。
給定點P(x,y)和線L1 y = mx + c。
然後P(X,Y)是線L1上的反射點。
如果我們將點P連接到P'得到L2,那麼L2的梯度= -1/m1,其中m1是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^') 

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

查找給定的直線的斜率。 說這是米。 所以連接點和鏡像的直線斜率爲-1/m。 使用斜率點形式找出線的方程,並找到與給定線的相互作用。最後使用中點公式中的交點來獲得所需的點。 問候, 沙善德什潘德

1

我有一個簡單,一個簡單的方法在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(); 

}