Понеделник, 19 Септември 2011 04:11

взаимни положения на две прави

Написана от 
Оценете
(0 гласа)

Имате въведени коефициентите на общите уравнения на две прави:
g1: A1x + B1y + C1
g2: A2x + B2y + C2
Да се състави програма, чрез която се извеждат възможните положения на двете прави в равнината: съвпадат, успоредни (разстояние между тях), пресичат се под определен ъгъл – дали са перпендикулярни.
Пример: 2,3,4; 4,5,6 Изход: Пресечна точка 1,-2, ъгъл 0.086738 [rad].

Решение

  
#include <iostream>
#include<cmath>
using namespace std;

void whod (int mas[], int koe)
{
cout<<"Wywevdate koeficientite w obshoto urawnenie na prawa "<<koe+1<<".\n";
cout<<"Wywedete stojnost na koewficienta A[1..100]: ";cin>>mas[3*koe];
cout<<"Wywedete stojnost na koewficienta B[1..100]: ";cin>>mas[3*koe+1];
cout<<"Wywedete stojnost na koewficienta C[1..100]: ";cin>>mas[3*koe+2];
}//void whod (int mas[], int koe)

void presech(int mas[], double &x, double &y)
{double a1,a2,a3;
//Izchislqwa presechna tochka po koeficienti ot obshite urawneniq
//reshawame sistema urawneniq ot 2 urawneniq s dwe nizwestni
//po formulite na Kramer; !!swobodniq chlen se mesti wdqsno na urawnenieto
//osnowna mas[0]*mas[4]-mas[1]*mas[3];
if (mas[0]*mas[4]!=mas[1]*mas[3]){
 a1= mas[0]*mas[4]-mas[1]*mas[3];
 a2= -mas[2]*mas[4]+mas[1]*mas[5];
 a3= -mas[0]*mas[5]+mas[2]*mas[3];
 x=a2/a1;
 y=a3/a1;
}//if
}//void presech


void prawi(int mas[])
{int i,j=0;
 double yg,y1,x,y,d;
 for (i=0;i<2;i++) whod(mas,i); //for

  if (mas[0]*mas[4]==mas[3]*mas[1] && mas[0]*mas[5]==mas[3]*mas[2])
     { cout<<"Prawite sywpadat.\n";j=1;}

  if (mas[0]*mas[4]==mas[3]*mas[1] && mas[0]*mas[5]!=mas[3]*mas[2])
     { cout<<"Prawite sa usporedni.\n";j=2;
//priemame x=0 ichislqwame y=-mas[2]/mas[1] ot urawnenieto na pyrwata prawa
//polagame dwete stojnosti w urawnenieto na wtorata prawa
//d = (A2x +B2y +C2)/sqrt(A2*A2 + B2*B2);
    x=0;
    y=(double) mas[2]/mas[1]*(-1);
    y1=sqrt(mas[3]*mas[3] + mas[4]*mas[4]);
    yg=(double)(mas[3]*x + mas[4]*y + mas[5]);
    d=fabs(yg/y1);
    cout<<"Razstoqnieto mevdu tqh e: "<<d<<endl;
     }

  if (mas[0]*mas[1]+mas[3]*mas[4]==0)
     { cout<<"Prawite sa wzaimno perpendikulqrni.\n";j=3;
     presech(mas, x, y);
     cout<<"Presechnata im tochka e s koordinati: "<<x<<","<<y<<endl;
}

  if (j==0)//posledniq sluchaj - prawite se presichat
  {//tg a = (a1*b2 - a2*b1)/(a1*a2 +b1*b2)
  y1 =(double) (mas[0]*mas[4] - mas[3]*mas[1]);
  yg=atan(y1/(mas[0]*mas[3]+mas[1]*mas[4]));
  yg=fabs(yg);//winagi po-malkiq ygyl
  cout<<"Prawite se presichat pod ygyl "<<yg<<" [rad].\n";
  presech(mas, x, y);
     cout<<"Presechnata im tochka e s koordinati: "<<x<<","<<y<<endl;
 }//if
}//void prawi(int mas[])

int main()
{
  int mas[6];
char ose;
cout<<"Da se systawi programa, chrez koqto se izwevdat wzaimnite\n";
cout<<"poloveniq na 2 prawi pri wywedeni koeficienti w obshite urawneniq.\n";
cout<<"Programata da izwede dali prawite sywpadat, sa usporedni ili se presichat.\n";
cout<<"Primer 2,3,4; 4,5,6 Izhod Presechna tochka 1,-2, ygyl 0.086738 rad.\n";
  do
  {prawi( mas);
   cout<<"She wywevdate li drugi danni <y/n>: ";cin>>ose;
  } while (ose=='y');
return 0;
}
Прочетена 2186 пъти Последно променена в Вторник, 20 Септември 2011 18:09
Още в тази категория: права - лице на триъгълник »