Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Programer101
0 / 0 / 0
Регистрация: 04.12.2012
Сообщений: 48
#1

Пренадлежит ли точка треугольнику - C++

25.12.2013, 08:04. Просмотров 897. Ответов 25
Метки нет (Все метки)

Треугольник задан координатами вершин. Определить, принадлежит ли точка M(x,y) треугольнику.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2013, 08:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пренадлежит ли точка треугольнику (C++):

Определить принадлежит ли точка треугольнику - C++
Определить,принадлежит ли точка M(X,Y) треугольнику,образованном осями Ох и Оу и прямой,которая пересекает эти оси в точках Х и Y. Буду...

Определить, принадлежит ли точка треугольнику - C++
Треугольник задан координатами вершин. Определить, принадлежит ли точка M(x,y) треугольнику. Добавлено через 2 часа 15 минут очень...

Определить принадлежит ли точка треугольнику - C++
Здравствуйте! Не могли бы вы помочь решить мне задачу? Всем буду очень благодарен В декартовой системе координат на плоскости заданы...

Определить, принадлежит ли данная точка треугольнику - C++
Определить, принадлежит ли данная точка треугольнику, образованному осями координат и прямой a_1 x + b_1 y + c_1 = 0. Сделать...

Определить принадлежит ли точка с координатами (x, y) треугольнику - C++
программа должна определять принадлежит ли точка с координатами (x, y) треугольнику, который задан координатами его вершин.

Треугольник задан вершинами (x1,y1), (x2,y2), (x3,y3). Принадлежит ли заданная точка (x,y) указанному треугольнику. - C++
Добрый день! Помогите пожалуйста разобраться с прогой... Треугольник задан вершинами (x1,y1), (x2,y2), (x3,y3). Принадлежит ли...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2013, 11:39 #16
Цитата Сообщение от Ilot Посмотреть сообщение
Так как в первом методе проверяется отношение двух вещественных чисел
где Вы там увидели отношение?
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
25.12.2013, 11:49 #17
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Тут Вы не правы. Если точки образующие треугольник лежат на одной прямой то это не треугольник. Читаем внимательно:
Зависит о постановки задачи и подхода к вопросу. Например в теории интеграла Кристоффеля -Шварца даже отрезки рассматриваются как двухугольники, но даже дело не в это. Первый метод более универсален и требует меньше затрат на вычисления.
Вы не подумайте, что я столь категоричен в своем мнении. Я не настолько глуп что бы на пустом месте перечить форумитам с многотысячной репутацией. Я высказал свои доводы. Что-то мне разъяснили (спасибо castaway), однако некоторые вопросы все равно остались открытыми. Опять же мое мнение.
Цитата Сообщение от valeriikozlov Посмотреть сообщение
где Вы там увидели отношение?
Имелось ввиду больше/меньше по отношению друг к другу. Думал это будет понятно...
0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2013, 12:12 #18
Цитата Сообщение от Ilot Посмотреть сообщение
Первый метод более универсален и требует меньше затрат на вычисления.
Давайте лучше посчитаем, чем голословно утверждать )
Вторым методом получается:
20 операций '-', 8 операции '*', 3 операции '+'.
Есть еще 4 операции деления на 2, но их можно опустить, сделать код без них.
И в конце одна операция сравнения.
А теперь посчитайте сколько первым методом каких операций будет проводится )

Добавлено через 57 секунд
Цитата Сообщение от Ilot Посмотреть сообщение
Имелось ввиду больше/меньше по отношению друг к другу.
больше 'делить' на меньше ?
что-то я такого не увидел )
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
25.12.2013, 12:38 #19
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Давайте лучше посчитаем, чем голословно утверждать )
Вторым методом получается:
20 операций '-', 8 операции '*', 3 операции '+'.
Есть еще 4 операции деления на 2, но их можно опустить, сделать код без них.
И в конце одна операция сравнения.
А теперь посчитайте сколько первым методом каких операций будет проводится )

Добавлено через 57 секунд

больше 'делить' на меньше ?
что-то я такого не увидел )
Просто нет слов. Может стоит иногда вместо доказательства своей правоты обратить внимание на суть того, что вам стараются донести, а выяснение отношений оставить школьникам?
p.S. В наилучшем 15. В наихудшем 39. Однако учитывая относительную редкость уникальных случаев амортизационное число операций 15.
0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2013, 12:46 #20
тяжко: каких операций в наилучших случаях 15?
Цитата Сообщение от Ilot Посмотреть сообщение
Может стоит иногда вместо доказательства своей правоты обратить внимание на суть того, что вам стараются донести,
Я знаю что вы мне пытаетесь донести.
Вам встречное предложение:
Может стоит иногда вместо доказательства своей правоты обратить внимание на суть того, что вам стараются донести.
Именно вы утверждаете что первый метод лучше второго (а не я что второй метод лучше первого).
Я не знаю почему вы так решили. Но ваши доказательства я опровергаю логически, а не голословно, как вы.
Итак: каких операций в наилучших случаях 15?
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
25.12.2013, 13:03 #21
Ну уж если вам действительно нечем заняться давайте пободоемся.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int Point::classify(Point &p0, Point &pl)
{
  Point p2 = *this;
  Point a = p1 - pO;//+1
  Point b = p2 - pO;//+1
  double sa = a. x * b.y - b.x * a.y;//+3
  if (sa > 0.0)
    return LEFT;//здесь большой шанс выйти из функции.
  if (sa < 0.0)
    return RIGHT;//здесь большой шанс выйти из функции.
  if ((a.x * b.x < 0.0) || (a.y * b.y < 0.0))
    return BEHIND;
  if (a.length() < b.length())
    return BEYOND;
  if (pO == p2)
    return ORIGIN;
  if (p1 == p2)
    return DESTINATION;
  return BETWEEN;
}

И таких вызовов три.
Повторюсь еще раз мне не хочется вам, что либо доказывать...
Вам метод не универсален, так как не дает правильного ответа если точки лежат на одной прямой. Придется лепить костыли. Это раз. Все вычисления в ваше алгоритме придется выполнять полностью в отличае от второго метода.
0
SatanaXIII
25.12.2013, 13:09
  #22

Не по теме:

Цитата Сообщение от valeriikozlov Посмотреть сообщение
Если точки образующие треугольник лежат на одной прямой то это не треугольник
Кстати по моему называется вырожденный треугольник.

0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2013, 13:44 #23
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Кстати по моему называется вырожденный треугольник.
Цитата Сообщение от Ilot Посмотреть сообщение
Point a = p1 - pO;//+1
тут неправильно. смотрим здесь:
C++
1
2
3
4
Point Point::operator- (Point &p)
{
  return Point (x - р.х, у - p. у);
}
так что не +1, а +2
Но давайте попорядку. Начнем с этого:
Цитата Сообщение от Ilot Посмотреть сообщение
Вам метод не универсален, так как не дает правильного ответа если точки лежат на одной прямой.
(кстати это не мой метод)
Здесь два случая: точка M не лежит на этой прямой - в этом случае будет правильный ответ. В случае если точка М лежит на этой прямой, то будет ответ неправильный. Но это не недостаток. В первом алгоритме отдельно расчитывается для трех отрезков: принадлежит ли точка М этим отрезкам или нет. Во втором варианте можно даже проще сделать эту проверку: например так - если площадь треугольника равна 0, и сумма площадей трех треугольников равна 0, то берем самый длинный отрезок и проверяем принадлежность точки М только ему, а не всем трем.
Цитата Сообщение от Ilot Посмотреть сообщение
Придется лепить костыли.
придется лепить один костыль, в отличие от трех таких же в первом методе.

Цитата Сообщение от Ilot Посмотреть сообщение
Все вычисления в ваше алгоритме придется выполнять полностью в отличае от второго метода.
это не показатель. Я могу например сделать так: расчитываю площадь основного треугольника S (7 операций), расчитываю площадь первого треугольника s1 (еще 7 операций). Сравниваю их сразу и если s1 уже больше S сразу выдаю ответ - не принадлежит. И могу утверждать что второй способ лучше первого , т.к. у него в лучшем случае всего 14 операций и одно сравнение.

Добавлено через 8 минут
кстати про этот случай:
Цитата Сообщение от Ilot Посмотреть сообщение
если точки лежат на одной прямой.
именно в этом случае в "суперском" первом методе происходит проверка на равенство вещественных чисел. А это значит что именно первый метод:
Цитата Сообщение от Ilot Посмотреть сообщение
может стать тот бомбой замедленного действия которая однажды опрокинет вашу программу и вам придется долго и нудно искать причину такого поведения.
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
25.12.2013, 14:04 #24
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Здесь два случая: точка M не лежит на этой прямой - в этом случае будет правильный ответ. В случае если точка М лежит на этой прямой, то будет ответ неправильный. Но это не недостаток. В первом алгоритме отдельно расчитывается для трех отрезков: принадлежит ли точка М этим отрезкам или нет. Во втором варианте можно даже проще сделать эту проверку: например так - если площадь треугольника равна 0, и сумма площадей трех треугольников равна 0, то берем самый длинный отрезок и проверяем принадлежность точки М только ему, а не всем трем.
Костыль.
именно в этом случае в "суперском" первом методе происходит проверка на равенство вещественных чисел. А это значит что именно первый метод:
Ошибаетесь. Так как сравниваются два исходных числа, а не результат их преобразования. Как говорил Кузьма Прутков: смотри в корень!
это не показатель. Я могу например сделать так: расчитываю площадь основного треугольника S (7 операций), расчитываю площадь первого треугольника s1 (еще 7 операций). Сравниваю их сразу и если s1 уже больше S сразу выдаю ответ - не принадлежит. И могу утверждать что второй способ лучше первого , т.к. у него в лучшем случае всего 14 операций и одно сравнение.
Я же написал арматизационное число. Вероятность того, что точка попадет на прямые задающие треугольник крайне мала. В отличает от вероятности, что новый треугольник, образованный исследуемой точкой, будет больше исходного.
0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2013, 14:20 #25
Цитата Сообщение от Ilot Посмотреть сообщение
Костыль.
а в первом варианте этих же костылей уже три )

Не по теме:

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

0
sergei60
47 / 28 / 4
Регистрация: 10.06.2012
Сообщений: 372
26.12.2013, 18:57 #26
Я находил попадает ли точка с одной стороны или с другой от отрезка так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  #include <iostream>
    #include <cmath>
  using namespace std;
     
    int main () {
    double x1,x2,y1,y2,;
    cout<<"введем координаты отрезка ";
    cin>>x1>>x2>>y1>>y2;
cout<<"введем координаты проверяемой точки";
     cin>>x>>y;
  if(y>2*(y1-y2)*(x-x1)/(x2-x1)+y2)
   cout<<"c одной стороны";
   else
   cout <<"c другой стороны";
return 0;
    }
Можно так же решить для трех отрезков ,которые образуют треугольник. Может этот способ имеет недостатки ,но все же.. может как то поможет в решении.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2013, 18:57
Привет! Вот еще темы с ответами:

Дана точка A(x; y) на координатной плоскости. Определить, принадлежит ли она треугольнику с вершинами в точках . - C++
Дана точка A(x; y) на координатной плоскости. Определить, принадлежит ли она треугольнику с вершинами в точках .

как в c++ проверить пренадлежит ли переменная определенному типу? - C++
Например, что бы если пользователь ввел не число а символ, то в консоль выводилось сообщение об ошибке.

что происходит со старым конструктором когда я создаю новый, пренадлежащий производному типу? (первый конструктор пренадлежит базовому типу) - C++
1) что происходит со старым конструктором когда я создаю новый, пренадлежащий производному классу? (первый конструктор пренадлежит базовому...

Определить принадлежность точки треугольнику - C++
begin writeln ('Введіть x1,y1,x2,y2,x3,y3'); readln (x1,y1,x2,y2,x3,y3); a:=sqrt(sqr(x2-x1)+sqr(y1-y2)); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.12.2013, 18:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru