Помощь - Поиск - Пользователи - Календарь
Полная версия: Простенькая задачка
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Костян
Народ, всем салют, у мня к вам вот такой вот вопросик. Есть простенькая задача:написать прогу проверяющую лежат ли 3 точки заданные пользователем на одной прямой(каждая точка имеет две координаты-икс и игрек).
Вот в принципе эта прога:
Код
program vector;
uses crt;
var
x1,y1,x2,y2,x3,y3: real;
otrx1,otry1,otrx2,otry2: real;
begin
clrscr;
writeln('Введите 3 координаты');
readln(x1);
readln(y1);
readln(x2);
readln(y2);
readln(x3);
readln(y3);
otrx1:=x2-x1; otry1:=y2-y1;
otrx2:=x3-x1; otry2:=y3-y1;
if (otrx1=otrx2) and (otry1=otry2) then
writeln('Данные точки лежат на одной прямой')
else
writeln('Данные точки не лежат на одной прямой');
readkey;
end.

Вопрос: правильна ли эта прога(считает вроде все правильно), можно ли сделать как нить по другому(конечно можно но хотелось бы увидеть конкретные предложения).
Буду очень признателен
volvo
Цитата(Костян @ 28.01.2006 23:36)
Вопрос: правильна ли эта прога(считает вроде все правильно)

Не совсем... Для данных:
x1 := 3; y1 := 1;
x2 := 6; y2 := 2;
x3 := 9; y3 := 3;
Получаем ответ "Данные точки не лежат на одной прямой", хотя чертеж показывает обратное...

Вообще-то эта задача решалась на форуме:
Трегольник, стороны которого...
(сама функция Includ приведена на несколько постов выше, чем тот, на который ссылка)

P.S. Переименуй тему, иначе она будет закрыта...
hardcase
А можно воспользоваться неравеноством треугольника: A(x1,y1) B(x2,y2) C(x3,y3)
|vectAB| + |vectBC| ~ |vectAC| or
|vectAC| + |vectAB| ~ |vectBC| or
|vectAC| + |vectBC| ~ |vectAB|
Код
function Line(const A,B,C: TPoint; Eps: double): boolean;
    fucntion Norm(const M,N: TPoint): double;
      var _x, _y: double;
      begin
        _x:=(M.X-N.X); _y:=(M.Y-N.Y);
        Result:=abs(_x * _x + _y * _y)
      end;
  var vectAB, vectBC, vectAC: double;
  begin
    vectAB:=Norm(A,B);
    vectAC:=Norm(A,C);
    vectBC:=Norm(B,C);
    if (abs(vectAB + vectBC - vectAC) < Eps) or
       (abs(vectAC + vectAB - vectBC) < Eps) or
       (abs(vectAC + vectBC - vectAB) < Eps)
    then Result:=true
    else Result:=false
  end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.