Алгоритм отражения точки через линию - PullRequest
21 голосов
/ 22 июля 2010

Учитывая точку (x1, y1) и уравнение для линии (y = mx + c), мне нужен некоторый псевдокод для определения точки (x2, y2), которая является отражением первой точки на линии.Потратил около часа, пытаясь понять это без удачи!

Смотрите здесь для визуализации - http://www.analyzemath.com/Geometry/Reflection/Reflection.html

Ответы [ 9 ]

35 голосов
/ 22 июля 2010

Хорошо, я собираюсь дать вам метод поваренной книги, чтобы сделать это. Если вы заинтересованы в том, как я получил это, скажите мне, и я объясню это.

Учитывая (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

19 голосов
/ 22 июля 2010

Это простое объяснение решения Иль-Бхимы.Хитрость заключается в том, чтобы заметить, что вам нужно проецировать эту точку ортогонально на линию, переместить ее на столько, а затем еще раз переместить в том же направлении.

Для проблем такого типа этопроще работать с немного более избыточным представлением для строки.Вместо 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, нам нужно переместить всю задачу так, чтобы линия прошла через начало координат, вычитая p из p1, используя приведенную выше формулу, и перемещая ее назад.Затем 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 голосов
/ 23 июня 2015

Отражение можно найти в два этапа.Сначала переведите (сдвиньте) все вниз на 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]

Ситуация очень похожа на матрицы вращения в аффинной геометрии.Если у вас уже есть процедуры умножения матриц, поскольку вы, например, также выполняете ротацию, это может быть наиболее приемлемым способом реализации отражений.

2 голосов
/ 16 ноября 2012

Со ссылкой на рисунок здесь .

Мы хотим найти отражение точки 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) Найти точку пересечения' M 'в L1 и Ld L2 4) Так как теперь у нас есть координаты A и M, то координату A можно легко получить, используя соотношение [ A(p,q)+A'(p',q') ]/2 = M(a,b)

Я не проверял следующий код, но грубая форма кода на ФОРТРАНЕ

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
1 голос
/ 29 сентября 2017

У меня есть более простой и легкий способ реализовать в 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();

}

0 голосов
/ 10 ноября 2015

Найти наклон данной линии.Скажи, что это м.Таким образом, наклон линии, соединяющей точку и ее зеркальное отображение, равен -1 / м.Используйте форму точки наклона, чтобы найти уравнение линии и найти ее взаимодействие с данной линией.Наконец, используйте точку пересечения в формуле средней точки, чтобы получить требуемую точку.С уважением, Шашанк Дешпанде

0 голосов
/ 23 июня 2015

Отражение точки A (x, y) на линии y = mx + c.
Заданная точка 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 голосов
/ 23 июня 2015

Отражение точки на линии. Заданная точка P (x, y) и линия L1. Тогда P (X, Y) - это отраженная точка на линии L1. Если мы соединяем точку P с P ', чтобы получить L2, то градиентL2 = 1 / m1, где m1 - градиент L1. L1 и L2 перпендикулярны друг другу. Получите точку пересечения L1 и L2, скажем, m (a, b), поскольку m (a, b) является средней точкой PP ', т. Е. L2, тогда M =
ie = из этого мы можем получить координаты примера. Найти изображение точки P (4,3) под отражением в линии
M1 = 1 M2 будет равно -1 экв.L2 с точками, (4,3), (x, y) град -1 равен

Точка пересечения, скажем, M (a, b) Обратите внимание, что L1 = L2;Тогда Это дает точку для М, которая является M (6,1) Тогда;

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

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

0 голосов
/ 22 июля 2010

Эта ссылка содержит алгоритм, аналогичный тому, что вы пытаетесь сделать:

То есть отражать луч от нормали.

альтернативный текст http://local.wasp.uwa.edu.au/~pbourke/geometry/reflected/diagram.gif

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...