2011-09-15 6 views
0

変換行列をとる.transform()メソッド(オブジェクト、テクスチャ、カメラなど)を実装するレイ・トレーサのPythonバインディングにはいくつかのクラスがあります。私はこれらのクラスにすべて.scale()、.rotate()などを実装させ、self.transform(...)を呼び出す一般的な実装を共有したいと思います。これを行う1つの方法は、これらのメソッドとその実装を提供する_Transformableクラスを継承することです。しかし、Cythonの "拡張タイプ"は複数の継承をサポートしていないので、すでに継承しているタイプでは機能しません。継承のないCythonでのメソッド実装の共有

Cythonはcdefクラスのデコレータもサポートしていないため、 "@_transformable"デコレータも動作しません。私は彼らがメタクラスをサポートしているとは思わない。何か案は?

メソッドがグローバルscale()/ rotate()/ etcからdocstringを継承できる場合は、ボーナスポイントを指定します。関数(matriciesを返す)

編集:ここでは何が起こっているかの目安を与えるthe fileの抜粋です:

def translate(*args, **kwargs): 
    """ 
    Return a translation. 

    Accepts the same arguments that Vector(...) does. 
    """ 
    return _Matrix(dmnsn_translation_matrix(Vector(*args, **kwargs)._v)) 

cdef class Pigment: 
    """Object surface coloring.""" 
    cdef dmnsn_pigment *_pigment 

    # ... 

    def transform(self, Matrix trans not None): 
    """Transform a pigment.""" 
    self._pigment.trans = dmnsn_matrix_mul(trans._m, self._pigment.trans) 
    return self 

継承ソリューションは、次のようになります。

cdef class _Transformable: 
    def scale(self, *args, **kwargs): 
    return self.transform(scale(*args, **kwargs)) 
    def translate(self, *args, **kwargs): 
    return self.transform(translate(*args, **kwargs)) 
    def rotate(self, *args, **kwargs): 
    return self.transform(rotate(*args, **kwargs)) 

答えて

0

あなたの変形はdo_everythingになりそうです。 構図は、サイホンコードとアーキテクチュアという意味でのIMHOです。 参照:良い説明はthis articleです。IIRC、Blenderはこのアーキテクチャを使用しているため、実行したいことと非常によく似ています。 (ちょっとしたコードを投稿して、私が心に留めていることの具体的な例を教えてもらえますか?)

明らかに、これはコードベースのサイズと、それを管理するコントロールによって異なります。

+1

パーマリンクのスペルが間違っています。私は編集を提出しました。 http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ – forivall

関連する問題