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

В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть). - C++

Восстановить пароль Регистрация
 
serezhqqa
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 6
17.03.2013, 18:35     В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть). #1
1. В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть).
2. Рассмотреть указанную последовательность в цикле и выйти из цикла, достигнув указанного условия с выдачей порядкового номера члена, при котором достигнуто условие. Если же за m оборотов цикла условие не достигнуто, напечатать об этом сообщение.

Помогите, пожалуйста...сам мучался никак не получается
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2013, 18:35     В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть).
Посмотрите здесь:

Лежит ли точка М(xm;ym) внутри треугольника, заданного координатами своих вершин C++
C++ Создать класс произвольного треугольника, заданного координатами своих вершин
Два треугольника заданы координатами своих вершин. Вычислить их площади C++
C++ Из N треугольников, заданных координатами своих вершин, имеет больший периметр?
C++ Треугольник задается координатами своих вершин. С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Progr
2 / 2 / 0
Регистрация: 17.03.2013
Сообщений: 25
20.03.2013, 20:59     В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть). #2
Я новичок, так что пример кода не покажу, но объясню как можно реализовать. Есть формулы:
x = x0 + round(R * cos(A * PI / 180));
y = y0 + round(R * sin(A * PI / 180));
где x и y - координаты точки окружности, x0 и y0 - координаты центра окружности, R - радиус окружности, A - угол (А в верхней точке окружности равно 0 и далее увеличивается по часовой стрелке).
Этими формулами можно как - нибудь воспользоваться в этой задаче
IrineK
Заблокирован
20.03.2013, 22:24     В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть). #3
Progr, эти формулы годятся, если все вершины лежат на окружности радиуса R, чего они делать у пятиугольника вовсе не обязаны.

В данном случае нужно из каждой вершины строить два вектора на соседние и проверять их на перпендикулярность, т.е. считать скалярное произведение: если = 0, то у нас - прямой угол.

serezhqqa, ваш пятиугольник должен быть выпуклым, или это все равно?
IrineK
Заблокирован
20.03.2013, 23:40     В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть). #4
Решение для 3D.
Правда, не проверяется: комланарность, существование, выпуклость - это на совести вводящего данные )

Если с классами будет непонятно (судя по условию, циклы - это уже серьезно) - тогда рассматривайте main как псевдокод и постройте свое решение по аналогии.



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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть)
 
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
class Point
{   
public:
    Point() : x(0.),y(0.),z(0.) {}
    Point(const double &x, const double &y,const double &z):x(x),y(y),z(z)  {}
 
    const double X() const { return x; }
    const double Y() const { return y; }
    const double Z() const { return z; }
 
    friend const istream& operator>>(istream& stream, Point& p)
    {   cout<<"X, Y, Z:\t";
        stream>>p.x>>p.y>>p.z;
        stream.sync();
        return stream;
    }
    
    friend const ostream& operator<<(ostream& stream,const Point& p)
    {   stream  <<setprecision(6)<<setw(15)<<p.x
                <<setprecision(6)<<setw(15)<<p.y
                <<setprecision(6)<<setw(15)<<p.z<<"\n";
        return stream;
    }
 
private:
    double x,y,z;
};
 
class Vector
{
public:
    Vector(): x(0.),y(0.),z(0.) {}
        
    Vector(const double a, const double b,const double c)
    {   x = a; y = b; z = c;
    }
    
    void SetVector(const double a, const double b,const double c)
    {   x = a; y = b; z = c;
    }
 
    double* GetArray()
    {   double *A = new double[3];
        A[0] = x;
        A[1] = y;
        A[2] = z;
        return A;
    }
 
    const double X() const { return x; }
    const double Y() const { return y; }
    const double Z() const { return z; }
    
private:
    double x,y,z;
};
 
double VectorProduct(Vector P, Vector V)
{   double *PA = P.GetArray();
    double *VA = V.GetArray();
    double R = 0.;
 
    for(int i=0; i<3;i++)
        R += PA[i]*VA[i];
    return R;
}
 
 
int main()
{   const int N = 5;
    Point P[N];         //массив точек
    Vector V[N];        //массив векторов
    int i, found = 0, whereFound[5] = {0};  //found - счетчик найденных углов
                                //whereFound - массив из 0, если в какой-то вершине
                                //окажется прямой угол - тогда соответствующему элементу
                                //whereFound присвоим 1
    //вводим координаты вершин
    for(i=0;i<N;i++)
    {   cout<<"Coordinates of P["<<i<<"]\n";
        cin>>P[i];
    }
    
    //строим вектора 
    V[0].SetVector(P[0].X()-P[4].X(),P[0].Y()-P[4].Y(),P[0].Z()-P[4].Z());
    for(i=0;i<N-1;i++)
        V[i+1].SetVector(P[i+1].X()-P[i].X(),P[i+1].Y()-P[i].Y(),P[i+1].Z()-P[i].Z());
    
    //считаем скалярные произведения в каждой вершине
    for(i=0;i<N-1;i++)
        if (! VectorProduct(V[i],V[i+1]))
        {   found ++;               //найден прямой угол
            whereFound[i] = 1;      //угол найден для вершины i
        }
 
    if (! VectorProduct(V[4],V[0]))
        {   found ++;
            whereFound[4] = 1;
        }
 
    //выводим результат
    if(found)
    {   cout<<"\n\n"<<found<<" right angles found:\n";
        for(i=0;i<N;i++)
            if(whereFound[i])
                cout<<"    - at point "<<i<<"\n";
    }
    else
        cout<<"No right angles found";
 
    cin.sync();cin.get();
    return 0;
}
Изображения
 
serezhqqa
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 6
18.04.2013, 21:44  [ТС]     В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть). #5
если кому интересно, решил выкрутиться так:
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
    
#include<stdio.h>
main()
{
float k,x1,x2,x3,x4,x5,y1,y2,y3,y4,y5;
 
printf("VVedite x1 \n");
scanf("%f", &x1);
 
printf("VVedite y1 \n");
scanf("%f", &y1);
 
printf("VVedite x2 \n");
scanf("%f", &x2);
 
printf("VVedite y2 \n");
scanf("%f", &y2);
 
printf("VVedite x3 \n");
scanf("%f", &x3);
 
printf("VVedite y3 \n");
scanf("%f", &y3);
 
printf("VVedite x4 \n");
scanf("%f", &x4);
 
printf("VVedite y4 \n");
scanf("%f", &y4);
 
printf("VVedite x5 \n");
scanf("%f", &x5);
 
printf("VVedite y5 \n");
scanf("%f", &y5);
 
k=0;
if (x1==x2 && y2==y3) k=k+1;
if (x2==x3 && y3==y4) k=k+1;
if (x3==x4 && y4==y5) k=k+1;
if (x4==x5 && y5==y1) k=k+1;
if (x5==x1 && y1==y2) k=k+1;
 
if (y1==y2 && x2==x3) k=k+1;
if (y2==y3 && x3==x4) k=k+1;
if (y3==y4 && x4==x5) k=k+1;
if (y4==y5 && x5==x1) k=k+1;
if (y5==y1 && x1==x2) k=k+1;
 
printf("Pryamih uglov %f", k);
 
}
Yandex
Объявления
18.04.2013, 21:44     В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть).
Ответ Создать тему
Опции темы

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