Помощь - Поиск - Пользователи - Календарь
Полная версия: Графические алгоритмы.
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Isolator
Народ. Срочно нужна ваша помощь. Подскажите как в Pascal (Unit Graph) отложить точку симметричную какой либо прямой, либо отрезка и как понять что эта точка пересекла отрезок (задается как две точки). Желательно выложить формулы plz.(Собственно говоря мне надо написать прогу, в которой летит точка и отбивается от произвольных отрезков(random двух точек). и без того, что я написал выше, ее не напишешь). Буду очень благодарен.
klem4
Вспомни курс геометрии, по двум точкам получай уравнение прямой, а потом проверяй принадлежит ли 3-я точка данной прямой.

Воспоьзуйся поиском по форуму, подобная задача наверняка решалась.
NorthAngel
Сталкивалась с подобным вопросом =))
Отложить точку, если правильно поняла суть, можно так: сначала узнаем k и b уравнения прямой оси симметрии (т.к. y=kx+b), затем находим k и b прямой, проходящей через заданную точку и перпендикулярной оси симметрии, координате х искомой точке присваиваем значение длины перпендикуляра, умноженного на два. Вторую координату из уравнения прямой.

Получить всё это можно преобразованием трех формул:
1) Уравнение прямой из данной точки с данным k: y=k(x-x3)+y3; (x3,y3)-координаты точки. 2) через две точки: (y-y2)/(y2-y1)=(x-x2)/(x2-x1). 3) зависимость угловых коэффициентов перпендикулярных п-х: k1*k2=-1.

Код
uses crt, Graph;
var i, gd, gm : integer;
    x , y: array[1..4] of integer; {координаты 1,2-прямой, 3-данной точки, 4-искомой точки}
    ptd : string;
    k1,b1,k2,b2 : real; {k и b 1-данной прямой, 2-прямой,ей перпендикулярной}
begin
    clrscr;
    for i:= 1 to 3 do
    begin
       write('x',i,'= '); read(x[i]);                    
       write('y',i,'= '); read(y[i]);
    end;
    gm:= 2; gd:= detect; ptd:='';
    InitGraph(gd,gm,ptd);
    Line(x[1], y[1], x[2], y[2]);
    k1:= (y[2]-y[1])/(x[2]-x[1]);
    b1:= -1*((x[1]*y[2])/(x[2]-x[1])-(x[2]*y[1])/(x[2]-x[1]));
    k2:= -1/((y[2]-y[1])/(x[2]-x[1]));
    b2:= -k2*x[3]+y[3];
    y[3]:= trunc(k2*x[3] + b2);
    x[4]:= trunc((b2-b1)/(k1-k2));
    x[4]:= x[4]+(x[4]-x[3]);
    y[4]:= trunc(k2*x[4] + b2);
    PutPixel(x[3],y[3],10);
    PutPixel(x[4],y[4],10);
    readkey;
end.


Хотя, мне кажется, это какой-то нерациональный алгоритм norespect.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.