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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2007, 21:52   #1
necky
Пользователь
 
Аватар для necky
 
Регистрация: 11.08.2007
Сообщений: 69
По умолчанию ЗАДАЧА С ТРЕУГОЛЬНИКОМ НА ОСИ!!!

Услови:
Вводим координаты трех точек, т.е. A[x1,y1],B[x2,y2]C[x3,y4].
В резултате чего получаем виртуальный треугольник на оси xy.
Задача:
Определить, если начало координат (0,0) попадает в в треугольник.
//помогите с составлением алгоритма
Советовать можно лишь в деле, в котором сам собираешься участвовать.
necky вне форума Ответить с цитированием
Старый 27.09.2007, 09:12   #2
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Вот вариант Паскаля/Делфи:
Код:
const
dp=0.1; {погрешность}
var
ax,bx,cx,ay,by,cy,ox,oy:real;
abc,abo,bco,aco,s3:real;
function square(Xa,Ya,Xb,Yb,Xc,Yc:real):real;
begin
 square:=(Xa*(Yb-Yc)+Xb*(Yc-Ya)+Xc*(Ya-Yb))/2;
end;
begin
 
  {задаем координаты точек}
ax:=2; ay:=-3;
bx:=1; by:=3;
cx:=-1; cy:=-1;
ox:=0; oy:=0; {начало координат}
abc:=square(ax,ay,bx,by,cx,cy);{площадь основного треугольника}
  Writeln('abc = ',abs(square(ax,ay,bx,by,cx,cy)):5:2);
  Writeln('----------');
abo:=square(ax,ay,bx,by,ox,oy);
  Writeln('abo = ',abs(square(ax,ay,bx,by,ox,oy)):5:2);
bco:=square(bx,by,cx,cy,ox,oy);
  Writeln('bco = ',abs(square(bx,by,cx,cy,ox,oy)):5:2);
aco:=square(ax,ay,cx,cy,ox,oy);
  Writeln('aco = ',abs(square(ax,ay,cx,cy,ox,oy)):5:2);
  Writeln('----------');
s3:=abs(abo)+abs(bco)+abs(aco);
  Writeln('Площадь трех = ',s3:5:2);
if abs(s3-abc)<=dp then {сравниваем разницу с учетом погрешности}
 WriteLn('Начало координат принадлежит области треугольника')
  else Writeln('Начало координат НЕ принадлежит области треугольника');
  readln;
end.
Принцип основан на том, что из трех точек и начала координат составляем 3 треугольника ABO, BCO, ACO, находим их площади и сумму площадей сравниваем с площадью ABC. Плюс ко всему, учитываем необходимую пограшность.

Последний раз редактировалось Alex21; 27.09.2007 в 09:15.
Alex21 вне форума Ответить с цитированием
Старый 27.09.2007, 13:06   #3
necky
Пользователь
 
Аватар для necky
 
Регистрация: 11.08.2007
Сообщений: 69
По умолчанию

В си набирал тоже самое.. ..почуму-то не правильно выдаёт результат.

___________________________________ ___________________________
#include <stdio.h>
#include <math.h>
#include <conio.h>

void main()
{

clrscr();
float Ax, Ay, Bx, By, Cx, Cy;
printf("Vvedite koorinati to4ki A\n");
scanf("%f %f",&Ax,&Ay);

printf("Vvedite koorinati to4ki B\n");
scanf("%f %f",&Bx,&By);

printf("Vvedite koorinati to4ki C\n");
scanf("%f %f",&Cx,&Cy);

float Ox=0;
float Oy=0;
float abc,abo,aco,bco;

abc=(Ax*(By-Cy)+Bx*(Cy-Ay)+Cx*(Ay-By))/2;
abo=(Ax*(By-Oy)+Bx*(Oy-Ay)+Ox*(Ay-By))/2;
aco=(Ax*(Cy-Oy)+Cx*(Oy-Ay)+Ox*(Ay-Cy))/2;
bco=(Bx*(Cy-Oy)+Cx*(Oy-By)+Ox*(By-Cy))/2;

float s=abs(abo)+abs(bco)+abs(aco);
float pog=0.1;
if(abs(s-abc)<pog)
printf("Nacalo koordinat prinadleji oblasti treugolnika");

else

printf("Nacalo koordinat ne prinadleji oblasti treugolnika");

getch();
}
Советовать можно лишь в деле, в котором сам собираешься участвовать.

Последний раз редактировалось necky; 27.09.2007 в 13:24.
necky вне форума Ответить с цитированием
Старый 27.09.2007, 13:25   #4
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Покажи свои координаты, при которых неправильно считает.
Alex21 вне форума Ответить с цитированием
Старый 27.09.2007, 13:36   #5
necky
Пользователь
 
Аватар для necky
 
Регистрация: 11.08.2007
Сообщений: 69
По умолчанию

ax:=2; ay:=-3;
bx:=1; by:=3;
cx:=-1; cy:=-1;
______________
Даже с этими координатами результат не верен.
Советовать можно лишь в деле, в котором сам собираешься участвовать.

Последний раз редактировалось necky; 27.09.2007 в 13:42.
necky вне форума Ответить с цитированием
Старый 27.09.2007, 13:48   #6
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Попробуй меньше или равно поставить:

if(abs(s-abc)<=pog)
Alex21 вне форума Ответить с цитированием
Старый 27.09.2007, 14:09   #7
necky
Пользователь
 
Аватар для necky
 
Регистрация: 11.08.2007
Сообщений: 69
По умолчанию

Тоже самое!!! вот если поставить if(abs(s-abc)>=pog) работает правильно с предидущими координатамти. С координатами:
___________________________________ _
ax:=3; ay:=3;
bx:=-1; by:=1;
cx:=1; cy:=-3;
___________________________________ _
Выдаёт не верный результат. Что делать?
Советовать можно лишь в деле, в котором сам собираешься участвовать.
necky вне форума Ответить с цитированием
Старый 27.09.2007, 14:40   #8
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Вот мои значения(по координатам из вашего 7-го поста):
ABC = 10.00
----------
ABO = 3.00
BCO = 1.00
ACO = 6.00
Площадь трех = 10.00
--------------------
|10-10| <= 0.1

P.S.: ищите ошибку в своем коде. Почему не делаете с Функцией?
Alex21 вне форума Ответить с цитированием
Старый 27.09.2007, 16:33   #9
necky
Пользователь
 
Аватар для necky
 
Регистрация: 11.08.2007
Сообщений: 69
По умолчанию

Нашёл!!! Причина была в функции abs() - она не работает. Пришлось ее заменить на sqrt(pow(var,2)). Теперь работает как часы))). Alex21- выражаю вам огромную благодарность!!!
Советовать можно лишь в деле, в котором сам собираешься участвовать.
necky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача по ООП Lenivec** Фриланс 2 17.07.2008 15:17
Задача/C++ Stan Помощь студентам 2 24.01.2008 20:33
Задача по ТП. GE076 Помощь студентам 11 07.12.2007 19:29