web-dev-qa-db-ja.com

ラインを横切る点を反映するアルゴリズム

ポイント(x1、y1)とラインの方程式(y = mx + c)が与えられた場合、ライン全体の最初のポイントの反射であるポイント(x2、y2)を決定するためのいくつかの疑似コードが必要です。運が悪ければそれを理解しようと1時間ほど費やしました!

視覚化についてはこちらをご覧ください- http://www.analyzemath.com/Geometry/Reflection/Reflection.html

21
McGin

では、これを行うためのクックブックメソッドを紹介します。私がそれをどのように導出したかに興味があれば、教えてください。説明します。

_(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_

35
Il-Bhima

これは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_を使用して最終的な値を取得します。

20

反射は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]
_

この状況は、アフィンジオメトリの回転行列とよく似ています。たとえばローテーションも行っているため、すでに行列乗算ルーチンを使用している場合は、これがリフレクションを実装する最もメンテナンスしやすい方法である可能性があります。

2

イチジクを参照してください ここに

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
_
2
Yugal_kishore

私は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();

}

1
akash mahajan

ライン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
zadock Masakhwi

ライン内のポイントの反射与えられたポイント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)

0
demasakhwi

この link には、実行しようとしているものと同様のアルゴリズムが含まれています。

それは、法線からの光線を反映しています。

alt text

0
C Johnson

与えられた直線の傾きを求めます。それがmだとしましょう。したがって、点とその鏡像を結ぶ線の傾きは-1/mです。勾配点形式を使用して線の方程式を見つけ、指定された線との交差を見つけます。最後に、中点式で交点を使用して、必要な点を取得します。よろしく、Shashank Deshpande

0
Shanky