小编Spa*_*ace的帖子

复制原型继承?

我正在玩JavaScript,特别是使用类和诸如此类的模拟面向对象编程.

我知道这种实现继承的方式

MyClass.prototype = new AnotherClass();
Run Code Online (Sandbox Code Playgroud)

但我不满意,我不喜欢我需要如何调用构造函数AnotherClass.所以我一直在玩,我想出了一些似乎有用的东西,基本上想要第二个意见.

function clone (obj)
{
    function CloneFactory () {}
    CloneFactory.prototype = obj;

    return new CloneFactory();
}

MyClass.prototype = clone(AnotherClass.prototype);
Run Code Online (Sandbox Code Playgroud)

通过克隆原型,我们得到它的新副本并将其分配给MyClass原型,以便更改继承的属性不会影响父类的原型属性.像这样会MyClass.prototype = AnotherClass.prototype.

我运行压力测试,这在某些情况下更有效,即在父的构造函数中有很多代码时,否则它们大致相同.另一个好处(或者至少我认为它是有益的)是它允许在某种程度上隐藏子类的信息.任何特权方法和成员都不会被继承.

我忽视了一些重大陷阱吗?

我不是JavaScript专家,实际上我对JavaScript很新,所以我想对此有第二意见,因为我似乎无法通过Google找到任何东西.我不想实现糟糕的代码:)!

javascript inheritance

17
推荐指数
1
解决办法
2万
查看次数

效率:递归与循环

这只是我的好奇心,但更有效,递归还是循环呢?

给定两个函数(使用常见的lisp):

(defun factorial_recursion (x)
    (if (> x 0)
        (* x (factorial_recursion (decf x)))
        1))
Run Code Online (Sandbox Code Playgroud)

(defun factorial_loop (x)
    (loop for i from 1 to x for result = 1 then
        (* result i) finally
        (return result)))
Run Code Online (Sandbox Code Playgroud)

哪个更有效率?

recursion performance common-lisp

14
推荐指数
3
解决办法
2万
查看次数

在OpenGL中快速绘制许多相同的对象

所以我正在开发一款游戏,我需要绘制很多相同的对象.相同的形状,相同的尺寸,相同的颜色,只是不同的位置.

现在我的设置是这样的.

我有一些类Renderer,想要在屏幕上绘制的对象可以调用static void addVertex(float x, float y, float z);哪个将顶点存储到一个std::vector.当每个人都完成绘图时static void draw();,Renderer调用所有东西都塞进VBO并绘制到屏幕上.

绘制看起来像这样:

void Renderer::draw() {
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, _quadID);
    glBufferSubDataARB(GL_QUADS, 0, _vertexBuffer.dataSize(), _vertexBuffer.toArray());

    glColorPointer(4, GL_FLOAT, 0, _colorBuffer.toArray());

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, _vertexBuffer.toArray());

    glDrawArrays(GL_QUADS, 0, (_vertexBuffer.size() / 3));
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);

    _vertexBuffer.clear();
    _colorBuffer.clear();
}
Run Code Online (Sandbox Code Playgroud)

为了我的目的或多或少地管理的课程的地点_vertexBuffer和地点._colorBuffertemplate <class T> Bufferstd::vector<T>

通过这种设置,我可以在开始放慢速度之前在屏幕上获得大约300个内容.现在一切都是GL_QUAD.请记住,我对OpenGL有点新鲜,如果以上是令人尴尬的,我很抱歉.

我怎样才能改善这一点来解释相似的多边形?

c++ opengl

13
推荐指数
1
解决办法
9710
查看次数

大括号语言中的"Lisp Style"缩进

我想知道人们对使用Lisp缩进样式对C++,Java,JavaScript等语言的看法.我一直都是Python的粉丝以及如何在没有括号的情况下进行格式化.它对我来说非常紧凑和干净.我想知道用大括号语言做类似的事情是不是一个好主意.我最近一直在用JavaScript工作,所以我将以JavaScript为例.

通常,我使用这样的东西,例如

function doStuff (stuff1, stuff2) {
    if (stuff1 === stuff2) {
        doMoreStuff();
        doEvenMoreStuff();
    }
    else {
        takeABreak();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将成为

function doStuff (stuff1, stuff2) {
    if (stuff1 === stuff2) {
        doMoreStuff();
        doEvenMoreStuff(); }
    else {
        takeABreak(); } }
Run Code Online (Sandbox Code Playgroud)

这是紧凑的,并且更多地集中在缩进而不是像Python这样的大括号.Lisp并不是一个特别漂亮的语言,但我有点喜欢这个,并且不认为它看起来太糟糕了,虽然当你有很多嵌套块同时结束时,事情会变得有点毛茸茸.我想要第二个意见.也许我不应该尝试在JavaScript中编写Python代码?

coding-style indentation

5
推荐指数
1
解决办法
992
查看次数

多边形碰撞检测实现

我正在尝试编写我自己的分离轴定理的实现,但是我很难让它按照我的要求准确地工作.我不能肯定地说,但是当形状周围的假想盒子像第一个形状碰撞时,它看起来就像是在发生碰撞.但第二种形状完美无缺.

这是方形的顶点数据(精确坐标):

vertsx = [ 200, 220, 220, 200 ]
vertsy = [ 220, 220, 200, 200 ]
Run Code Online (Sandbox Code Playgroud)

这是测试形状1(相对于鼠标)的顶点数据:

vertsx = [ -10,   0,  10, 10, -10 ]
vertsy = [ -10, -50, -10, 10,  10 ]
Run Code Online (Sandbox Code Playgroud)

最后这里是测试形状2(相对于鼠标)的顶点数据:

vertsx = [ -10,   0,  10, 10, -10 ]
vertsy = [ -10, -20, -10, 10,  10 ]
Run Code Online (Sandbox Code Playgroud)

仅为了澄清,已翻译的坐标是经过测试的坐标,这些坐标的形状已按照所示的坐标进行测试.

在此输入图像描述

这是实际的功能.

function collisionConvexPolygon ( vertsax, vertsay, vertsbx, vertsby ) {
    var alen = vertsax.length;
    var blen = vertsbx.length;
    // Loop for axes in …
Run Code Online (Sandbox Code Playgroud)

javascript algorithm polygons

4
推荐指数
1
解决办法
1743
查看次数

Opengl 2D性能提示

我正在开发一款东方风格的子弹地狱射击游戏.屏幕将完全充满子弹(所以实例化是我想要的),但我希望这可以在较旧的硬件上工作,所以我现在正在做一些事情,没有颜色,纹理,直到我弄清楚这一点.

glVertexPointer(3, GL_FLOAT, 0, SQUARE_VERTICES);
for (int i = 0; i < info.centers.size(); i += 3) {
    glPushMatrix();
    glTranslatef(info.centers.get(i), info.centers.get(i + 1), info.centers.get(i + 2));
    glScalef(info.sizes.get(i), info.sizes.get(i + 1), info.sizes.get(i + 2));
    glDrawElements(GL_QUADS, 4, GL_UNSIGNED_SHORT, SQUARE_INDICES);
    glPopMatrix();
}
Run Code Online (Sandbox Code Playgroud)

因为我希望这可以在旧硬件上工作,我试图避免着色器和诸如此类的东西.那里的设置让我失去了大约80个多边形.我希望从中得到至少几百个.info是一个结构,它具有渲染的所有好处,除了一些向量之外没什么.

我对OpenGL很陌生,但我至少听过并尝试过所有可以完成的事情,但并不是说我对它很好.这个游戏是一个2D游戏,我从SDL切换到Opengl,因为它可以让一些更好的效果更容易.显然,SDL的工作方式不同,但我从未遇到过这个问题.

归结为此,我显然在这里做错了,那么如何才能正确实现旧硬件(OpenGL 1.x)的实例化呢?另外,给我任何提高性能的提示.

c++ opengl

3
推荐指数
1
解决办法
1903
查看次数

除了班级以外,每个人都有不变,有这样的事吗?

我一直想知道有没有办法让一个类成员不使用只能被它的类修改的getter?

我在想的是这样的.

class A 
{
    public:
        crazyconst int x;

        void doStuff()
        {
             // Gettin' stuff done
             x = someValue; // OK
        }
};

int main(int argc, char** argv)
{
     A a;
     a.x = 4; // ERROR
}
Run Code Online (Sandbox Code Playgroud)

所以它是可见的,但对于班级旁边的每个人来说都是只读的.

c++ oop

2
推荐指数
1
解决办法
84
查看次数

虚拟轨迹球实施

在过去的几天里,我一直在尝试为用户界面制作虚拟轨迹球,以实现类似3D图形的程序.但我遇到了麻烦.

看看数字和许多测试,问题似乎是我的四元数的实际连接,但我不知道或不这么认为.我以前从未使用四元数或虚拟轨迹球,这对我来说都是新手.我正在使用QuaternionJOGL提供的类.我尝试制作自己的并且它起作用(或者至少就我所知道的那样)但是它完全混乱所以我只是选择了JOGL.

当我不连接四元数时,我看到的轻微旋转似乎就是我想要的,但当然只有它向任何方向移动一点时才很难.此代码基于OpenGL wiki上的Trackball Tutorial.

当我使用Quaternion类的mult (Quaternion q)方法时,图形几乎不会移动(甚至不会尝试连接四元数).

当我尝试使用Quaternion class'sadd(Quaternion q)`方法来获得它的乐趣时,我得到的东西至少会旋转图形但不能以任何连贯的方式.当我移动鼠标时,它会随机出现并随机旋转.偶尔我会得到完全充满NaN的四元数.

在我的代码中,我不会显示其中任何一个,我迷失了如何处理我的四元数.我知道我想要增加它们,因为据我所知,它们是如何连接起来的.但就像我说我没有成功,我假设搞砸了我的代码中的其他地方.

反正,我的设置有Trackball一类public Point3f projectMouse (int x, int y)方法和public void rotateFor (Point3f p1, Point3f p2),哪里Point3f是我做了一个类.另一个被调用的类Camera有一个public void transform (GLAutoDrawable g)方法,它将调用OpenGL方法根据轨迹球的四元数进行旋转.

这是代码:

public Point3f projectMouse (int x, int y)
{
    int off = Screen.WIDTH / 2;  // Half the width of the GLCanvas

    x = x - objx_ - off;         // …
Run Code Online (Sandbox Code Playgroud)

java opengl math quaternions

2
推荐指数
2
解决办法
2896
查看次数

奇怪的案例类语法

我一直在学习Scala,并决定使用json4s进行JSON解析.我决定使用XPath语法进行反序列化,并遇到了我从未见过的这种奇怪的语法.

val json = JsonMethods.parse("""{"meaningOfLife": 42}""")
val JInt(x) = json\"meaningOfLife"
Run Code Online (Sandbox Code Playgroud)

令我困惑的是这一点

val JInt(x) = ...
Run Code Online (Sandbox Code Playgroud)

我无法理解那里发生的事情,我甚至不知道如何搜索这种语法或者它的名称.谁能帮我吗?Scala是一种令人惊叹的语言,具有许多简洁的功能,我在其他语言(如C++和Java)中不习惯这些功能.

编辑

为了澄清,我很困惑,因为x没有定义,但它以某种方式传递给函数或构造函数,然后被赋值给结果json\"meaningOfLife"返回一个JValue.

编辑2

经过一些研究和游戏后,我发现这与案例类有关.我能够运行以下代码.

case class MyCaseClass (x: Int)
val MyCaseClass(x) = new MyCaseClass(5)
println(x, x.getClass) // prints (5,int)
Run Code Online (Sandbox Code Playgroud)

在查看了一些代码之后,我对正在发生的事情有了很好的理解.

val MyCaseClass(x) = MyCaseClass(5)
Run Code Online (Sandbox Code Playgroud)

提取(缺少一个更好的术语)来自实例化和存储的Int值,意思是类型.5MyCaseClassxxInt

在用于json4s一个代码JInt是一个JValue其中\操作者的回报.所以JInt(x)它正在取出BigInt(存储在类中JInt)并将其放入x我收集的值中.

但我还有一个问题.这个过程叫什么?有没有任何文件?

xpath scala

1
推荐指数
1
解决办法
248
查看次数