编辑:这是一个库错误。我reported到HOpenGL邮件列表。
我使用9点矩形方法将圆/椭圆表示为NURBS。
积分为p1, p2, ..., p9
,p9 = p1
。他们如图所示:
y2 | p2 p3 p4
y1 | p1 p5
y0 | p8 p7 p6
-------------
| x0 x1 x2
x1 = (x0 + x2) / 2
y1 = (y0 + y2) / 2
即。 p1 = (x0, y1), p2 = (x0, y2)
等等。
权重是:
1
表示中间点(p1,p3,p5,p7
)sqrt(0.5)
代表角点(p2,p4,p6,p8
)我使用两种方式将权重应用为齐次坐标:
(x,y)
,重量w
变为Vertex4 (w*x) (w*y) 0 w
Vertex4 x y 0 w
结果(右边第一个,错误第二个,抱歉,如果它们太大):
你看,两个都不是正确的圈子(虽然第二个看起来不错)但我无法理解为什么。
以下代码基于GLUT示例中的Lines.hs
:
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 x y 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 w h) = 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's 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
编辑:我多次重新检查系数,在矩形表示之前我使用了7点三角形方法,并且存在非常相似的失真。所以它不应该是具体表现的问题。
答案 0 :(得分:5)
好的,我的第一个回答是暂时失误。无论如何,你的代码中根本没有错误:如果我编译并执行给定的代码,我得到这个:
我怀疑,Haskell安装中的某些内容已损坏。
由于评论而编辑:
现在这很奇怪......
我正在使用Gentoo,因此我的系统通过Portage系统提供Haskell OpenGL模块。因此我明白了:
loki ~ # for p in OpenGL OpenGLRaw GLURaw; do ghc-pkg latest $p; done
OpenGL-2.2.1.1
ghc-pkg: cannot find package OpenGLRaw
ghc-pkg: cannot find package GLURaw
所以我将带有cabal的OpenGL和GLUT模块安装到我的homedir中:
datenwolf@loki ~ $ for p in OpenGL OpenGLRaw GLURaw; do ghc-pkg latest $p; done
OpenGL-2.4.0.1
OpenGLRaw-1.1.0.1
GLURaw-1.1.0.0
安装完毕后,我可以重现您的第一张照片!