Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2009, 23:51   #1
Hilda
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 16
По умолчанию Процедуры

помогите решить пожалуйста:
Даны координаты трех вершин треугольника ABC и даны координаты четвертой вершины D. Определить, является ли эта точка внутренней точкой треугольника.
Hilda вне форума Ответить с цитированием
Старый 19.12.2009, 00:15   #2
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость

дял начала начерти на листке как все это ьудет выглядеть, тойсть если я правильно понимаю, тебе ножно определить границы X Y, если координаты точки Д входят в ети храници, то точка лежит в треугольнике, и наоборот!
Lemo вне форума Ответить с цитированием
Старый 19.12.2009, 00:40   #3
Hilda
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 16
По умолчанию

ну да!
но я не знаю как все это дело оформить((...
Hilda вне форума Ответить с цитированием
Старый 19.12.2009, 01:08   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Как вариант вычислить площадь треугольников ABD ACD BCD. И если их сумма > площади ABC, то точка вне треугольника.
Площади вычислять по формуле Герона (через длины сторон)
eoln вне форума Ответить с цитированием
Старый 21.12.2009, 23:56   #5
Hilda
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 16
По умолчанию

подскажите где ошибка????
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type func=function (x,y:real):real;
   var q,w,p,ax,bx,cx,dx,ay,by,cy,dy:real;
   per1,per2,per3,per4,z:real;
    procedure Zapoln;
begin
write('Koordinaty A ');
readln(ax, ay);
write('Koordinaty B ');
readln(bx, by);
write('Koordinaty C ');
readln(cx, cy);
write('Koordinaty D ');
readln(dx, dy);
end;
         procedure Ploshad(n:integer);
  var d1,d2,d3,per:real;
begin
  d1:=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
  d2:=sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by));
  d3:=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy));
  per:=(d1+d2+d3)/2;
  per:=sqrt(per*(per-d1)*(per-d2)*(per-d3));
  if n=1 then per1:=per else
  if n=2 then per2:=per else
  if n=3 then per3:=per else
  if n=4 then per4:=per;
end;
 procedure Zamena(x:integer);
begin
if x=1 then
   begin
   q:=cx;
   w:=cy;
   cx:=dx;
   cy:=dy;
   end else
if x=2 then
   begin
   q:=ax;
   w:=ay;
   ax:=dx;
   ay:=dy;
   end else
if x=3 then
   begin
   q:=bx;
   w:=by;
   bx:=dx;
   by:=dy;
   end;
end;
 procedure Sravn;
begin
  if per1 < p  then
  Writeln('Yes') else
  Writeln('No'); end;
function Okrug(z:real):real;
  var a:integer;
begin
  z:=z/10*1000;    
  a:=round(z);     
  z:=a/100;    
  Okrug:=z;
end;

 begin
Zapoln; 
Ploshad(1); 
Zamena(1); 
Ploshad(2); 
cx:=q; 
cy:=w; 
p:=per2; 
Zamena(2); 
Ploshad(3); 
p:=p+per3; 
ax:=q; 
ay:=w;
Zamena(3); 
Ploshad(4);
  p:=p+per4; 
p:=Okrug(p); 
p:=p+per4; 
Sravn; 
readln; 



  { TODO -oUser -cConsole Main : Insert code here }
end.
Hilda вне форума Ответить с цитированием
Старый 22.12.2009, 13:42   #6
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Вот этот способ. Но следует учесть, что при взятии корня от числа возникает погрешность. Можно пойти 3-мя путями:
1) учитывать погрешность (как в коде)
2) избавиться от корней путём применения формул (долго, но возможно)
3) выбрать другой метод (например, основанный на полуплоскостях)
Код:
function ploshad(x1, y1, x2, y2, x3, y3: integer): real;
var
  p, a, b, c: real;
begin
  a := sqrt(sqr(x1-x2)+sqr(y1-y2));
  b := sqrt(sqr(x1-x3)+sqr(y1-y3));
  c := sqrt(sqr(x3-x2)+sqr(y3-y2));
  p := (a + b + c) / 2;
  result := sqrt(p*(p-a)*(p-b)*(p-c))
end;

var
  ax, ay, bx, by, cx, cy, dx, dy: integer;
begin
  write('Koordinaty A ');
  readln(ax, ay);
  write('Koordinaty B ');
  readln(bx, by);
  write('Koordinaty C ');
  readln(cx, cy);
  write('Koordinaty D ');
  readln(dx, dy);
  if abs(ploshad(ax, ay, bx, by, dx, dy) +
         ploshad(ax, ay, dx, dy, cx, cy) +
         ploshad(dx, dy, bx, by, cx, cy) -
         ploshad(ax, ay, bx, by, cx, cy)) > 0.0001 then write('No') else write('Yes');
  readln
end.
eoln вне форума Ответить с цитированием
Старый 22.12.2009, 17:54   #7
Hilda
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 16
По умолчанию

спасибо!все получилось)

а можешь объяснить вот это???
abs(ploshad(ax, ay, bx, by, dx, dy) +
ploshad(ax, ay, dx, dy, cx, cy) +
ploshad(dx, dy, bx, by, cx, cy) -
ploshad(ax, ay, bx, by, cx, cy))> 0.0001
Hilda вне форума Ответить с цитированием
Старый 22.12.2009, 23:40   #8
Hilda
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Hilda Посмотреть сообщение
спасибо!все получилось)

а можешь объяснить вот это???
abs(ploshad(ax, ay, bx, by, dx, dy) +
ploshad(ax, ay, dx, dy, cx, cy) +
ploshad(dx, dy, bx, by, cx, cy) -
ploshad(ax, ay, bx, by, cx, cy))> 0.0001
ммм...я тупак!
поняла уже)
Hilda вне форума Ответить с цитированием
Старый 23.12.2009, 00:18   #9
Анатоль
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 74
По умолчанию

На самом деле у этой задачи есть 3 популярных способа решения.
1 уже назвали.
2 рассмаривать 3 уравнения прямой для врешин и точки.
3 использовать векторное и псевдоскалярное произведения.
2,3 метод работают без погрешностей.
Анатоль вне форума Ответить с цитированием
Старый 23.12.2009, 11:22   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Анатоль, а вот любопытно...
Цитата:
Сообщение от Анатоль
На самом деле у этой задачи есть 3 популярных способа решения.
2 рассмаривать 3 уравнения прямой для врешин и точки.
3 использовать векторное и псевдоскалярное произведения.
про 2-й и 3-й способ чуть поподробнее можно?..
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедуры Юля787 Помощь студентам 4 13.12.2009 15:06
процедуры Maxxx 83 Помощь студентам 3 02.10.2009 19:16
Процедуры. Olalya da Silva Паскаль, Turbo Pascal, PascalABC.NET 0 07.05.2009 20:18
Процедуры Sergeo_89 Паскаль, Turbo Pascal, PascalABC.NET 2 28.01.2009 19:05
Запуск процедуры из процедуры с дополнением 1sal1 Общие вопросы Delphi 3 06.10.2008 21:54