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

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

Восстановить пароль Регистрация
 
 
no swear
1 / 1 / 0
Регистрация: 01.07.2016
Сообщений: 73
Завершенные тесты: 1
22.07.2016, 10:57     Нахождение точки внутри прямоугольника #1
Дано: Прямоугольник, заданный 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 отрицательны - точка внутри четырехугольника
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2016, 10:57     Нахождение точки внутри прямоугольника
Посмотрите здесь:

C++ Классы. Нахождение периметра и площади прямоугольника.
C++ Даны числа x, y, x1, y1, x2, y2. Проверить истинность высказывания: «Точка с координатами (x, y) лежит внутри прямоугольника, левая верхняя вершина ко
Затабулировать функцию внутри прямоугольника и области существования данной функции C++
Определить точки пересечения круга и прямоугольника C++
C++ Даны положительные действительные числа a,b,c,d. Выяснить, можно ли один из прямоугольников целиком поместить внутри другого прямоугольника
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
no swear
1 / 1 / 0
Регистрация: 01.07.2016
Сообщений: 73
Завершенные тесты: 1
25.07.2016, 14:58  [ТС]     Нахождение точки внутри прямоугольника #21
Цитата Сообщение от MansMI Посмотреть сообщение
ну и хорошо что запускается, хотя с точками компилятору было бы понятнее
Ой! я хотел сказать что НЕ запускается, но по моему вы уже поняли о чём я
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MansMI
1047 / 844 / 205
Регистрация: 08.01.2012
Сообщений: 3,027
25.07.2016, 15:09     Нахождение точки внутри прямоугольника #22
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
56
57
58
59
60
#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <windows.h>
#define _USE_MATH_DEFINES
#include <cmath>
 
using namespace std;
 
struct point{ double x,y,a; };
void main(int argc,char* argv[])
{
    setlocale(LC_ALL,"Rus");
    point ap[]={{4,1,0},{8,8,0},{2,5,0},{10,4,0}};
    
    double xmin,xmax,ymin,ymax;
    xmin=xmax=ap[0].x;
    ymin=ymax=ap[0].y;
    for(int i=1; i<4; i++)
    {
        if(xmin>ap[i].x)xmin=ap[i].x;
        if(xmax<ap[i].x)xmax=ap[i].x;
        if(ymin>ap[i].y)ymin=ap[i].y;
        if(ymax<ap[i].y)ymax=ap[i].y;
    }
    double x=(xmax+xmin)/2;
    double y=(ymax+ymin)/2;
    for(int i=0; i<4; i++)
    {
        ap[i].a=atan2(ap[i].y-y,ap[i].x-x);
        if(ap[i].a<0)ap[i].a+=2*M_PI;
    }
    for(int i=3; i; i--)
    for(int j=0; j<i; j++)
        if(ap[j].a>ap[i].a) swap(ap[j],ap[i]);
    //for(int i=0; i<4; i++) cout<<ap[i].x<<" "<<ap[i].y<<endl;
    cout<<"x y через пробел: ";
    cin>>x>>y;
    bool in=true;
    if(ap[0].y==ap[1].y)
    {
        if(x<ap[1].x || x>ap[0].x || y<ap[2].y || y>ap[0].y) in=false;
    }
    else
    {
        //y=a*x+b
        int i;
        for(i=0; i<2; i++)
        {
            double a=(ap[i].y-ap[i+1].y)/(ap[i].x-ap[i+1].x);
            double b0=ap[i].y-a*ap[i].x;
            double b1=ap[i+2].y-a*ap[i+2].x;
            double b=y-a*x;
            if(b<b0 && b<b1 || b>b0 && b>b1) break;
        }
        if(i<2) in=false;
    }
    cout<<(in?"внутри\n":"снаружи\n");
    system("pause");
}
вроде ничего не забыл
Андрей Валерьев
14 / 14 / 4
Регистрация: 16.01.2016
Сообщений: 55
Завершенные тесты: 2
26.07.2016, 09:01     Нахождение точки внутри прямоугольника #23
Цитата Сообщение от no swear Посмотреть сообщение
Ваш код вообще запускается.
Зачем же так? вполне приличный компактный код. Уважайте труд человека. Основа дана(правда без комментариев) а остальное допилите.
no swear
1 / 1 / 0
Регистрация: 01.07.2016
Сообщений: 73
Завершенные тесты: 1
26.07.2016, 10:21  [ТС]     Нахождение точки внутри прямоугольника #24
Цитата Сообщение от MansMI Посмотреть сообщение
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
56
57
58
59
60
#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <windows.h>
#define _USE_MATH_DEFINES
#include <cmath>
 
using namespace std;
 
struct point{ double x,y,a; };
void main(int argc,char* argv[])
{
    setlocale(LC_ALL,"Rus");
    point ap[]={{4,1,0},{8,8,0},{2,5,0},{10,4,0}};
    
    double xmin,xmax,ymin,ymax;
    xmin=xmax=ap[0].x;
    ymin=ymax=ap[0].y;
    for(int i=1; i<4; i++)
    {
        if(xmin>ap[i].x)xmin=ap[i].x;
        if(xmax<ap[i].x)xmax=ap[i].x;
        if(ymin>ap[i].y)ymin=ap[i].y;
        if(ymax<ap[i].y)ymax=ap[i].y;
    }
    double x=(xmax+xmin)/2;
    double y=(ymax+ymin)/2;
    for(int i=0; i<4; i++)
    {
        ap[i].a=atan2(ap[i].y-y,ap[i].x-x);
        if(ap[i].a<0)ap[i].a+=2*M_PI;
    }
    for(int i=3; i; i--)
    for(int j=0; j<i; j++)
        if(ap[j].a>ap[i].a) swap(ap[j],ap[i]);
    //for(int i=0; i<4; i++) cout<<ap[i].x<<" "<<ap[i].y<<endl;
    cout<<"x y через пробел: ";
    cin>>x>>y;
    bool in=true;
    if(ap[0].y==ap[1].y)
    {
        if(x<ap[1].x || x>ap[0].x || y<ap[2].y || y>ap[0].y) in=false;
    }
    else
    {
        //y=a*x+b
        int i;
        for(i=0; i<2; i++)
        {
            double a=(ap[i].y-ap[i+1].y)/(ap[i].x-ap[i+1].x);
            double b0=ap[i].y-a*ap[i].x;
            double b1=ap[i+2].y-a*ap[i+2].x;
            double b=y-a*x;
            if(b<b0 && b<b1 || b>b0 && b>b1) break;
        }
        if(i<2) in=false;
    }
    cout<<(in?"внутри\n":"снаружи\n");
    system("pause");
}
Этот работает. Попробую изменить что бы координаты задавал я сам.
MansMI
1047 / 844 / 205
Регистрация: 08.01.2012
Сообщений: 3,027
26.07.2016, 10:29     Нахождение точки внутри прямоугольника #25
Цитата Сообщение от no swear Посмотреть сообщение
координаты задавал я сам
за "прямоугольность" отвечает "координатор", а задавать может в любом порядке
SpBerkut
Объявлятель переменных
 Аватар для SpBerkut
905 / 231 / 113
Регистрация: 24.09.2011
Сообщений: 874
Завершенные тесты: 2
26.07.2016, 10:50     Нахождение точки внутри прямоугольника #26
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
#include<iostream>
#include<cmath>
 
using namespace std;
 
struct point {
  float x,y;  
};
 
//Площадь треугольника по вершинам
float tS(point a, point b, point c) {
    return fabs((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y))/2;
}
 
//Проверка принадлежности точки прямоугольнику
bool iR(point p1, point p2, point p3, point p4, point p) {
    return fabs(2*tS(p1,p2,p3)-(tS(p1,p2,p)+tS(p2,p3,p)+tS(p3,p4,p)+tS(p1,p4,p)))<1e-8;
}
 
int main(){
    point   p1 = {0,0}, p2 = {-1,1}, p3 = {0,2}, p4 = {1,1}, p = {1,1};
    cout << iR(p1,p2,p3,p4,p);
    return 0;
}
Андрей Валерьев
14 / 14 / 4
Регистрация: 16.01.2016
Сообщений: 55
Завершенные тесты: 2
08.08.2016, 11:26     Нахождение точки внутри прямоугольника #27
Цитата Сообщение от SpBerkut Посмотреть сообщение
//Проверка принадлежности точки прямоугольнику
подскажите в двух словах.... какой механизм тут используется?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2016, 08:21     Нахождение точки внутри прямоугольника
Еще ссылки по теме:

Определить лежит ли точка внутри заданного прямоугольника C++
C++ Вывести сумму координат всех точек внутри прямоугольника
Написать булеву функцию, которая проверяет, имеют ли два прямоугольника общие точки C++

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

Или воспользуйтесь поиском по форуму:
SpBerkut
Объявлятель переменных
 Аватар для SpBerkut
905 / 231 / 113
Регистрация: 24.09.2011
Сообщений: 874
Завершенные тесты: 2
09.08.2016, 08:21     Нахождение точки внутри прямоугольника #28
Цитата Сообщение от Андрей Валерьев Посмотреть сообщение
какой механизм тут используется?
Точка и каждая сторона прямоугольника рассматривается как отдельный треугольник. Если общая площадь треугольников равна площади прямоугольника, то точка лежит внутри, иначе — снаружи.
Yandex
Объявления
09.08.2016, 08:21     Нахождение точки внутри прямоугольника
Ответ Создать тему
Опции темы

Текущее время: 07:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru