Модераторы: volvo877, Snowy, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> программирование на paskal, решить задачу 
:(
    Опции темы
Irisha
  Дата 6.10.2004, 15:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пусть даны вещественные числа x1,x2,x3,y1,y2,y3.Принадлежит ли начало координат треугольнику с вершинами (x1,y1),(x2,y2),(x3,y3)?qstn.gif
Добавлено @ 15:30
решите задачу...
  Вверх
Guest
Дата 6.10.2004, 15:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Irisha
Эдак вас всех......брррррррр.
Математику учить надо, а не программирование
Векторы в школе проходили?
  Вверх
Garabar
Дата 6.10.2004, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 15.9.2004

Репутация: нет
Всего: 1



Ну например так, хоть эт внатуре и не программирование суть
Первое,
Для того что бы начало координат преналжело треугольнику необхадимо что бы одна или несколколько из его сторон пересекали ось обцисс и ординат хотябы один раз, соответсвенно для этого те надо проверять выполняица это условие или нет.
Второе,
Для проверки этого условия те нужно проверить x1*x2>0 еесли истинно то между этими вершинами обцисс не пересекает, для ординат анологично y1*y2>0.
третье,
Ну и потом перебираешь все варианты (их три кстати) до тех пор пока не либо они не конаться либо не выполница кождое из условий хотябы по одному разу....

PM MAIL   Вверх
Akina
Дата 6.10.2004, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Garabar
Господи, зачем так сложно.

Если начало координат лежит внутри треугольника, то начало координат и одна вершина лежат по одну сторону от прямой, определяемой остальными вершинами. Проверяется это элементарно - если в пределах от -пи до +пи синусы углов 120 и 123 имеют одинаковый знак для любого порядка нумерования точек, то внутри. По координатам посчитать синус - дело плевое...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Garabar
Дата 6.10.2004, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 15.9.2004

Репутация: нет
Всего: 1



Цитата
Господи, зачем так сложно.
Интересно рассчет синусов тратит больше системных ресурсов чем произведение....))))
PM MAIL   Вверх
Pakshin A. S.
Дата 6.10.2004, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



1) не paskal, a Pascal
2)
Код

if ((X1 * X2 <0) or (x2 * x3 < 0) or (X1 * x3 < 0)) and ((Y1*Y2 < 0) or (Y2 * Y3 < 0) or (Y3 * Y1 < 0))
then
 writeln('Да')
else
 writeln('Нет');

Может и ошибаюсь, но вроде так...
PM   Вверх
Pakshin A. S.
Дата 7.10.2004, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



ОШИБАЮСЬ!!!
Лохонулся я вчера: после трех пар математичесого анализа и одной пары линейной алгебры мозги не хотели работать
Вот примерчик:
Код

var
x,y:real;
x1,y1,x2,y2,x3,y3:real;
begin
readln(x1,y1,x2,y2,x3,y3);
x:=0;
y:=0;
if ((y < (y1 - y3)*(x - x3)/(x1-x3)+y3) and (y < (y2 - y1)*(x - x1)/(x2-x1)+y1) and (y >(y3 - y2)*(x - x2)/(x3-x2)+y2)) or
  ((y < (y2 - y1)*(x - x1)/(x2-x1)+y1) and (y < (y3 - y2)*(x - x2)/(x3-x2)+y2) and (y >(y1 - y3)*(x - x3)/(x1-x3)+y3)) or
  ((y < (y3 - y2)*(x - x2)/(x3-x2)+y2) and (y < (y1 - y3)*(x - x3)/(x1-x3)+y3) and (y >(y2 - y1)*(x - x1)/(x2-x1)+y1)) or
  ((y > (y1 - y3)*(x - x3)/(x1-x3)+y3) and (y < (y2 - y1)*(x - x1)/(x2-x1)+y1) and (y >(y3 - y2)*(x - x2)/(x3-x2)+y2)) or
  ((y > (y2 - y1)*(x - x1)/(x2-x1)+y1) and (y < (y3 - y2)*(x - x2)/(x3-x2)+y2) and (y >(y1 - y3)*(x - x3)/(x1-x3)+y3)) or
  ((y > (y3 - y2)*(x - x2)/(x3-x2)+y2) and (y < (y1 - y3)*(x - x3)/(x1-x3)+y3) and (y >(y2 - y1)*(x - x1)/(x2-x1)+y1)) or
  ((y < (y1 - y3)*(x - x3)/(x1-x3)+y3) and (y > (y2 - y1)*(x - x1)/(x2-x1)+y1) and (y >(y3 - y2)*(x - x2)/(x3-x2)+y2)) or
  ((y < (y2 - y1)*(x - x1)/(x2-x1)+y1) and (y > (y3 - y2)*(x - x2)/(x3-x2)+y2) and (y >(y1 - y3)*(x - x3)/(x1-x3)+y3)) or
  ((y < (y3 - y2)*(x - x2)/(x3-x2)+y2) and (y > (y1 - y3)*(x - x3)/(x1-x3)+y3) and (y >(y2 - y1)*(x - x1)/(x2-x1)+y1)) or
  ((y > (y1 - y3)*(x - x3)/(x1-x3)+y3) and (y > (y2 - y1)*(x - x1)/(x2-x1)+y1) and (y <(y3 - y2)*(x - x2)/(x3-x2)+y2)) or
  ((y > (y2 - y1)*(x - x1)/(x2-x1)+y1) and (y > (y3 - y2)*(x - x2)/(x3-x2)+y2) and (y <(y1 - y3)*(x - x3)/(x1-x3)+y3)) or
  ((y > (y3 - y2)*(x - x2)/(x3-x2)+y2) and (y > (y1 - y3)*(x - x3)/(x1-x3)+y3) and (y <(y2 - y1)*(x - x1)/(x2-x1)+y1))
  then
   writeln('Да')
  else
   writeln('Нет');
readln;
end.


PM   Вверх
Pakshin A. S.
Дата 7.10.2004, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Доработанный вариант:
Код

if
((y < (y1 - y2)*(x - x2)/(x1 - x2) + y2) and (y < (y3 - y1)*(x - x1)/(x3 - x1) + y1) and (y > (y2 - y3)*(x - x3)/(x2 - x3) + y3) and
 (x > (y - y2)*(x1 - x2)/(y1 - y2) + x2) and (x < (y - y1)*(x3 - x1)/(y3 - y1) + x1) and (x > (y - y3)*(x2 - x3)/(y2 - y3) + x3)) or

((y < (y2 - y3)*(x - x3)/(x2 - x3) + y3) and (y < (y1 - y2)*(x - x2)/(x1 - x2) + y2) and (y > (y3 - y1)*(x - x1)/(x3 - x1) + y1) and
 (x > (y - y3)*(x2 - x3)/(y2 - y3) + x3) and (x < (y - y2)*(x1 - x2)/(y1 - y2) + x2) and (x > (y - y1)*(x3 - x1)/(y3 - y1) + x1)) or

((y < (y3 - y1)*(x - x1)/(x3 - x1) + y1) and (y < (y2 - y3)*(x - x3)/(x2 - x3) + y3) and (y > (y1 - y2)*(x - x2)/(x1 - x2) + y2) and
 (x > (y - y1)*(x3 - x1)/(y3 - y1) + x1) and (x < (y - y3)*(x2 - x3)/(y2 - y3) + x3) and (x > (y - y2)*(x1 - x2)/(y1 - y2) + x2)) or

((y < (y1 - y2)*(x - x2)/(x1 - x2) + y2) and (y > (y3 - y1)*(x - x1)/(x3 - x1) + y1) and (y > (y2 - y3)*(x - x3)/(x2 - x3) + y3) and
 (x > (y - y2)*(x1 - x2)/(y1 - y2) + x2) and (x < (y - y1)*(x3 - x1)/(y3 - y1) + x1) and (x > (y - y3)*(x2 - x3)/(y2 - y3) + x3)) or

((y < (y2 - y3)*(x - x3)/(x2 - x3) + y3) and (y > (y1 - y2)*(x - x2)/(x1 - x2) + y2) and (y > (y3 - y1)*(x - x1)/(x3 - x1) + y1) and
 (x > (y - y3)*(x2 - x3)/(y2 - y3) + x3) and (x < (y - y2)*(x1 - x2)/(y1 - y2) + x2) and (x > (y - y1)*(x3 - x1)/(y3 - y1) + x1)) or

((y < (y3 - y1)*(x - x1)/(x3 - x1) + y1) and (y > (y2 - y3)*(x - x3)/(x2 - x3) + y3) and (y > (y1 - y2)*(x - x2)/(x1 - x2) + y2) and
 (x > (y - y1)*(x3 - x1)/(y3 - y1) + x1) and (x < (y - y3)*(x2 - x3)/(y2 - y3) + x3) and (x > (y - y2)*(x1 - x2)/(y1 - y2) + x2)) or

((y < (y1 - y2)*(x - x2)/(x1 - x2) + y2) and (y < (y3 - y1)*(x - x1)/(x3 - x1) + y1) and (y > (y2 - y3)*(x - x3)/(x2 - x3) + y3) and
 (x > (y - y2)*(x1 - x2)/(y1 - y2) + x2) and (x < (y - y1)*(x3 - x1)/(y3 - y1) + x1) and (x < (y - y3)*(x2 - x3)/(y2 - y3) + x3)) or

((y < (y2 - y3)*(x - x3)/(x2 - x3) + y3) and (y < (y1 - y2)*(x - x2)/(x1 - x2) + y2) and (y > (y3 - y1)*(x - x1)/(x3 - x1) + y1) and
 (x > (y - y3)*(x2 - x3)/(y2 - y3) + x3) and (x < (y - y2)*(x1 - x2)/(y1 - y2) + x2) and (x < (y - y1)*(x3 - x1)/(y3 - y1) + x1)) or

((y < (y3 - y1)*(x - x1)/(x3 - x1) + y1) and (y < (y2 - y3)*(x - x3)/(x2 - x3) + y3) and (y > (y1 - y2)*(x - x2)/(x1 - x2) + y2) and
 (x > (y - y1)*(x3 - x1)/(y3 - y1) + x1) and (x < (y - y3)*(x2 - x3)/(y2 - y3) + x3) and (x < (y - y2)*(x1 - x2)/(y1 - y2) + x2))
{Можно ещё покрутить треугольник в плоскости, но нет времени...}
 then
  writeln('Yes')
 else
  writeln('No');

PM   Вверх
Akina
Дата 7.10.2004, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Pakshin A. S.
сплошные деления на нуль при совпадении x или y у двух точек...

Garabar
Цитата
рассчет синусов тратит больше системных ресурсов чем произведение

во-первых, сисинус считается исключительно вычитаниями и делениями. Во-вторых, достаточно получить его знак.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Garabar
Дата 7.10.2004, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 15.9.2004

Репутация: нет
Всего: 1



Akina
Код
во-первых, сисинус считается исключительно вычитаниями и делениями. Во-вторых, достаточно получить его знак.

Хе) ну что бы получить его знак его нужно пасчитать....
А во вторых что бы пасчитать синус нужно я думаю больше раза поделить(или умножить))))

PM MAIL   Вверх
p0s0l
Дата 7.10.2004, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Pakshin A. S., как этим пользоваться ? У меня все время "Да"... + Иногда вылетает Floating Point - ошибка... sad.gif

Вот мой вариант:
Если начало координат принадлежит треугольнику (внутри треугольника, или на сторонах), то треугольник должен пересекать обе оси Ox и Oy с двух сторон (на положительной и отрицательной частях)...
Код
function ChkTreug (x1, y1, x2, y2, x3, y3 : real) : boolean;
var Ints : array [0..3] of boolean;
 procedure Intersect (x1, y1, x2, y2 : real);
 begin
   if (x2*x1 < 0) then Ints[0 + Byte((y1 - x1/(x2-x1)*(y2-y1)) > 0)] := True;
    if (y2*y1 < 0) then Ints[2 + Byte((x1 - y1/(y2-y1)*(x2-x1)) > 0)] := True;
 end;

begin
 FillChar (Ints, SizeOf(Ints), 0);
 Intersect (x1, y1, x2, y2);
 Intersect (x2, y2, x3, y3);
 Intersect (x3, y3, x1, y1);
 Result := Ints[0] and Ints[1] and Ints[2] and Ints[3];
end;



--------------------
С уважением, г-н Посол.
PM   Вверх
Pakshin A. S.
Дата 7.10.2004, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Я пытаюсь рассмотреть позицию точки по отношению к прямым через уравнение прямой, проходящей через две точки
y-y1=(y2-y1)(x-x1)/(x2-x1)...

Да видимо мысль не туда пошла... sad.gif
PM   Вверх
ДЫМ
Дата 8.10.2004, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 6.1.2004

Репутация: нет
Всего: 8



В RXLibrary есть функция (сечас не помню точно как называется), вот она
возвращает True, если точка лежит внутри многоугольника.
PM MAIL WWW   Вверх
EKoshelev
Дата 8.10.2004, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



ДЫМ , Да? А я помнится сам её корябал... Заманался, честно говоря.



--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
maxim1000
Дата 8.10.2004, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



Цитата
Если начало координат лежит внутри треугольника, то начало координат и одна вершина лежат по одну сторону от прямой, определяемой остальными вершинами. Проверяется это элементарно - если в пределах от -пи до +пи синусы углов 120 и 123 имеют одинаковый знак для любого порядка нумерования точек, то внутри. По координатам посчитать синус - дело плевое...

небольшое уточнение: необходимо проверять не для одной из вершин, а для всех (хотя, может, я неправильно прочитал, и именно это и имелось в виду)

небольшая модификация:
1. точка лежит внутри треугольника тогда и только тогда, когда при обходе его она всегда лежит с одной стороны (это верно вообще для всех выпуклых полигонов)
2. для того, чтобы определить, с какой стороны лежит точка от прямой, достаточно определить знак угла (если считать его между -180 и +180) между направляющим вектором прямой и вектором от одной из точек прямой к исследуемой точке
3. для определения знака угла в интервале (-180, +180) достаточно определить знак синуса
4. как было справедливо замечено для подсчета синуса между двумя векторами на плоскости достаточно нескольких арифметических операций: просто добавляем к каждому вектору третью нулевую координату z и считаем их векторное произведение

и так алгоритм такой:
Код
result:=(ABxAO,BCxBO,CAxCO имеют одинаковый знак);

под обозначением ABxAO понимается следующее:
a=B1-A1
b=B2-A2
c=O1-A1
d=O2-A2
ABxAO=a*d-b*c


--------------------
qqq
PM WWW   Вверх
maxim1000
Дата 8.10.2004, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



Код
function EqualSigns(x,y,z:real):boolean;
begin
 result:=false;
 if(x>0)and(y>0)and(z>0)then
   result:=true;
 if(x<0)and(y<0)and(z<0)then
   result:=true;
end;
function VectorMultiply(x1,y1,x2,y2:real):real;
begin
 result:=x1*y2-y1*x2;
end;
function IsOriginInsideTriangle(a1,a2,b1,b2,c1,c2:real):boolean;
var
 x,y,z:real;
begin
 x:=VectorMultiply(b1-a1,b2-a2,0-a1,0-a2);
 y:=VectorMultiply(c1-b1,c2-b2,0-b1,0-b2);
 z:=VectorMultiply(a1-c1,a2-c2,0-c1,0-c2);
 result:=EqualSigns(x,y,z);
end;

честно говоря, не проверял (нету у меня на машине Delphi)


--------------------
qqq
PM WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0963 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.