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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2008, 19:34   #1
SARA
 
Регистрация: 19.06.2008
Сообщений: 5
Вопрос Выпуклый четырёхугольник(как проверить) Pascal

Привет, всем. Кто знает, как проверить является ли четырёх угольник выпуклым, если даны координаты всёх вершин

Последний раз редактировалось SARA; 19.06.2008 в 19:40.
SARA вне форума Ответить с цитированием
Старый 19.06.2008, 21:35   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

из wikipedia:
Цитата:
Сообщение от Википедия
В планиметрии выпуклым многоугольником называются многоугольник, обладающий тем свойством, что все его точки лежат по одну сторону от любой прямой, проходящей через две его соседние вершины. В частности, любой треугольник является выпуклым.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.06.2008, 22:02   #3
SARA
 
Регистрация: 19.06.2008
Сообщений: 5
Восклицание

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
из wikipedia:
Я спрашивала, определение выпуклого четырёхугольника.
SARA вне форума Ответить с цитированием
Старый 19.06.2008, 22:19   #4
SARA
 
Регистрация: 19.06.2008
Сообщений: 5
По умолчанию

и как это определить а паскале
SARA вне форума Ответить с цитированием
Старый 19.06.2008, 22:49   #5
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

В определение которое привели написанно как определить выпуклый ли он или нет.
Четырёхугольник один из видов многоугольника.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 19.06.2008, 23:18   #6
SARA
 
Регистрация: 19.06.2008
Сообщений: 5
По умолчанию

Так а как в паскале это определить?
SARA вне форума Ответить с цитированием
Старый 20.06.2008, 21:56   #7
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Предоставляю мой вариант решения. Я исходил из следующих соображений: внутренний угол, образованный любыми двумя соседними гранями не должен быть больше 180 градусов. Отсюда алгоритм:
1) Ввод координат вершин, причем последовательно против часовой стрелки.
2) Проверяем угол между первой гранью и второй (также против часовой стрелки):
- находим угол a1 между первой гранью и осью Ox;
- находим угол a2 между второй гранью и осью Ox;
- если условие (a2-a1<0)and(a2-a1>-PI)or(a2-a1>PI) выполнится, то значит многоугольник вогнутый.
3) Аналогично п.2 проверяем углы между 2-й и 3-й, 3-й и 4-й и т.д. гранями.
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 20.06.2008, 22:00   #8
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Исходник на паскале:
Код:
uses crt;

function angle(x1,y1,x2,y2:integer):real;
var
  dx,dy:integer;
  r:real;
begin
  dx:=x2-x1;
  dy:=y2-y1;
  r:=sqrt(dx*dx+dy*dy);
  if dy>=0 then
  begin
    if dx=0 then angle:=pi/2;
    if dx>0 then angle:=abs(arctan(dy/dx));
    if dx<0 then angle:=pi-abs(arctan(dy/dx));
  end;
  if dy<0 then
  begin
    if dx=0 then angle:=3*pi/2;
    if dx>0 then angle:=2*pi-abs(arctan(dy/dx));
    if dx<0 then angle:=pi+abs(arctan(dy/dx));
  end;
end;

var
  i,i1,k:integer;
  a1,a2:real;
  key:boolean;
begin
  clrscr;

  write('kol='); readln(k);
  for i:=1 to k do
  begin
    write('Введите координаты x и y vershiny v[',i,']:');
    readln(v[i,1],v[i,2]);
  end;
  key:=true;
  for i:=2 to k do
  begin
    if i=k then i1:=1 else i1:=i+1;
    a1:=angle(v[i-1,1],v[i-1,2],v[i,1],v[i,2]);
    a2:=angle(v[i,1],v[i,2],v[i1,1],v[i1,2]);
    if (((a2-a1)<0)and((a2-a1)>-pi)) or ((a2-a1)>pi) then
    begin
      key:=false;
      break;
    end;
  end;
  a1:=angle(v[k,1],v[k,2],v[1,1],v[1,2]);
  a2:=angle(v[1,1],v[1,2],v[2,1],v[2,2]);
  if (((a2-a1)<0)and((a2-a1)>-pi)) or ((a2-a1)>pi) then key:=false;
  if key=true then writeln('Выпуклый') else writeln('Вогнутый');
  readkey;
end.
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 20.06.2008, 22:01   #9
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Написано криво (спешил), но вроде работает
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 20.06.2008, 22:40   #10
SARA
 
Регистрация: 19.06.2008
Сообщений: 5
По умолчанию

Спасибо, помог!
SARA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить тип переменной satana Общие вопросы Delphi 10 20.11.2010 21:43
Как проверить строку? nikleb PHP 6 07.07.2008 22:04
выпуклый стиль ToolButton andrey4623 Общие вопросы Delphi 2 04.03.2008 19:19
Как проверить существование потока? John_chek Общие вопросы Delphi 3 17.01.2008 15:16