給定一個點(x1,y1)和線的方程(y = mx + c),我需要一些僞代碼來確定點(x2,y2),這是一個反射的第一個點橫過線。花了大約一個小時試圖找出沒有運氣!用於反射線上點的算法
在這裏看到一個可視化 - http://www.analyzemath.com/Geometry/Reflection/Reflection.html
給定一個點(x1,y1)和線的方程(y = mx + c),我需要一些僞代碼來確定點(x2,y2),這是一個反射的第一個點橫過線。花了大約一個小時試圖找出沒有運氣!用於反射線上點的算法
在這裏看到一個可視化 - http://www.analyzemath.com/Geometry/Reflection/Reflection.html
好吧,我去給你一本食譜的方法來做到這一點。如果你對我如何派生它感興趣,告訴我,我會解釋它。
鑑於(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
你用'y'作爲點座標和公式來描述這條線有點令人困惑。 – Qbyte 2017-03-16 17:35:12
這link包含算法類似於你正在嘗試做的事:
這是反映射線掀起了正常。
alt text http://local.wasp.uwa.edu.au/~pbourke/geometry/reflected/diagram.gif
-1:重讀這個問題 - 他希望在*行上反射一個*點* * – 2010-07-22 08:30:46
重新讀我的回答:這就是爲什麼我說它是類似的。用英語表示涉及或涉及。 Normal具有與行相同的內部數據成員。並且一個點也具有與矢量相同的內部數據成員。最終這就是爲什麼我說這是一個類似的問題。 – 2010-07-22 09:37:50
這是伊爾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這是一個很好的解釋! – 2010-07-23 09:12:34
參照圖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
反射點的(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)
反射可以在兩個步驟中找到。首先將所有東西都翻譯(移位)到b
單位,所以點數變成V=(x,y-b)
,行變成y=mx
。然後該行內的矢量是L=(1,m)
。現在通過原點計算由線的反射,
(x',y') = 2(V.L)/(L.L) * L - V
其中V.L
和L.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]
這種情況與仿射幾何中的旋轉矩陣非常相似。如果你已經有矩陣乘法例程可用,因爲你也做旋轉例如,這可能是實現反射的最可維護的方式。
在線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)
查找給定的直線的斜率。 說這是米。 所以連接點和鏡像的直線斜率爲-1/m。 使用斜率點形式找出線的方程,並找到與給定線的相互作用。最後使用中點公式中的交點來獲得所需的點。 問候, 沙善德什潘德
我有一個簡單,一個簡單的方法在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();
}
嘛,不是一個真正的算法來實現,但我已經寫了一些解釋:HTTP:/ /martin-thoma.com/reflecting-a-point-over-a-line/ – 2012-12-02 13:34:45
感謝文章@moose。一個例子會更好 – 2014-12-26 08:58:48