Подтвердить что ты не робот

Алгоритм для отражения точки по прямой

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Для этих типов проблем легче работать с немного более избыточным представлением для строки. Вместо 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, чтобы получить окончательные значения.

Ответ 3

Что касается fig здесь.

Мы хотим найти отражение точки A(p,q) линии L1, eqn y = m*x + c. Скажем, отраженная точка A'(p',q')

Предположим, Линия, соединяющая точки A и A ', равна L2 с eqn: y = m' * x + c ' L1 и L2 пересекаются при M (a, b)

Алгоритм поиска отражения точки выглядит следующим образом: 1) Найти наклон L2 = -1/м, так как L1 и L2 перпендикулярны 2) Используя m 'и A (x, y), найдем c', используя уравнение L2 3) Найдите точку пересечения "M" L1 anSd L2 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

Ответ 4

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

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

Ответ 5

У меня есть простой и простой способ реализовать в С++

#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();

}

Ответ 7

Отражение точки в строке При заданной точке 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 =
т.е. из этого можно получить координаты пример Найти изображение точки P (4,3) при отражении в линии
M1 = 1 M2 будет -1 Equ. L2 с точками, (4,3), (x, y) grad -1 является

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

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

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

Ответ 8

Отражение точки 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)

Ответ 9

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