Well, I wish I'd seen this discussion back when your originally posted it. I regret that I couldn't reply sooner.
I encountered this problem in my own Delaunay Triangulation (triangle mesh) implementation, including the special case of a triangle with a fictitious vertex.
I think your best solution would be to simply implement your own contains method from scratch. First off, none of the standard polygon classes are going to understand the idea of a fictitious vertex (for everyone else: triangles with fictitious vertices are often used in Delaunay Triangulations to handle the region outside the bounds of the triangle mesh). Second off, because the triangle has special properties (it's always a convex polygon, it has a fixed number of sides), it's easy to code a custom contains() method. For example, simply
test a point against each edge to see if it is on the left or right side of the edge. If you know that the triangle is oriented counterclockwise, then an inside point must lie to the left of each edge (always left or always right, a mix means the point is exterior). If the triangle is clockwise, the point must be to the right. And if you don't know the orientation, just recall that the inside point must be on the same side of each edge. In the case of your fictitious triangle test, you would perform the left/right-side test for the true edge and then try dropping the point down to the edge line to see if lies within the segment. Of course, there are complicating factors in this because an exterior point could lie in the pie-shaped wedge between two exterior border segments.
If you look at the GeometricOperations class in the
Tinfour Project you will find some code related to this computation. In Tinfour, all the triangles are always oriented counterclockwise, so you would have to make adjustments for your own logic.