Some mixing math

Boudewijn Rempt boud at valdyas.org
Fri Jun 15 21:19:05 CEST 2007


On Friday 15 June 2007, Emanuele Tamponi wrote:
> http://principe.homelinux.net/email.txt
>
> The text of the email is in the previous link. Sorry but it is detected
> as spam!



Let's see whether I fare better :-)

---------------

Hello,
since the dissertations are poor of mathematical details, I've to 
"invent" the equations that describe the behavior of the painterly paintops.

I've had some thoughts these days and I came to this simple set of 
equations... I'd like to know if you agree with the model. Suggestions 
are more than welcome! :) I know that the model is *really* simple, and 
perhaps not realistic, but I don't intend it to be the final one!

Variables:
W_tot = the total amount of water in the brush (liters)
I_tot = the total amount of pigment in the brush (liters)
p(0) = the pressure given by the event
th, ph = the angles of the pen

1) We calculate the "point of maximal pressure", that is, when the 
artist presses the brush over the canvas, the point where the maximal 
pressure is exercised is not the same of p(0). It depends on the angles, 
and on the type of the brush: let's call t_x the coefficient that 
describes this brush property, and (x_e, y_e) the coords of the event, 
and then we have:

x0 = x_p + t_x * cos(ph)
y0 = y_p + t_x * cos(th)

2) We calculate the "radius of the affected area", that is, depending on 
pressure and on a brush property (t_r), the brush will affect a 
different circular area, centered on the point of maximal pressure:

R = t_r * p(0)       now we have the area where we will operate:  x,y in 
the circle of radius R, centered in (x0, y0)

3) Now we have to calculate the pressure on each (x, y) point of the 
area. It's a Gaussian:

p(x, y) = p(0) * exp(-rho^2)      rho^2 = (x - x0)^2 + (y - y0)^2

4) We can consider the friction, that's proportional with the square of 
the the pressure. Let's call t_c the coefficient that describes the 
properties of the canvas about friction, the total force is:

f(x, y) = p(x, y) + t_c*[p(x,y)]^2     (remember that p is in the 
interval [0, 1])

5) The amount of water per pixel is proportional to the total force: we 
can assume that in the brush the amount of water is the same in each point:

w(x, y) = [W_tot / (pi*R^2)] * f(x, y)

5b) After we set the amount of dropped water, we've to recalculate 
W_tot: in my opinion, is more realistic that W_tot doesn't reduce of 
exactly the amount of dropped water, but a bit less: this simulates the 
fact that in reality the brush never dries up completely:

W_tot = W_tot - (W_dropped) / t_w

t_w depends on the brush properties.

6) The amount of pigment dropped is calculated in the same way:

i(x, y) = [I_tot / (pi*R^2)] * f(x, y)
I_tot = I_tot - (I_dropped) / t_i

t_i depends on the brush properties.

7) Here we are: now we know how much water, pigment and pressure we have 
on each pixel! Now, for each pixel, we've to decide if:
   7-1) The color already in the pixel is compatible with the new one
   7-2) The colors are not compatible

Compatibility depends on mixability, viscosity, and wetness of the 
previous color.
In the first case, we sum the amounts of water and pigment, and we sign 
the cell in order to calculate the resulting color when it's the time.
In the second case, we sum the amounts of water and pigment (since 
they're in the canvas cell, anyway!) but we overwrite the old color with 
the new one.

8) Now we have cells with updated amounts of water and pigment: but 
probably they are more than filled of pigment and water, so dripping 
will occur! (btw: it's not the case of the mixer canvas, where we will 
not have dripping, at least in my opinion).
We do dripping this way:

- Start from the (x0,y0) point
- Consider the 8 neighbors and drop water  and pigment on them. I don't 
say "drop equally" because we have to consider 2 things: gravity 
direction, and movement direction.  The cells that are in the direction 
of either gravity or movement will receive more pigment and water. Sign 
them as "visited".
- Do the mixing in the (x0, y0) point and sign it as "visited & mixed".
- Pass to each neighbor and drop the water and pigment on the neighbor 
that are still not "visited". Do the color mix and sign it as "visited 
and mixed".
- Do this recursively and stop when we come to the end of the affected area.

(this domino effect simulates the fact that very wet paint has more 
paint in the borders).


Sorry for the long post, I hope in your feedback :) !

Thanks,
Emanuele




-- 
Boudewijn Rempt 
http://www.valdyas.org/fading/index.cgi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part.
Url : http://mail.kde.org/pipermail/kimageshop/attachments/20070615/ecde9fcd/attachment.pgp 


More information about the kimageshop mailing list