見出し画像

サブディビジョンサーフェスとNURBS

私自身、このパターンをどう応用するのかについて、いや、もう基本的な意味合いすらわかりません。ですが、幾何学を取り込んだプログラミング言語のくせに3Dモデリングが内包されていないなんて、変だろ。というわけで。無理くりねじこんでみました。
これでのデモがおもいついたら、また、クラウドのアーティファクト貼り付けます。
どうなるかはわかりませんが。

space GeometricSurfaces {
    properties {
        continuous: Topology<Boolean> = true
        differentiable: Topology<Boolean> = true
    }
    
    shape SubdivisionSurface<T> {
        properties {
            control_points: Collection<Point<T>>
            subdivision_level: Number
            boundary_conditions: Collection<Constraint>
        }
        
        mapping subdivide() {
            properties {
                topology_preserving: Boolean = true
                smooth: Boolean = true
            }
            
            path {
                verify_mesh_topology ->
                compute_new_vertices ->
                update_connectivity ->
                smooth_surface ->
                verify_continuity
            }
        }
        
        mapping evaluate_point(u: Number, v: Number) {
            properties {
                continuous: Boolean = true
            }
            
            path {
                locate_patch ->
                compute_basis_functions ->
                blend_control_points ->
                return_surface_point
            }
        }
    }
    
    shape NURBSSurface<T> {
        properties {
            control_points: Collection<Point<T>>
            weights: Collection<Number>
            knot_vectors: Collection<Collection<Number>>
            degree: Collection<Number>
        }
        
        mapping evaluate() {
            properties {
                rational: Boolean = true
                continuous: Boolean = true
            }
            
            path {
                compute_basis_functions ->
                apply_weights ->
                blend_control_points ->
                normalize_rational ->
                verify_continuity
            }
        }
        
        mapping refine() {
            properties {
                topology_preserving: Boolean = true
            }
            
            path {
                insert_knots ->
                update_control_points ->
                maintain_shape ->
                verify_parametrization
            }
        }
    }
    
    // Common operations for both surface types
    mapping transform<S: Surface>() {
        properties {
            continuous: Boolean = true
            invertible: Boolean = true
        }
        
        path {
            validate_transform ->
            apply_to_control_points ->
            maintain_weights ->
            preserve_parameterization ->
            verify_topology
        }
    }
}