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

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

Войти
Регистрация
Восстановить пароль
 
 
no swear
56 / 56 / 25
Регистрация: 01.07.2016
Сообщений: 434
Завершенные тесты: 1
#1

Нахождение точки внутри прямоугольника - C++

22.07.2016, 10:57. Просмотров 861. Ответов 27
Метки нет (Все метки)

Дано: Прямоугольник, заданный 4 точками. Точка заданная координатами. Нужно написать функцию, возращающую Труе\Фалсе на нахождение точки внутри прямоугольника. Я знаю есть формула математическая но я хочу узнать как её вывели
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
dx = x2 - x1
dy = y2 - y1
d1# = ((y1 - Py) * Dx + (Px - x1) * Dy) / (Dy * Dy + Dx * Dx)
dx = x3 - x2
dy = y3 - y2
d2# = ((y2 - Py) * Dx + (Px - x2) * Dy ) / (Dy * Dy + Dx * Dx)
dx = x4 - x3
dy = y4 - y3
d3# = ((y3 - Py) * Dx + (Px - x3) * Dy ) / (Dy * Dy + Dx * Dx)
dx = x1 - x4
dy = y1 - y4
d4# = ((y4 - Py) * Dx + (Px - x4) * Dy ) / (Dy * Dy + Dx * Dx)
Где x1, y1, x2, y2, x3, y3, x4, y4 - координаты точек, образующих четырехугольник, Px, Py - координаты проверяемой точки
если d1, d2, d3, d4 отрицательны - точка внутри четырехугольника
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2016, 10:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нахождение точки внутри прямоугольника (C++):

Рассчитать координаты описанного прямоугольника внутри которого оказываются все заданные точки - C++
Дан массив точек на плоскости { (x1,y1),(x2,y2)....(xn,yn) }. Рассчитать координаты описанного прямоугольника, то есть такого, внутри...

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

Классы. Нахождение периметра и площади прямоугольника. - C++
Написал код, но никак не пойму на что оно материться, компилятор пишет о том что он не может определить адрес перезагрузки функции, но это...

Вывести сумму координат всех точек внутри прямоугольника - C++
Написать программу, выводящую сумму расстояний до начала координат всех точек, имеющих целочисленные координаты и находящиеся внутри...

Затабулировать функцию внутри прямоугольника и области существования данной функции - C++
Затабулировать функцию Z=f(x,y) с шагами x и y внутри прямоугольника и области существования данной функции. Составить универсальную...

Определить точки пересечения круга и прямоугольника - C++
Помогите, пожалуйста!( Даны вещественные числа x1, y1, r, x2, y2, x3, y3. Определите, существуют ли общие точки у круга с центром в точке...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
jurok_85
241 / 224 / 77
Регистрация: 21.02.2013
Сообщений: 519
Завершенные тесты: 1
22.07.2016, 12:06 #2
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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
bool inside(const int&px  , const int&py, const int&ax  , const int&ay, const int&bx  , const int&dy){
    if((px < bx)&&(px > ax)&&(py < dy)&&(py > ay)){
        return true;
    }
    return false;
 
}
int main()
{
    int px  , py;
    cout << "Koordinati tochki x i y: ";
    cin >> px>>py;
 
    int ax, ay, bx, by, cx, cy, dx, dy;
    /*
        D--------------------C
        |                    |
        |                    |
        |                    |
        |                    |
        A--------------------B
    */
 
    cout << "Koordinati prjamougoljnika ax i ay: ";
    cin >> ax>>ay;
    cout << "Koordinati prjamougoljnika bx i by: ";
    cin >> bx>>by;
    cout << "Koordinati prjamougoljnika cx i cy: ";
    cin >> cx>>cy;
    cout << "Koordinati prjamougoljnika dx i dy: ";
    cin >> dx>>dy;
    //(x1-x3)*(y2-y3)-(x2-x3)*(y1-y3);
    if(inside(px,py,ax,ay,bx,dy))
        cout << "Tochka prinadlezit!!!";
 
}
1
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
22.07.2016, 12:08 #3
jurok_85, а нигде не сказано, что стороны прямоугольника параллельны осям координат!
1
Андрей Валерьев
14 / 14 / 4
Регистрация: 16.01.2016
Сообщений: 57
Завершенные тесты: 2
22.07.2016, 12:20 #4
по координатам прямоугольника вывести формулы прямых ограничивающих площадь прямоугольника
затем проверить систему уравнений подставив координаты точки.
частный случай параллельные стороны. добавьте угол
1
no swear
56 / 56 / 25
Регистрация: 01.07.2016
Сообщений: 434
Завершенные тесты: 1
22.07.2016, 12:24  [ТС] #5
а по подробней можно
0
jurok_85
241 / 224 / 77
Регистрация: 21.02.2013
Сообщений: 519
Завершенные тесты: 1
22.07.2016, 13:11 #6
Цитата Сообщение от zss Посмотреть сообщение
jurok_85, а нигде не сказано, что стороны прямоугольника параллельны осям координат!
zss, я не силен в тригонометрии, но по моему тут надо угол наклона тогда вычислять и как то потом связывать данные координаты точки и прямоугольника с углом наклона?
1
_Ivana
3149 / 1777 / 152
Регистрация: 01.03.2013
Сообщений: 4,981
Записей в блоге: 2
22.07.2016, 14:19 #7
Можно вылить воду из чайника и свести к предыдущей задаче тривиально триангулировать прямоугольник на 2 треугольника и использовать известный алгоритм принадлежности точки треугольнику.
2
Андрей Валерьев
14 / 14 / 4
Регистрация: 16.01.2016
Сообщений: 57
Завершенные тесты: 2
22.07.2016, 16:52 #8
Можно и так. А можно использовать y=kx+b и проверять только по b. Чуть позже представлю.
1
Андрей Валерьев
14 / 14 / 4
Регистрация: 16.01.2016
Сообщений: 57
Завершенные тесты: 2
22.07.2016, 17:59 #9
A,B,C,D вершины прямоугольника( x,y координаты точек)
общее уравнение прямой Y=kX+B или K=(y2-y1)/(x2-x1) например для отрезка АВ А(x1,y1) B(x2,y2)
когда будем знать коэф. К то можем для произвольной точки М получить уравнение прямой с коэф К(параллельной сторонам) Y=Kx-K*x1+y1 через точку М. нас интересует свободный член (К*x1+y1)
как видим на рисунке проверяем свободный член, что меньше чем у верхней прямой и больше нижней стороны.
Аналогично для прямых AD и BC
1
Миниатюры
Нахождение точки внутри прямоугольника  
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
22.07.2016, 18:06 #10
Мне кажется, самое простое - это через косые произведения векторов (на самом деле годится для любого выпуклого многоугольника).
Пусть вершины прямоугольника в порядке обхода против часовой стрелки - это точки A, B, C, D,
и определяем принадлежность к нему точки P.
По очереди находим косые произведения векторов (PA, PB), (PB, PC), (PC, PD), (PD, PA).
Если хотя бы одно из произведений отрицательно - точка вне прямоугольника.
Косое произведение векторов x и y равно x1*y2 - x2*y1.
1
no swear
56 / 56 / 25
Регистрация: 01.07.2016
Сообщений: 434
Завершенные тесты: 1
22.07.2016, 23:32  [ТС] #11
Очень интересно! Столько способов решение этой задачи )) Можете по конкретней разъяснить их (по каким теоремам, аксиомам, формулам и т.д.). Я в геометрии не силён но постараюсь осмыслить то что вы будете писать и самое главное мысль объяснить, а то одно дело выучить формулу или теорему которую забудешь на слейдущий день другое дело понять смысл и она будет держаться у тебя в голове всё время ))

Добавлено через 3 минуты
Цитата Сообщение от _Ivana Посмотреть сообщение
Можно вылить воду из чайника и свести к предыдущей задаче тривиально триангулировать прямоугольник на 2 треугольника и использовать известный алгоритм принадлежности точки треугольнику.
можете объяснить алгоритм пренадлежности точки треугольнику?
0
Андрей Валерьев
14 / 14 / 4
Регистрация: 16.01.2016
Сообщений: 57
Завершенные тесты: 2
23.07.2016, 17:54 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
ну тогда самый простой способ для понимания). условимся что треугольник имеет три стороны( обозначим a,b,c). теперь для нахождения площади найдем длину каждой стороны a,b,c. формулу для длины стороны произвольного треугольника найдешь в сети(по координатам длина будет)
АВ=sqrt((x2-x1)^2+(y2-y1)^2)
Площадь для такого треугольника
S=sqrt( p*(p-a)*(p-b)*(p-c))
где p=(a+b+c)/2
так получим площадь треугольника с вершинами A,B,C и длиной сторон a,b,c!
Всё это, как писали выше, необходимо для разбиения на треугольники.
рисуем квадрат с вершинами A,B,C,D. Ставим исследуемую точку М в (допустим) центр прямоугольника. соедини каждую вершину с точкой М. получишь 4 треугольника.(ABM,BCM,CDM,ADM)/
как выше написано находим площади этих 4-х треугольников.
основная мысль такова- если точка в прямоугольнике то сумма площадей треуголок равна площади прямоугольника. а если точка вне него то сумма площадей ТР. будет больше площади прямоугольника)
Самый простой способ для понимания.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double Dlina(int x1,int x2,int y1,int y2){  // функция выч длины по координатам двух точек
          double Dlin=sqrt(pow((x2-x1),2)+pow((y2-y1),2); // корень суммы квадратов разницы координат))
          return Dlin;
 
}
 
double PLOCHAD( double a, double b, double c){ // функц вычисления площади по длинам сторон треуг.
        double p, s;
        p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c))
   
  return s;
 
}
так наметки)). в основном теле какой то цикл создания массива с координатами. также в цикле для каждой пары точек вызываем функцию вычисления длины. затем площадей. и суммируем площади ТР. думаю площадь прямоугл. Вы напишите.

функция Длины
функция Площади

ввод координат от пользователя
вызов Д (8 раз)
вызов П (4 раза)
вычисление площади ПРям-ка
суммирование площадей 4-х ТР-ков
сравнение площадей
вывод на экран результата
1
Андрей Валерьев
14 / 14 / 4
Регистрация: 16.01.2016
Сообщений: 57
Завершенные тесты: 2
23.07.2016, 18:25 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
рисунок
2
Миниатюры
Нахождение точки внутри прямоугольника  
no swear
56 / 56 / 25
Регистрация: 01.07.2016
Сообщений: 434
Завершенные тесты: 1
23.07.2016, 18:57  [ТС] #14
Цитата Сообщение от Андрей Валерьев Посмотреть сообщение
ну тогда самый простой способ для понимания). условимся что треугольник имеет три стороны( обозначим a,b,c). теперь для нахождения площади найдем длину каждой стороны a,b,c. формулу для длины стороны произвольного треугольника найдешь в сети(по координатам длина будет)
АВ=sqrt((x2-x1)^2+(y2-y1)^2)
Площадь для такого треугольника
S=sqrt( p*(p-a)*(p-b)*(p-c))
где p=(a+b+c)/2
так получим площадь треугольника с вершинами A,B,C и длиной сторон a,b,c!
Всё это, как писали выше, необходимо для разбиения на треугольники.
рисуем квадрат с вершинами A,B,C,D. Ставим исследуемую точку М в (допустим) центр прямоугольника. соедини каждую вершину с точкой М. получишь 4 треугольника.(ABM,BCM,CDM,ADM)/
как выше написано находим площади этих 4-х треугольников.
основная мысль такова- если точка в прямоугольнике то сумма площадей треуголок равна площади прямоугольника. а если точка вне него то сумма площадей ТР. будет больше площади прямоугольника)
Самый простой способ для понимания.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double Dlina(int x1,int x2,int y1,int y2){  // функция выч длины по координатам двух точек
          double Dlin=sqrt(pow((x2-x1),2)+pow((y2-y1),2); // корень суммы квадратов разницы координат))
          return Dlin;
 
}
 
double PLOCHAD( double a, double b, double c){ // функц вычисления площади по длинам сторон треуг.
        double p, s;
        p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c))
   
  return s;
 
}
так наметки)). в основном теле какой то цикл создания массива с координатами. также в цикле для каждой пары точек вызываем функцию вычисления длины. затем площадей. и суммируем площади ТР. думаю площадь прямоугл. Вы напишите.

функция Длины
функция Площади

ввод координат от пользователя
вызов Д (8 раз)
вызов П (4 раза)
вычисление площади ПРям-ка
суммирование площадей 4-х ТР-ков
сравнение площадей
вывод на экран результата
СПАСИБО большое!!! Всё оказывается ещё проще чем я думал))
0
Андрей Валерьев
14 / 14 / 4
Регистрация: 16.01.2016
Сообщений: 57
Завершенные тесты: 2
23.07.2016, 19:16 #15
Цитата Сообщение от no swear Посмотреть сообщение
ещё проще
будете реализовывать- не забудьте выложить на обозрение. я тоже только учусь и будет интересно посмотреть код. Параллельно с Вами попробую написать. Главная проблема сейчас, для меня, как передавать в функцию попарно координаты точек. Или реализовать классы, которые будут получать массив и считать длину сторон 1-го треугольника, или писать кучу строк. Но это вопрос уже к Уважаемым мастерам С++.Слежу за темой. Приятного кода всем)
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2016, 19:16
Привет! Вот еще темы с ответами:

Определить площадь прямоугольника, ограниченного координатами точки и осями координат - C++
Точка на плоскости: координаты точки на плоскости (по горизонтали и верти- кали) x1 и y1 Определить площадь пря- моугольника,...

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

Даны положительные действительные числа a,b,c,d. Выяснить, можно ли один из прямоугольников целиком поместить внутри другого прямоугольника - C++
Прямоугольники. Даны положительные действительные числа a,b,c,d. Выяснить, можно ли один из прямоугольников целиком поместить внутри...

Написать булеву функцию, которая проверяет, имеют ли два прямоугольника общие точки - C++
прямоугольники на экране подаются четверками чисел : ( х1 , у1 , х2 , у2 ) - координатами диагонали . написать булевую функцию , которая...


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

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

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