Programowanie w języku C/C++ » FAQ

Znajdowanie wzoru funkcji liniowej

  • 2006-05-15 21:30
  • 9 komentarzy
  • 3698 odsłon
  • Oceń ten tekst jako pierwszy
Tekst dotyczy znajdowania wzoru funkcji liniowej przechodzącej przez dane punkty.

Przyjmujemy wzór funkcji liniowej jako:

 y = ax + b 


A dane punkty, jako:
(X1,Y1)
i
(X2,Y2)


Więc:

 / Y1 = a*X1 + b
<
 \ Y2 = a*X2 + b


I 'pozbywamy' się b:

#/ Y1 = a*X1 + b
<
 \ Y2 = a*X2 + b / *(-1)
 
 
   / Y1 = a*X1 + b
  <
+  \ -Y2 = -(a*X2) - b
----------------------
(Y1-Y2) = (a*X1)-(a*X2)
aX1-aX2 = (Y1-Y2)
a(X1-X2) = (Y1-Y2) / :(X1-X2)
a = (X1-X2) / (Y1-Y2)
 
// i obliczamy b:
# Y1 = a*X1 + b
  a*X1 + b = Y1
  b = Y1 - (a*X1)
 
// więc:
a = (X1-X2) / (Y1-Y2)
b = Y1 - (a*X1);



A sama implementacja tego w C++ jest banalna:

void Line(int X1, int Y1, int X2, int Y2)
{
  if((X1-X2) != 0)
  {
    float a1 = (Y1-Y2);
    float a2 = (X1-X2);
    float a =  (a1/a2);
    float b = Y2-(a*X2);
    cout << "y = " << a << "x + " << b <<endl;
  }
}

9 komentarzy

Atikor 2015-04-01 10:53

Przecież to jest źle przekształcone:
<quote>
a(X1-X2) = (Y1-Y2) / :(X1-X2)
a = (X1-X2) / (Y1-Y2)
</quote>
Powinno być :
a = (Y1-Y2) / (X1-X2)

gringoM 2008-10-18 20:57

Można to było wyprowadzić tak:
          |x1  1|
Wg =  |        | = x1*1 - x2*1 = x1 - x2
          |x2  1|

          |y1  1|
Wa =  |        | = y1 * 1 - y2 * 1 = y1 - y2
          |y2  1|

      Wa     y1 - y2
a =---- = ---------
      Wg     x1 - x2

         |x1  y1|
Wb = |         | = x1 * y1 - x2 * y2
         |x2  y2|

       Wb      x1 * y1 - x2 * y2
b = ----- = ---------------------
       Wg            x1 - x2

zał: x1 != x2

CriSIX 2006-08-02 21:15

@KoRbI: no to przeróbmy kod w ten sposób:

void Line(int X1, int Y1, int X2, int Y2)
{
  if((X1-X2) != 0)
  {
    float a1 = (Y1-Y2);
    float a2 = (X1-X2);
    float a =  (a1/a2);
    float b = Y2-(a*X2);
    cout << "y = " << a << " x = ";    
    if (b >= 0) cout << b;
    else cout << "- " << -b;
    cout << endl;
  }
}

KoRbI 2006-05-17 23:28

A co jeżeli b<0?? Wyjdzie y=ax + -b  :P

Coldpeer 2006-05-16 15:34

czemu nie działa kolorowanie składni C++ w ostatnim '<code=cpp>'? :/

SebaZ 2006-05-15 23:56

wow, chyba na matematyce miałes i teraz chciałeś sie pochwalic :P toc to podstawic do wzoru i pikus :)

bartosak 2005-07-20 23:39

tak w if powinno byc :

if((Y1-Y2)!=0)


bo inaczej nie ma sensu ;-) o ile linijka:
<quite>
//więc:
a = (X1-X2) / (Y1-Y2)
b = Y1 - (a*X1);
</quite>
jest dobrze policzona
bo jest dobrze policzona (nie chce mi sie sprawdzic to takze:

<quote>
 float a =  (a1/a2);

</quote>

powinno byc zamienione na:

 float a =  (a1/a2);

MitS 2005-01-29 21:54

Mi się przyda :)