Wed
14
Jan 2009
W programowaniu bardzo często stosuje się funkcję liniową lub kwadratową. Przykładowo, jeśli mgła ma się zaczynać w głębokości Min i kończyć w głębokości Max, to jej intensywość od głębokości można wyrazić prostym wzorem:
FogIntensity = saturate(Depth * FogScale + FogBias);
Problem w tym, żeby znaleźć współczynniki tej funkcji. Do tego przydają się wzory, które wyliczają współczynniki dla funkcji przechodzącej przez dane punkty. Potrafi to robić mój GameDev Calc, ale żeby policzyć je w swoim programie albo na kartce, warto mieć pod ręką te wzory.
Funkcja liniowa
przechodząca przez dwa punkty (x1, y1), (x2, y2) ma wzór:

Co w przełożeniu na kod daje:
float W = p2.x - p1.x; if (W == 0.f) Error(); float a = (p2.y - p1.y) / W; float b = (p2.x * p1.y - p2.y * p1.x) / W;
Z kolei funkcja kwadratowa
przechodząca przez trzy punkty (x1, y1), (x2, y2), (x3, y3) ma wzór:

Co daje trochę dłuższy kod:
float x1 = p1.x, x2 = p2.x, x3 = p3.x; float y1 = p1.y, y2 = p2.y, y3 = p3.y; float W = x1 * x1 * x2 + x3 * x3 * x1 + x2 * x2 * x3 - x1 * x1 * x3 - x2 * x2 * x1 - x3 * x3 * x2; if (W == 0.f) Error(); float a = y1 * x2 + y3 * x1 + y2 * x3 - y1 * x3 - y2 * x1 - y3 * x2; float b = x1 * x1 * y2 + x3 * x3 * y1 + x2 * x2 * y3 - x1 * x1 * y3 - x2 * x2 * y1 - x3 * x3 * y2; float c = x1 * x1 * x2 * y3 + x3 * x3 * x1 * y2 + x2 * x2 * x3 * y1 - x1 * x1 * x3 * y2 - x2 * x2 * x1 * y3 - x3 * x3 * x2 * y1; a /= W; b /= W; c /= W;