C/C++ FAQ

Znajdowanie wzoru funkcji liniowej

Krecik

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;
  }
}
FAQ

9 komentarzy

Przecież to jest źle przekształcone:

a(X1-X2) = (Y1-Y2) / :(X1-X2)
a = (X1-X2) / (Y1-Y2)

Powinno być :
a = (Y1-Y2) / (X1-X2)

Można to było wyprowadzić tak:
|x1 1|
Wg = | | = x11 - x21 = 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

@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;
  }
}

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

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

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

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:

float a =  (a1/a2);

powinno byc zamienione na:

 float a =  (a1/a2);

Mi się przyda :)