ポイント(x1、y1)とラインの方程式(y = mx + c)が与えられた場合、ライン全体の最初のポイントの反射であるポイント(x2、y2)を決定するためのいくつかの疑似コードが必要です。運が悪ければそれを理解しようと1時間ほど費やしました!
視覚化についてはこちらをご覧ください- http://www.analyzemath.com/Geometry/Reflection/Reflection.html
では、これを行うためのクックブックメソッドを紹介します。私がそれをどのように導出したかに興味があれば、教えてください。説明します。
_(x1, y1)
_と線_y = mx + c
_を指定すると、点_(x2, y2)
_が線に反映されます。
セットd:= (x1 + (y1 - c)*m)/(1 + m^2)
次に_x2 = 2*d - x1
_
および_y2 = 2*d*m - y1 + 2*c
_
これはIl-Bhimaの解法の簡単な説明です。トリックは、あなたが望むのはその点を線に直角に投影し、それだけそれを動かし、それからもう一度同じ方向に動かすことであることに気づくことです。
これらのタイプの問題の場合、ラインの表現を少し冗長にすることで作業が容易になります。 _y = m x + b
_の代わりに、ライン上のポイントp
とラインの方向のベクトルd
でラインを表現しましょう。この点をp = (0, b)
、ベクトルをd = (1, m)
と呼びましょう。入力点は_p1
_になります。ライン上の投影されたポイントはpl
であり、出力ポイントは_p2
_です。つまり、p1 + 2 * (pl - p1) = 2 * pl - p1
になります。
ここで必要な式は、Originをv
の方向に通る線へのベクトルd
の投影です。 _d * <v, d> / <d, d>
_で指定されます。ここで、_<a, b>
_は2つのベクトルの内積です。
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
_を使用して最終的な値を取得します。
反射は2つのステップで見つけることができます。最初にすべてを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)
_です。
アフィン変換として、上記の演算を3つの行列の合成(積)として記述できます。最初にシフト_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]
_
この状況は、アフィンジオメトリの回転行列とよく似ています。たとえばローテーションも行っているため、すでに行列乗算ルーチンを使用している場合は、これがリフレクションを実装する最もメンテナンスしやすい方法である可能性があります。
イチジクを参照してください ここに 。
L1、eqn _y = m*x + c
_行への点A(p,q)
の反映を見つけたいと思います。反射点はA'(p',q')
だとしましょう
点AとA 'を結ぶ線がL2であり、eqnがあるとします。y= m' * x + c 'L1&L2はM(a、b)で交差します。
点の反射を見つけるためのアルゴリズムは次のとおりです。1)L1とL2は垂直であるため、L2の勾配は= -1/mです2)m 'とA(x、y)を使用してeqnを使用してc'を見つけますL2の3)L1とSd L2の交点「M」を見つけます4)これでAとMの座標が得られたので、Aの座標は関係[ A(p,q)+A'(p',q') ]/2 = M(a,b)
を使用して簡単に取得できます
私は次のコードをチェックしていませんが、FORTRANのコードの大雑把な形式は
_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
_
私は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();
}
ライン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)
ライン内のポイントの反射与えられたポイントP(x、y)とラインL1次に、P(X、Y)はラインL1上の反射ポイントですポイントLを取得するためにポイントPをP 'に結合すると、L2 = 1の勾配/ m1ここでm1はL1の勾配ですL1とL2は互いに垂直ですL1とL2の交点を取得しますm(a、b)と言います=
すなわち=これから、例の座標を取得できます。ラインの反射の下にあるポイントP(4,3)の画像を検索します
M1 = 1 M2は-1 Equ。ポイント付きのL2、(4,3)、(x、y)grad -1は
交点はM(a、b)であることに注意してください。L1= L2です。次に、これはM(6,1)であるMのポイントを与えます。
This gives x = 8 and y = -1 hence,
P '(x、y)= P'(8、-1)
与えられた直線の傾きを求めます。それがmだとしましょう。したがって、点とその鏡像を結ぶ線の傾きは-1/mです。勾配点形式を使用して線の方程式を見つけ、指定された線との交差を見つけます。最後に、中点式で交点を使用して、必要な点を取得します。よろしく、Shashank Deshpande