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

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

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

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

22.07.2016, 10:57. Просмотров 822. Ответов 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 отрицательны - точка внутри четырехугольника
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2016, 10:57     Нахождение точки внутри прямоугольника
Посмотрите здесь:

Рассчитать координаты описанного прямоугольника внутри которого оказываются все заданные точки - 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. Определите, существуют ли общие точки у круга с центром в точке...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
no swear
53 / 54 / 24
Регистрация: 01.07.2016
Сообщений: 401
Завершенные тесты: 1
23.07.2016, 19:29  [ТС]     Нахождение точки внутри прямоугольника #16
Цитата Сообщение от Андрей Валерьев Посмотреть сообщение
будете реализовывать- не забудьте выложить на обозрение. я тоже только учусь и будет интересно посмотреть код. Параллельно с Вами попробую написать. Главная проблема сейчас, для меня, как передавать в функцию попарно координаты точек. Или реализовать классы, которые будут получать массив и считать длину сторон 1-го треугольника, или писать кучу строк. Но это вопрос уже к Уважаемым мастерам С++.Слежу за темой. Приятного кода всем)
Завтра попробую реализовать на C++.
MansMI
1137 / 934 / 240
Регистрация: 08.01.2012
Сообщений: 3,399
24.07.2016, 11:43     Нахождение точки внутри прямоугольника #17
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
...............
#define _USE_MATH_DEFINES
#include <cmath>
...............
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)
        {
            point t=ap[j];
            ap[j]=ap[i];
            ap[i]=t;
        }
    //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");
no swear
53 / 54 / 24
Регистрация: 01.07.2016
Сообщений: 401
Завершенные тесты: 1
25.07.2016, 14:35  [ТС]     Нахождение точки внутри прямоугольника #18
Цитата Сообщение от Андрей Валерьев Посмотреть сообщение
будете реализовывать- не забудьте выложить на обозрение. я тоже только учусь и будет интересно посмотреть код. Параллельно с Вами попробую написать. Главная проблема сейчас, для меня, как передавать в функцию попарно координаты точек. Или реализовать классы, которые будут получать массив и считать длину сторон 1-го треугольника, или писать кучу строк. Но это вопрос уже к Уважаемым мастерам С++.Слежу за темой. Приятного кода всем)
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
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
    int x,x1,x2,x3,x4,y,y1,y2,y3,y4;
    double stt,a,b,att,btt,ctt,ptt,sp,att1,btt1,ctt1,ptt1,stt1,att2,btt2,ctt2,ptt2,stt2,att3,btt3,ctt3,ptt3,stt3;
    cin>>x>>y>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
    b=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
    a=sqrt(pow(x3-x2,2)+pow(y3-y2,2));
    sp=a*b;
    //cout<<a<<" "<<b<<" "<<sp<<endl;
    att=sqrt(pow(x2-x,2)+pow(y2-y,2));
    btt=a;
    ctt=sqrt(pow(x3-x,2)+pow(y3-y,2));
    ptt=(att+btt+ctt)/2;
    stt=sqrt(ptt*(ptt-att)*(ptt-btt)*(ptt-ctt));
    //cout<<att<<" "<<btt<<" "<<ctt<<" "<<ptt<<" "<<stt<<endl;
    att1=ctt;
    btt1=b;
    ctt1=sqrt(pow(x4-x,2)+pow(y4-y,2));
    ptt1=(att1+btt1+ctt1)/2;
    stt1=sqrt(ptt1*(ptt1-att1)*(ptt1-btt1)*(ptt1-ctt1));
    //
    att2=ctt1;
    btt2=a;
    ctt2=sqrt(pow(x1-x,2)+pow(y1-y,2));
    ptt2=(att2+btt2+ctt2)/2;
    stt2=sqrt(ptt2*(ptt2-att2)*(ptt2-btt2)*(ptt2-ctt2));
    //
    att3=ctt2;
    btt3=b;
    ctt3=att;
    ptt3=(att3+btt3+ctt3)/2;
    stt3=sqrt(ptt3*(ptt3-att3)*(ptt3-btt3)*(ptt3-ctt3));
    cout<<stt+stt1+stt2+stt3<<" "<<sp;
}
Вот по твоему методу. Вроде работает.
no swear
53 / 54 / 24
Регистрация: 01.07.2016
Сообщений: 401
Завершенные тесты: 1
25.07.2016, 14:42  [ТС]     Нахождение точки внутри прямоугольника #19
Цитата Сообщение от 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
...............
#define _USE_MATH_DEFINES
#include <cmath>
...............
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)
        {
            point t=ap[j];
            ap[j]=ap[i];
            ap[i]=t;
        }
    //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");
Ваш код вообще запускается.
Миниатюры
Нахождение точки внутри прямоугольника  
MansMI
1137 / 934 / 240
Регистрация: 08.01.2012
Сообщений: 3,399
25.07.2016, 14:52     Нахождение точки внутри прямоугольника #20
Цитата Сообщение от no swear Посмотреть сообщение
Ваш код вообще запускается.
ну и хорошо что запускается, хотя с точками компилятору было бы понятнее
no swear
53 / 54 / 24
Регистрация: 01.07.2016
Сообщений: 401
Завершенные тесты: 1
25.07.2016, 14:58  [ТС]     Нахождение точки внутри прямоугольника #21
Цитата Сообщение от MansMI Посмотреть сообщение
ну и хорошо что запускается, хотя с точками компилятору было бы понятнее
Ой! я хотел сказать что НЕ запускается, но по моему вы уже поняли о чём я
MansMI
1137 / 934 / 240
Регистрация: 08.01.2012
Сообщений: 3,399
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
53 / 54 / 24
Регистрация: 01.07.2016
Сообщений: 401
Завершенные тесты: 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
1137 / 934 / 240
Регистрация: 08.01.2012
Сообщений: 3,399
26.07.2016, 10:29     Нахождение точки внутри прямоугольника #25
Цитата Сообщение от no swear Посмотреть сообщение
координаты задавал я сам
за "прямоугольность" отвечает "координатор", а задавать может в любом порядке
SpBerkut
Объявлятель переменных
908 / 234 / 113
Регистрация: 24.09.2011
Сообщений: 875
Завершенные тесты: 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     Нахождение точки внутри прямоугольника
Еще ссылки по теме:

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

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

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

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

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


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

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

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