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

serezhqqa

1. В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть). 2. Рассмотреть указанную последовательность в цикле и выйти из цикла, достигнув указанного условия с выдачей порядкового номера члена, при котором достигнуто условие. Если же за m оборотов цикла условие не достигнуто, напечатать об этом сообщение.Помогите, пожалуйста...сам мучался никак не получается
4 ответа

serezhqqa

Я новичок, так что пример кода не покажу, но объясню как можно реализовать. Есть формулы: x = x0 + round(R * cos(A * PI / 180)); y = y0 + round(R * sin(A * PI / 180)); где x и y - координаты точки окружности, x0 и y0 - координаты центра окружности, R - радиус окружности, A - угол (А в верхней точке окружности равно 0 и далее увеличивается по часовой стрелке). Этими формулами можно как - нибудь воспользоваться в этой задаче


serezhqqa

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


serezhqqa

Решение для 3D. Правда, не проверяется: комланарность, существование, выпуклость - это на совести вводящего данные )Если с классами будет непонятно (судя по условию, циклы - это уже серьезно) - тогда рассматривайте main как псевдокод и постройте свое решение по аналогии.
//В пятиугольнике, заданном координатами своих вершин, подсчитать количество прямых углов (если они есть)
 
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
class Point
{   
public:
    Point() : x(0.),y(0.),z(0.) {}
    Point(const ****** &x, const ****** &y,const ****** &z):x(x),y(y),z(z)  {}
 
    const ****** X() const { return x; }
    const ****** Y() const { return y; }
    const ****** 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:
    ****** x,y,z;
};
 
class Vector
{
public:
    Vector(): x(0.),y(0.),z(0.) {}
        
    Vector(const ****** a, const ****** b,const ****** c)
    {   x = a; y = b; z = c;
    }
    
    void SetVector(const ****** a, const ****** b,const ****** c)
    {   x = a; y = b; z = c;
    }
 
    ******* GetArray()
    {   ****** *A = new ******[3];
        A[0] = x;
        A[1] = y;
        A[2] = z;
        return A;
    }
 
    const ****** X() const { return x; }
    const ****** Y() const { return y; }
    const ****** Z() const { return z; }
    
private:
    ****** x,y,z;
};
 
****** VectorProduct(Vector P, Vector V)
{   ****** *PA = P.GetArray();
    ****** *VA = V.GetArray();
    ****** 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

если кому интересно, решил выкрутиться так:
    
#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);
 
}