I have a rectangle(width == height) which was located in a very far place from origin. When I perform the zoom extend(a sequence of transformation ) I am able to project the rectangle to the center of the screen but the display of rectangle is awful(the width and the height of the rectangle is different when display in the screen). For example:
Point3DList temPList = new Point3DList();
temPList.Add(new Point3D(-10, -10, 0));
temPList.Add(new Point3D(10, -10, 0));
temPList.Add(new Point3D(10, 10, 0));
temPList.Add(new Point3D(-10, 10, 0));
sdPolyline poliline = AddPolyline(temPList);
// move the rectangle to very far from the origin.
poliline.Move(new Point3D(-71000000, 12000000, 0));
It appears that you have a precision problem. Even if you’re using doubles for your Point3D (this is unclear), current OpenGL implementations use 32 bit floating point values for vertex positions. The farther you move your points, the less precise they will be.
Solution: Stop moving your points so far.
If you have widely separated items, use different local coordinate systems for each (stored using double precision), transform your view location (again, double precision) and other models (if desired) into the closest local coordinate system and draw your model from there. Your precision loss will then be mostly in the far away objects where it will be less noticeable.
In your case you only need to be concerned with storing the position in higher precision. Instead of moving the polyline by adding some value to each of the points, store the position of the polyline in addition to the coordinates. When it comes time to draw the polyline, find the relative position between the eye and the polyline and call glTranslate with that value.