locked
The precision of numbers is lost when initializing Gdiplus::PointF class instanse. RRS feed

  • Question

  • Hello. For drawing lines (edges of triangles) I use the following GDI+ function:

    Status DrawLine(
      IN const Pen      *pen,
      IN const PointF & pt1,
      IN const PointF & pt2
    );

    I have the structure that I use.

    // Represents the edge of a triangle that is part of the set 
    // of triangles drawn in the application window that make up
    // the triangulation mesh.
    struct EdgeToDraw
    {
    	EdgeToDraw() {}
    
    	EdgeToDraw(long X_begin, long Y_begin, long X_end, long Y_end)
    	{
    		Begin.X = X_begin;
    		Begin.Y = Y_begin;
    		End.X = X_end;
    		End.Y = Y_end;
    	}
    	// X and Y coordinates of begin edge vertex.
    	PointF Begin;
    	// X and Y coordinates of end edge vertex.
    	PointF End;
    };

    The thread of constructing a triangulation places the coordinates of the edges in the concurrent_queue container

    concurrent_queue<EdgeToDraw> MeshEdgesBuffer;

    and another thread takes them from there (in WndProc WM_PAINT) in order to draw. Below I show how I put instances of EdgeToDraw in a concurrent_queue container.

    // Add an edge for the drawn triangulation mesh.
    MeshEdgesBuffer.push(EdgeToDraw(X_begin, Y_begin, X_end, Y_end));
    But here, the accuracy of the added values is lost. For example if X_begin == -0.522 and Y_begin == 2.169 (where X_begin and Y_begin have double type), then MeshEdgesBuffer[0].Begin.X == 0 and MeshEdgesBuffer[0].Begin.Y == 2. And so on. But for me, the numbers to the right of the decimal point are very important. Highly. As I understand it, the PointF class is specifically designed to express coordinates with decimal point values. Please tell me what I am doing wrong and how can I make sure that the accuracy of numbers is not lost? That is, if X_begin == -0.522, then Begin.X is of the same value (-0.522) but not is 0 or 0.000. Thank you in advance.



    Saturday, March 14, 2020 3:56 PM

Answers

  • The EdgeToDraw constructor takes long variables (an integer type), not doubles.  Your values will be truncated.
    • Marked as answer by Purple_Apple Saturday, March 14, 2020 4:42 PM
    Saturday, March 14, 2020 4:10 PM
  • I bag your pardon. I've got mistake in types (long inside double). Excuse me please.
    • Marked as answer by Purple_Apple Saturday, March 14, 2020 4:12 PM
    Saturday, March 14, 2020 4:12 PM

All replies

  • The EdgeToDraw constructor takes long variables (an integer type), not doubles.  Your values will be truncated.
    • Marked as answer by Purple_Apple Saturday, March 14, 2020 4:42 PM
    Saturday, March 14, 2020 4:10 PM
  • I bag your pardon. I've got mistake in types (long inside double). Excuse me please.
    • Marked as answer by Purple_Apple Saturday, March 14, 2020 4:12 PM
    Saturday, March 14, 2020 4:12 PM
  • Yes, yes it's my fault. I was a little tired in the evening and because of this, inattention appeared. Thank you very much.
    Saturday, March 14, 2020 4:42 PM