你好同胞Overflowers。我正在开发一个小组项目来创建一个绘制3D场景的2D渲染的光线跟踪器。我目前正在进行的任务涉及对象(形状)的矩阵变换,需要移动,镜像,剪切等。F#:没有发现与此覆盖对应的抽象属性
在处理形状时,我们选择实现一个接口来定义一个命中函数的类型。这种命中功能是在每个形状中定义的,例如球体,盒子,平面等。当转换一个形状时,我需要转换命中形状的射线,以及做这些的方式似乎是用更高阶的函数来改变原始形状打功能。
为了做到这一点,我已经实现的功能transformHitFunction,这似乎工作,但新类型transformedShape,实现了Shape接口,是给我的错误
没有抽象的财产被发现对应于此覆盖
这对我来说没有任何意义,因为它与其他同类型的命中功能一起工作。任何人都可以发现什么是错的?
我试图去除与此问题无关的所有模块,名称空间和代码。
type Transformation = Matrix of float [,]
type Vector =
| V of float * float * float
let mkVector x y z = V(x, y, z)
let vgetX (V(x,_,_)) = x
let vgetY (V(_,y,_)) = y
let vgetZ (V(_,_,z)) = z
type Point =
| P of float * float * float
let mkPoint x y z = P(x, y, z)
let pgetX (P(x,_,_)) = x
let pgetY (P(_,y,_)) = y
let pgetZ (P(_,_,z)) = z
type Material = Material
type Texture =
| T of (float -> float -> Material)
type Shape =
abstract member hit: Point * Vector -> (Texture*float*Vector) option
let transformPoint (p:Point) t =
match t with
| Matrix m -> mkPoint ((pgetX(p))*m.[0,0] + (pgetY(p))*m.[0,1] + (pgetZ(p))*m.[0,2] + m.[0,3])
((pgetX(p))*m.[1,0] + (pgetY(p))*m.[1,1] + (pgetZ(p))*m.[1,2] + m.[1,3])
((pgetX(p))*m.[2,0] + (pgetY(p))*m.[2,1] + (pgetZ(p))*m.[2,2] + m.[2,3])
let transformVector (v:Vector) t =
match t with
| Matrix m -> mkVector ((vgetX(v))*m.[0,0] + (vgetY(v))*m.[0,1] + (vgetZ(v))*m.[0,2] + m.[0,3])
((vgetX(v))*m.[1,0] + (vgetY(v))*m.[1,1] + (vgetZ(v))*m.[1,2] + m.[1,3])
((vgetX(v))*m.[2,0] + (vgetY(v))*m.[2,1] + (vgetZ(v))*m.[2,2] + m.[2,3])
let transformHitFunction fn (t:Transformation) =
fun (p:Point,v:Vector) ->
let tp = transformPoint p t
let tv = transformVector v t
match fn(tp,tv) with
| None -> None
| Some (tex:Texture, d:float, n) -> let tn = transformVector n t
Some (tex, d, tn)
type transformedShape (sh:Shape, t:Transformation) =
interface Shape with
member this.hit = transformHitFunction sh.hit t
'this.hit'是不是一个真正的功能 - 它需要采取一些参数 –
只是承认,你写了这一切与能够编写'sh.hit'单一目的; ) –
该死的,我被抓住了!我甚至试图隐藏它额外的... –