Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
MariaFitzgerald
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 106
Завершенные тесты: 1
1

Определите, лежит ли заданная точка внутри заданного треугольника

21.07.2017, 19:59. Просмотров 951. Ответов 5
Метки нет (Все метки)

У меня проходит 95%. Что не так?

Входные данные
Первые 3 строки содержат координаты вершин треугольника (в каждой строке по 2 целых числа, разделенных пробелом). Четвертая строка содержит координаты точки, в таком же формате. Все числа – целые, по модулю не превосходящие 10000. Гарантируется, что вершины треугольника не лежат на одной прямой.
Выходные данные
Единственная строка содержит слово «In», если точка лежит внутри треугольника, «On», если точка лежит на границе треугольника (вершине либо стороне), или «Out», если она лежит вне него.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
#include<math.h>
int main()
{    
int x1,y1,x2,y2,x3,y3,x0,y0,a,b,c;
scanf("%d %d %d %d %d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3,&x0,&y0);
a=(x1 - x0) * (y2 - y1) - (x2 - x1) * (y1 - y0);
b=(x2 - x0) * (y3 - y2) - (x3 - x2) * (y2 - y0);
c=(x3 - x0) * (y1 - y3) - (x1 - x3) * (y3 - y0);
if((a > 0 && b > 0 && c > 0) || (a < 0 && b < 0 && c < 0)) printf("In");
else if((a == 0 || b == 0 || c == 0)) printf("On");
else printf("Out");
return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2017, 19:59
Ответы с готовыми решениями:

Определить, лежит ли заданная точка на одной из сторон треугольника, заданного координатами своих вершин
Определить, лежит ли заданная точка на одной из сторон треугольника, заданного...

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

Лежит ли точка М(xm;ym) внутри треугольника, заданного координатами своих вершин
Лежит ли точка М(xm;ym) внутри треугольника, заданного координатами своих...

Определить лежит ли точка внутри треугольника
Треугольник и точка (№102) В декартовой системе координат на плоскости заданы...

Определить лежит ли точка внутри треугольника
Вершины треугольника имеют координаты (0, 0), (0, a), (b, 0). Определить, лежит...

5
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4764 / 2423 / 677
Регистрация: 18.10.2014
Сообщений: 4,143
21.07.2017, 21:19 2
Лучший ответ Сообщение было отмечено MariaFitzgerald как решение

Решение

Цитата Сообщение от MariaFitzgerald Посмотреть сообщение
Что не так?
В общем идея правильная, но ситуации, когда точка лежит точно на стороне у вас обработаны неправильно.

Условие a == 0 на самом деле означает, что точка лежит на прямой, содержащей соответствующую сторону A. Точка может лежать на прямой, содержащей сторону A, далеко за пределами треугольника. При этом a будет равно 0. Поэтому ваше

C++
1
if((a == 0 || b == 0 || c == 0)) printf("On");
это неправильно. Правильнее будет

C++
1
2
3
if ((a > 0 && b > 0 && c > 0) || (a < 0 && b < 0 && c < 0)) printf("In");
else if ((a >= 0 && b >= 0 && c >= 0) || (a <= 0 && b <= 0 && c <= 0)) printf("On");
else printf("Out");
1
palva
3100 / 2232 / 450
Регистрация: 08.06.2007
Сообщений: 8,132
Записей в блоге: 4
21.07.2017, 21:31 3
(Вы считаете ориентированные площади треугольников 102 203 301. Лучше считать площади треугольников 132 203 301, чтобы точка 3 принадлежала всем треугольникам.) Здесь не читать.
Тогда: если все площади неположительны или все неотрицательны, то точка внутри или на границе. Если вдобавок одна из площадей нулевая, то точка лежит на стороне, две площади нулевые - точка совпадает с вершиной.

Добавлено через 5 минут
Извините, был неправ. Увидел в вашем коде, что четвертую точку вы вводите в начало массива.
Вы правильно вычисляете площади, а дальше действуйте по описанной мной логике.
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4764 / 2423 / 677
Регистрация: 18.10.2014
Сообщений: 4,143
21.07.2017, 21:33 4
Цитата Сообщение от palva Посмотреть сообщение
Вы считаете ориентированные площади треугольников 102 203 301. Лучше считать площади треугольников 132 203 301.
Тогда: если все площади неположительны или все неотрицательны, то точка внутри или на границе.
Это как это?

Пусть точка 0 располагается в створе угла 231. Площади 132, 203 и 301 при этом будут иметь одинаковый знак. Но при этом точка 0 может располагаться как угодно далеко за пределами треугольника, оставаясь в створе угла 231. Ваш критерий при этом будет утверждать, что точка находится внутри треугольника.
1
palva
3100 / 2232 / 450
Регистрация: 08.06.2007
Сообщений: 8,132
Записей в блоге: 4
21.07.2017, 21:44 5
TheCalligrapher, да, я уже признал, что неправ. Я почему-то подумал, что точки следуют в массиве в том порядке в котором идут на вводе. А когда взглянул на код, то схватился за голову. (Не в массиве, конечно, а в нумерованных переменных.)

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
if ((a >= 0 && b >= 0 && c >= 0) || (a <= 0 && b <= 0 && c <= 0))
    if(a==0 || b==0 || c==0)
        printf("On");
    else
        printf("In");
else
    printf("Out");
1
MariaFitzgerald
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 106
Завершенные тесты: 1
21.07.2017, 23:25  [ТС] 6
TheCalligrapher, большое спасибо, все получилось!)
0
21.07.2017, 23:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2017, 23:25

Определить, лежит ли точка с заданными координатами внутри треугольника
Как с помощью этого решить это: Определите, лежит ли точка с координатами (x0,...

Проверить, лежит ли точка с заданными координатами внутри треугольника
Как уже сказано нужна программа которая будет выводить: true: если координата...

Определить, лежит ли точка внутри треугольника. Исправить код
Доброго времени суток. Помогите, пожалуйста, исправить код. Преподаватель...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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