EDIT: This is a library error. I reported it to HOpenGL's mailing list.
I use a 9-point rectangular method to represent a circle / ellipse as NURBS.
Points p1, p2, ..., p9 , p9 = p1 . They lie as shown:
y2 | p2 p3 p4 y1 | p1 p5 y0 | p8 p7 p6 ------------- | x0 x1 x2 x1 = (x0 + x2) / 2 y1 = (y0 + y2) / 2
those. p1 = (x0, y1), p2 = (x0, y2) , etc.
And weights:
1 for midpoints ( p1,p3,p5,p7 )sqrt(0.5) for corner points ( p2,p4,p6,p8 )
I applied weights as uniform coordinates using two methods:
- right -
(x,y) with a weight w becomes Vertex4 (w*x) (w*y) 0 w - wrong - it becomes
Vertex4 xy 0 w
Results (first, secondly, sorry if they are too big): 

You see that both are not correct circles (although the second one looks good), and I cannot understand why.
Here is the code based on Lines.hs from GLUT examples:
import System.Exit ( exitWith, ExitCode(ExitSuccess) ) import Graphics.UI.GLUT import Foreign.Marshal.Array import Graphics.Rendering.OpenGL.GLU.NURBS myInit :: IO () myInit = do clearColor $= Color4 0 0 0 0 display :: DisplayCallback display = do clear [ ColorBuffer, DepthBuffer ] color (Color3 1.0 1.0 1.0 :: Color3 GLfloat) withNURBSObj () $ \nurbsObj -> do nurbsBeginEndCurve nurbsObj $ withArrayLen knots $ \nKnots knots -> withArray controls $ \controls -> do nurbsCurve nurbsObj (fromIntegral nKnots) knots stride controls order flush where order = 3 stride = 4 -- number of floats in Vertex controls = zipWith mkControl points weights mkControl (x, y) w = Vertex4 (x*w) (y*w) 0 w -- mkControl (x, y) w = Vertex4 xy 0 w knots = [0, 0, 0, 0.25, 0.25, 0.5, 0.5, 0.75, 0.75, 1, 1, 1] weights = let a = sqrt 0.5 in [1, a, 1, a, 1, a, 1, a, 1] points = [ (x0, y1), (x0, y2), (x1, y2), (x2, y2), (x2, y1), (x2, y0), (x1, y0), (x0, y0), (x0, y1) ] y1 = (y0 + y2) / 2 x1 = (x0 + x2) / 2 (x0, x2) = (50, 450) (y0, y2) = (x0, x2) reshape :: ReshapeCallback reshape size@ (Size wh) = do viewport $= (Position 0 0, size) matrixMode $= Projection loadIdentity ortho2D 0 (fromIntegral w) 0 (fromIntegral h) -- the following line is not in the original example, but it good style... matrixMode $= Modelview 0 keyboard :: KeyboardMouseCallback keyboard (Char '\27') Down _ _ = exitWith ExitSuccess keyboard _ _ _ _ = return () -- Request double buffer display mode. -- Register mouse input callback functions main :: IO () main = do (progName, _args) <- getArgsAndInitialize initialDisplayMode $= [ SingleBuffered, RGBMode ] initialWindowSize $= Size 500 500 initialWindowPosition $= Position 100 100 createWindow "Test" myInit displayCallback $= display reshapeCallback $= Just reshape keyboardMouseCallback $= Just keyboard mainLoop
EDIT: I checked the coefficients several times, and before the rectangular representation I used the 7-point triangular method, and there were very similar distortions. Thus, this will not be a problem with a specific view.