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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 90, средняя оценка - 4.93
Непрограммистка
0 / 0 / 0
Регистрация: 15.09.2010
Сообщений: 45
#1

Точка в треугольнике - C++

29.12.2010, 18:24. Просмотров 12656. Ответов 34
Метки нет (Все метки)

Помогите!
даны три вершины треугольника с координатами(коорд вводятся с клавиатуры) А(х1,y1) B(х2,y2) и С(х3,y3). И вводятся координаты другой точки Д(х4,y4)-и нужно определить принадлежит эта точка треугольнику или нет!А перед этим еще проверить возможен ли треугольник с такими точками.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2010, 18:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Точка в треугольнике (C++):

Определить, находится ли точка в треугольнике - C++
заданы прямоугольные координаты Х1,У1,Х2,У2,Х3,У3 вершин треугольника и координаты Х и У точки. определить, находится ли точка в...

Лежит ли точка в круге и треугольнике - C++
Даны круг и треугольник на плоскости.Кординаты вводятся с клавиатуры.Даны кординаты точки. Узнать лежит ли точка в области пересечения 2ух...

Определить и напечатать, находится ли точка в треугольнике - C++
добрый вечер. помогите пожалуйста решить задачи срочно нужно( 1. Треугольник и точка. Заданы прямоугольные координаты x1, y1, x2, y2,...

Дана точка М(x, y). Присвоить z = 1, если точка принадлежит окружности с радиусом R и центром в точке (a, b) и z = 0 в противном случае. - C++
Дана точка М(x, y). Присвоить z = 1, если точка принадлежит окружности с радиусом R и центром в точке (a, b) и z = 0 в противном случае.

Треугольник в треугольнике - C++
Даны действительный числа x1,y1,x2,y2,...,x6,y6. Точки с координатами (x1,y1), (x2,y2), (x3,y3) рассматриваются как вершины первого...

Найти углы в треугольнике - C++
Стороны с горем пополам я смог найти, по ним нужно найти углы. Заранее благодарю. #include<iostream.h> #include<math.h> ...

34
asics
Freelance
Эксперт С++
2852 / 1787 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
29.12.2010, 19:39 #2
Цитата Сообщение от Непрограммистка Посмотреть сообщение
даны три вершины треугольника с координатами(коорд вводятся с клавиатуры) А(х1,y1) B(х2,y2) и С(х3,y3). И вводятся координаты другой точки Д(х4,y4)-и нужно определить принадлежит эта точка треугольнику или нет!А перед этим еще проверить возможен ли треугольник с такими точками.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
 
struct point
{
    double x;
    double y;
};
 
bool foo(point p[])
{
    int a = (p[1].x - p[0].x) * (p[2].y - p[1].y) * (p[1].y - p[0].y),
    b = (p[2].x - p[0].x) * (p[3].y - p[2].y) * (p[2].y - p[0].y),
    c = (p[3].x - p[0].x) * (p[1].y - p[2].y) * (p[3].y - p[0].y);
 
    return (a >= 0 && b >= 0 && c >= 0) ||
                (a <= 0 && b <= 0 && c <= 0)? 1 : 0;
}
 
bool prov(point p[])
{
    return p[1].x == p[2].x && p[2].x == p[3].x? 0 :
                p[1].y == p[2].y && p[2].y == p[3].y? 0 : 1;
}
 
int main()
{
    const size_t n = 4;
    point p[n];
 
    std::cout << "\n\nEnter coord point: ";
    for(size_t i = 0; i < n; ++i)
    {
        if(i > 0)
            std::cout << "\n\nEnter tringale coord " << i << ": ";
 
        std::cout << "\n\nx" << i << " -> ";
        std::cin >> p[i].x;
        std::cout << "\n\ny" << i << " -> ";
        std::cin >> p[i].y;
    }
 
    if(prov(p))
    {
        if(foo(p))
           std::cout << "\n\tYes" << std::endl;
 
        else
           std::cout << "\n\tNo" << std::endl;
    }
 
    else
        std::cout << "\n\tTringale not found" << std::endl;
 
    return 0;
}
0
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
29.12.2010, 20:41 #3
asics, как у вас работает проверка на возможность существования треугольника с задаными координатами?
0
asics
Freelance
Эксперт С++
2852 / 1787 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
29.12.2010, 20:46 #4
Mayonez, Если точки находятся на одной линии, то соответственно нельзя построить данный треугольник, а что что-то не так ?
0
Алексaндр
131 / 108 / 5
Регистрация: 04.12.2010
Сообщений: 313
29.12.2010, 20:47 #5
А как он может не существовать? 3 точки всегда преобразуют одну плоскость. Следовательно, и треугольник. Единственный вариант - координаты точек совпадут...
Да, или на одной прямой. Это можно по одной формуле (расположение то4ки относительно прямой) вычеслить...
0
asics
Freelance
Эксперт С++
2852 / 1787 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
29.12.2010, 20:55 #6
Цитата Сообщение от Алексaндр Посмотреть сообщение
3 точки всегда преобразуют одну плоскость.
Ошыбаетесь, три точки которые не лежат на одной прямой всегда преобразуют одну и только одну плосткость.Это вытекает из аксиомы стереометрии, точно уже не помню какой именно.
0
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
29.12.2010, 21:01 #7
Цитата Сообщение от asics Посмотреть сообщение
а что что-то не так ?
ну, например, для координат треугольника 0 0, 2 2, 3 3
проверка дает +

Добавлено через 2 минуты
а как проверяется приналежность точки треугольнику? Через площадь???
0
asics
Freelance
Эксперт С++
2852 / 1787 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
29.12.2010, 21:07 #8
Mayonez, По этому алгоритму.

Добавлено через 3 минуты
Цитата Сообщение от Mayonez Посмотреть сообщение
ну, например, для координат треугольника 0 0, 2 2, 3 3
проверка дает +
Ов, пардон, не доглидел.
0
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
29.12.2010, 21:16 #9
Ввод:
0.346
0.236

-0.474
-0.568

0.567
2.346

2.437
-0.2

выдает NO
0
asics
Freelance
Эксперт С++
2852 / 1787 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
29.12.2010, 21:29 #10
Mayonez, А если так ?
C++
1
2
3
4
5
6
7
8
9
bool foo(point p[])
{
    int a = (p[1].x - p[0].x) * (p[2].y - p[1].y) - (p[2].x - p[1].x) * (p[1].y - p[0].y),
    b = (p[2].x - p[0].x) * (p[3].y - p[2].y) - (p[3].x - p[2].x) * (p[2].y - p[0].y),
    c = (p[3].x - p[0].x) * (p[1].y - p[3].y) - (p[1].x - p[3].x) * (p[3].y - p[0].y);
 
    return (a >= 0 && b >= 0 && c >= 0) ||
                (a <= 0 && b <= 0 && c <= 0)? 1 : 0;
}
0
silent_1991
Эксперт С++
4993 / 3051 / 149
Регистрация: 11.11.2009
Сообщений: 7,038
Завершенные тесты: 1
29.12.2010, 21:45 #11
Проще через площади посчитать ИМХО...
0
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
29.12.2010, 21:46 #12
Чтобы проверить, можно ли образовать с заданых точек треугольник, нужно найти длину всех сторон и воспользоватся тем, что сумма двух любых сторон не должна превышать третью
0
Igor
дилетант
4613 / 3372 / 294
Регистрация: 11.11.2010
Сообщений: 6,169
Записей в блоге: 2
29.12.2010, 21:50 #13
Допустим имеется треугольник ABC, находим его площадь по трем вершинам, далее, чтобы определить попадает ли точка в заданную область находим площади треугольников: DAB, DBC, DAC; если Sabc=Sdab+Sdbc+Sdac тогда точка принадлежит.
2
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
29.12.2010, 21:53 #14
Цитата Сообщение от silent_1991 Посмотреть сообщение
Проще через площади посчитать ИМХО...
Можно и через площади, но тогда нужно, чтобы координаты были целыми числами, тогда площадь - полуцелое число. Тогда можна сравнить удвоенные величины площадей (найденых через псевдоскалярное произведение)
0
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
29.12.2010, 21:57 #15
Если координаты - целые числа:
Точка в треугольнике
Находим площадь ABC. Если она равна площади ABD+BCD+ADC значит точка лежит внутри треугольника.
В противном случае площадь ABC будет меньше второй суммы
найти площадь таким образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cmath>
using namespace std;
 
struct point
{
   int x;
   int y;
};
 
int area(point a, point b, point c)
{
   return abs((a.x - c.x)*(b.y - c.y) + (b.x-c.x)*(c.y-a.y));
}
 
int main()
{
   /////////////////////////////////////////////////////////////////////////////
   point a, b, c, d;
   cin >> a.x >> a.y;
   cin >> b.x >> b.y;
   cin >> c.x >> c.y;
   cin >> d.x >> d.y;
   /////////////////////////////////////////////////////////////////////////////
   if (area(a, b, c) == area(a, b, d) + area(a, d, c) + area(b, d, c))
      cout << "In\n";
   else 
      cout << "Out\n";
   /////////////////////////////////////////////////////////////////////////////
   return 0;
}
1
29.12.2010, 21:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2010, 21:57
Привет! Вот еще темы с ответами:

Даны отрезки [a, b] и [c, d] и точка A с координатой х. Определить, принадлежит ли данная точка одному из этих отрезков, обоим или лежит вне их - C++
Даны отрезки и и точка A с координатой х. Определить, принадлежит ли данная точка одному из этих отрезков, обоим или лежит вне их

Найти длины высот в треугольнике - C++
. Треугольник задан длинами сторон. Найти: а) длины высот; б) длины медиан; в) длины биссектрис; г) радиусы вписанной и описанной...

Линейная задача о круге в треугольнике - C++
Требования к программе: - Числовые значения переменных ввести с клавиатуры, вывод напоминания при этом обязательно; - Вывести на...

Нахождение всех углов в треугольнике - C++
Найти все углы треугольника со сторонами a , b , c . Предусмотреть в программе перевод радианной меры угла в градусы, минуты и секунды. ...


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

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

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