The first thing you will have to do is to define exactly what you mean by "common" area! This isn't that trivial as it may look. It would utilize either vector definitions or boolean expressions.
Take a simple triangle ABC for instance. AB=c being horizontal, A to the left, C being above c. You may think its clear where the "inside" or common area is but you would have to define it. In our case you could create an oriented path ABC, counterclockwise and define the the "inner side" is the direction of the normal vector which we get when we turn the tangent vector counter clockwise, considering the oriented path ABC.
You may also define an "inside" orientation for each function: Inside is to the right (clockwise normal vector) of a and b (if we go from left to right) and to the left of c. But then, why the change in orientation of c? This will be different if the position of the triangle changes.
Another approach can be using boolean expressions which comes especially natural for a task like linear optimization.
Once you have defined what common area means it should not be that difficult to write a routine which determines and hatches it automatically, but I guess you will have to deal with a lot of special cases.
Anyway, concerning the hatching, the provided links should get you up an running.
Good luck and Merry Christmas!