如何在C#中使用结构实现继承(或类似)?我知道抽象结构是不可能的,但我需要实现类似的东西.
我需要它作为结构,因为它必须是一个值类型.我需要继承,因为我需要一个通用数组和方法,我可以保证在那里.
我认为一个例子会有很长的路要走,所以有些代码不能编译,但会显示我想要实现的内容;
abstract struct Vertex
{
abstract int SizeInBytes;
abstract void SetPointers();
}
struct ColorVertex : Vertex
{
Vector3 Position;
Vector4 Color;
override int SizeInBytes //static
{
get { return (3 + 4) * 4; }
}
override void SetVertexPointers() //static
{
...
}
}
class main
{
static void main()
{
Vertex[] verts = new Vertex[3];
for(int i = 0; i < 3; i++)
verts[i] = new ColorVertex();
verts[0].SetVertexPointers(); //should call ColorVertex.SetVertexPointers
externalAPIcall(verts);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我需要值类型的原因是我可以创建它们的数组,并将其作为顶点缓冲区传递给OpenGL.为此,数据需要直接包含在此数组中.
如果这根本无法实现,我会感到惊讶.
在C#中是否可以创建一个未指定泛型类型的数组?有点像这样:
ShaderParam<>[] params = new ShaderParam<>[5];
params[0] = new ShaderParam<float>();
Run Code Online (Sandbox Code Playgroud)
或者这是不可能的,因为C#强大的打字?
我需要编写一些代码来将四元组数组转换为体素字段.让它工作应该很容易,但快速实现并不是那么微不足道.
有谁知道我可以使用的任何库或源代码?我敢肯定以前有人必须这样做.
编辑: 算法也需要用体素填充模型的内部.只是一个shell不会这样做.
对于任何b,可以快速计算函数a = 2 ^ b a = 1 << b.那么反过来说,为任何给定的a获得b的值?它应该相对较快,因此日志是不可能的.任何不是O(1)的东西也都很糟糕.
我很高兴能不能做到,如果它根本不可能太没有记录或搜索类的事情.
我有一大堆3D数据点,我想要适合椭圆体.
我的数学很差,所以我在没有任何数学库的情况下无法实现最小二乘法.
有没有人知道或者有一段代码可以将椭球放到数据中,我可以直接插入到我的项目中?在C中最好,但是从C++,Java,C#,python等转换对我来说应该没问题.
编辑:能够找到该中心也将是一个巨大的帮助.请注意,这些点的间距不均匀,因此取平均值不会产生中心.
我想测试射线与体素场的交叉点.
我可以通过计算与当前体素边缘的光线盒交点来天真地爬过体素场,然后对下一个体素做同样的操作,直到我碰到某个东西.但是没有更快的方法来追踪体素场吗?我正在思考Bresenham的 3D 线条算法,这可以很快地给出给定线条相交的所有单元格.有人这样做过吗?
由于certian限制以及这些光线跟踪不经常发生的事实,我不想构建八叉树或任何其他数据结构.
我正在C#中实现一个非托管数组类,我需要一些OpenGL调用.
这很好,但我遇到了障碍.以下代码无法编译,我理解为什么,但我怎样才能使它工作?
public T this[int i]
{
get { return *((T*)arrayPtr + i); }
set { *((T*)arrayPtr + i) = value; }
}
Run Code Online (Sandbox Code Playgroud)
我认为如果我确保T是一个结构,它可能会起作用
unsafe class FixedArray<T> where T : struct
Run Code Online (Sandbox Code Playgroud)
也不起作用......
我怎样才能在功能上等同于我上面要做的事情?
编辑:我正在使用Marshal.AllocHGlobal()的非托管数组,以便我的数组被修复,GC不会移动它.当你调用它时,OpenGL实际上并不处理指令,OpenGL将在函数返回后很长时间内尝试访问数组.
如果有帮助,这就是整个班级:
unsafe class FixedArray<T> where T : struct
{
IntPtr arrayPtr;
public T this[int i]
{
get { return *((T*)arrayPtr + i); }
set { *((T*)arrayPtr + i) = value; }
}
public FixedArray(int length)
{
arrayPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(T)) * length);
}
~FixedArray()
{
Marshal.FreeHGlobal(arrayPtr);
} …Run Code Online (Sandbox Code Playgroud) 对于海洋着色器,我需要一个快速函数来计算sin(x)的非常近似的值.唯一的要求是它是周期性的,大致类似于正弦波.
泰勒系列的罪太慢了,因为我需要计算高达x的9次幂才能获得一个完整的时期.
有什么建议?
编辑:对不起,我没有提到,我不能使用查找表,因为这是在顶点着色器上.查找表将涉及纹理样本,其在顶点着色器上比内置的sin函数慢.它不必以任何方式准确,它只是看起来不错.
我有一个float4x4结构,它只包含16个浮点数:
struct float4x4
{
public float M11; public float M12; public float M13; public float M14;
public float M21; public float M22; public float M23; public float M24;
public float M31; public float M32; public float M33; public float M34;
public float M41; public float M42; public float M43; public float M44;
}
Run Code Online (Sandbox Code Playgroud)
我想将这些结构的数组复制到一大堆浮点数中.据我所知,这是一块内存的1:1副本
我所知道的是相当丑陋,而不是那么快:
int n = 0;
for (int i = 0; i < Length; i++)
{
array[n++] = value[i].M11;
array[n++] = value[i].M12;
array[n++] = value[i].M13;
array[n++] = …Run Code Online (Sandbox Code Playgroud) 我们使用node-soap创建 SOAP 客户端来与外部 Web 服务交互。
尽管我们包含了包含完整架构的 wsdls,但并未对请求进行任何验证。不幸的是,验证失败时外部服务器的错误消息根本没有帮助。
有没有办法使用 node-soap 根据 wsdl 中定义的模式验证请求?或者我是否必须使用libxml-xsd之类的东西并自己进行验证?
根据这个问题,客户端有一个“Validate”方法,但在最新版本中似乎没有。