A note on the dc/dx calculations in the example sources.
[In the text c is used as a template for any variable that will be interpolated
linearly, ie u and v in a linear tmapper and 1/z, u/z and v/z in a perspective
corrected tmapper]
(dc/dx = change in c per change in x, ie horizontal increase value for c)
if p1, p2 and p3 form a triangle with an area > 0 (so that it is neither a
line nor a point) and y1 <= y2 <= y3, then there is a point along the edge
y1->y3 which has y = y2.
Computing XYC for this point gives:
x4 = (x3 - x1) * (y2 - y1) / (y3 - y1) + x1
y4 = y2
c4 = (c3 - c1) * (y2 - y1) / (y3 - y1) + c1
Then computing dc/dx from this gives:
dc/dx = (c4 - c2) / (x4 - x2)
dc/dy along one or two edges will later need to be computed;
dc1/dy1 = (c2 - c1) / (y2 - y1)
dc3/dy3 = (c3 - c2) / (y3 - y2)
or
dc2/dy2 = (c3 - c1) / (y3 - y1)
Taking the expression for dc/dx in the above paragraph and performing a little
formula rewriting gives the following expression:
(c3 - c1) * (y2 - y1) - (c2 - c1) * (y3 - y1)
dc/dx = ---------------------------------------------
(x3 - x1) * (y2 - y1) - (x2 - x1) * (y3 - y1)
Swapping X and Y axes gives dc/dy:
(c3 - c1) * (x2 - x1) - (c2 - c1) * (x3 - x1)
dc/dy = ---------------------------------------------
(y3 - y1) * (x2 - x1) - (y2 - y1) * (x3 - x1)
Rewriting it a tiny bit gives an expression more coherent to dc/dx:
(c2 - c1) * (x3 - x1) - (c3 - c1) * (x2 - x1)
dc/dy = ---------------------------------------------
(x3 - x1) * (y2 - y1) - (x2 - x1) * (y3 - y1)
After this the slopes along the edges can be written as follows instead,
since a step along one of the edges means stepping dx/dy pixels along the x
axis and 1 pixel along the y axis:
(for 2 edges)
dc1/dy1 = dc/dx * dx1/dy1 + dc/dy
dc3/dy3 = dc/dx * dx3/dy3 + dc/dy
(or if it's just 1 edge needing calculation)
dc2/dy2 = dc/dx * dx2/dy2 + dc/dy
One will probably use the "normal" dc/dy formulas though, as they are a
little shorter, yet they provide almost the same accuracy and functionality.
The advantage of the second method is that there are fewer special cases needed
to check for (the dc/dx and dc/dy formulas work correctly even if any of the
yb - ya expressions are 0). Numerical stability is another plus here (when
deltas in Y-direction are very small).
The main disadvantage is that it requires more computations.