[sdf] Add function to resolve corner distances.

* src/sdf/ftsdf.c (resolve_corner): New function.
This commit is contained in:
Anuj Verma 2020-08-18 10:28:16 +05:30 committed by Werner Lemberg
parent a255125fe4
commit c918b54f25
2 changed files with 110 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2020-08-18 Anuj Verma <anujv@iitbhilai.ac.in>
[sdf] Add function to resolve corner distances.
* src/sdf/ftsdf.c (resolve_corner): New function.
2020-08-18 Anuj Verma <anujv@iitbhilai.ac.in>
[sdf] Add essential math functions.

View File

@ -1556,4 +1556,108 @@
#endif /* !USE_NEWTON_FOR_CONIC */
/*************************************************************************/
/*************************************************************************/
/** **/
/** RASTERIZER **/
/** **/
/*************************************************************************/
/*************************************************************************/
/**************************************************************************
*
* @Function:
* resolve_corner
*
* @Description:
* At some places on the grid two edges can give opposite directions;
* this happens when the closest point is on one of the endpoint. In
* that case we need to check the proper sign.
*
* This can be visualized by an example:
*
* ```
* x
*
* o
* ^ \
* / \
* / \
* (a) / \ (b)
* / \
* / \
* / v
* ```
*
* Suppose `x` is the point whose shortest distance from an arbitrary
* contour we want to find out. It is clear that `o` is the nearest
* point on the contour. Now to determine the sign we do a cross
* product of the shortest distance vector and the edge direction, i.e.,
*
* ```
* => sign = cross(x - o, direction(a))
* ```
*
* Using the right hand thumb rule we can see that the sign will be
* positive.
*
* If we use `b', however, we have
*
* ```
* => sign = cross(x - o, direction(b))
* ```
*
* In this case the sign will be negative. To determine the correct
* sign we thus divide the plane in two halves and check which plane the
* point lies in.
*
* ```
* |
* x |
* |
* o
* ^|\
* / | \
* / | \
* (a) / | \ (b)
* / | \
* / \
* / v
* ```
*
* We can see that `x` lies in the plane of `a`, so we take the sign
* determined by `a`. This test can be easily done by calculating the
* orthogonality and taking the greater one.
*
* The orthogonality is simply the sinus of the two vectors (i.e.,
* x - o) and the corresponding direction. We efficiently pre-compute
* the orthogonality with the corresponding `get_min_distance_`
* functions.
*
* @Input:
* sdf1 ::
* First signed distance (can be any of `a` or `b`).
*
* sdf1 ::
* Second signed distance (can be any of `a` or `b`).
*
* @Return:
* The correct signed distance, which is computed by using the above
* algorithm.
*
* @Note:
* The function does not care about the actual distance, it simply
* returns the signed distance which has a larger cross product. As a
* consequence, this function should not be used if the two distances
* are fairly apart. In that case simply use the signed distance with
* a shorter absolute distance.
*
*/
static SDF_Signed_Distance
resolve_corner( SDF_Signed_Distance sdf1,
SDF_Signed_Distance sdf2 )
{
return FT_ABS( sdf1.cross ) > FT_ABS( sdf2.cross ) ? sdf1 : sdf2;
}
/* END */