小编Ric*_*ral的帖子

如何在平移/旋转后重新计算轴对齐的边界框?

当我第一次加载对象时,我使用max和min(x,y,z)点计算初始AABB.但这是在物体空间中,物体在世界各地移动,更重要的是旋转.

每次翻译/旋转对象时,如何重新计算新的AABB?基本上每一帧都会发生这种情况,每帧重新计算新的AABB会是一次非常密集的操作吗?如果是这样,那会有什么选择呢?

我知道AABB会使我的碰撞检测不太准确,但实现碰撞检测代码比OBB更容易,我想一次采取这一步骤.

从以下答案中获得一些见解后,这是我当前的代码:

typedef struct sAxisAlignedBoundingBox {
    Vector3D bounds[8];
    Vector3D max, min;
} AxisAlignedBoundingBox;

void drawAxisAlignedBoundingBox(AxisAlignedBoundingBox box) {
    glPushAttrib(GL_LIGHTING_BIT | GL_POLYGON_BIT);

    glEnable(GL_COLOR_MATERIAL);
    glDisable(GL_LIGHTING);

    glColor3f(1.0f, 1.0f, 0.0f);

    glBegin(GL_LINE_LOOP);
        glVertex3f(box.bounds[0].x, box.bounds[0].y, box.bounds[0].z);
        glVertex3f(box.bounds[1].x, box.bounds[1].y, box.bounds[1].z);
        glVertex3f(box.bounds[2].x, box.bounds[2].y, box.bounds[2].z);
        glVertex3f(box.bounds[3].x, box.bounds[3].y, box.bounds[3].z);
    glEnd();

    glBegin(GL_LINE_LOOP);
        glVertex3f(box.bounds[4].x, box.bounds[4].y, box.bounds[4].z);
        glVertex3f(box.bounds[5].x, box.bounds[5].y, box.bounds[5].z);
        glVertex3f(box.bounds[6].x, box.bounds[6].y, box.bounds[6].z);
        glVertex3f(box.bounds[7].x, box.bounds[7].y, box.bounds[7].z);
    glEnd();

    glBegin(GL_LINE_LOOP);
        glVertex3f(box.bounds[0].x, box.bounds[0].y, box.bounds[0].z);
        glVertex3f(box.bounds[5].x, box.bounds[5].y, box.bounds[5].z);
        glVertex3f(box.bounds[6].x, box.bounds[6].y, box.bounds[6].z);
        glVertex3f(box.bounds[1].x, box.bounds[1].y, box.bounds[1].z);
    glEnd();

    glBegin(GL_LINE_LOOP);
        glVertex3f(box.bounds[4].x, box.bounds[4].y, box.bounds[4].z);
        glVertex3f(box.bounds[7].x, box.bounds[7].y, box.bounds[7].z);
        glVertex3f(box.bounds[2].x, box.bounds[2].y, box.bounds[2].z);
        glVertex3f(box.bounds[3].x, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl collision-detection aabb

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

何时应该在Android中使用dimens.xml文件?

例如,在特定的布局中,我有以下XML:

<GridView
    android:id="@+id/gridView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="3dp"
    android:columnWidth="48dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="spacingWidth" />
Run Code Online (Sandbox Code Playgroud)

此网格视图特定于此布局,我不认为我将使用具有类似属性的任何其他网格视图.这就是说代码中的维度值特定于该网格视图.

我是否应该将它们移动到dimens.xml文件中,或者将它们留下来就可以了?如果是这样,仅当在多个布局中使用该值时,我是否应该在dimens.xml文件中放置值?

android dimensions android-layout

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

使用Gradle在自定义类加载Dalvik(Android新建系统)

根据Fred Chung在Android开发者博客上介绍Dalvik中Custom Class Loading:

Dalvik VM为开发人员提供了执行自定义类加载的工具.应用程序可以从其他位置(如内部存储)或通过网络加载它们,而不是从默认位置加载Dalvik可执行文件("dex").

但是,没有多少开发人员需要进行自定义类加载.但那些按照博客文章中的说明进行操作的人可能会在使用Gradle(Google I/O 2013中引入的Android新构建系统)模仿相同行为时遇到一些问题.

究竟如何调整新构建系统以执行与旧(基于Ant)构建系统相同的中间步骤?

android dalvik dynamic-class-loaders gradle

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

如何退出子进程并从execvp()返回其状态?

在我的简单自定义shell中,我正在从标准输入中读取命令并使用execvp()执行它们.在此之前,我创建了当前进程的fork,我在该子进程中调用了execvp(),之后,我调用exit(0).

像这样的东西:

pid = fork();

if(pid == -1) {
    perror("fork");
    exit(1);
}

if(pid == 0) {
    // CHILD PROCESS CODE GOES HERE...
    execvp(pArgs[0], pArgs);
    exit(0);
} else {
    // PARENT PROCESS CODE GOES HERE...
}
Run Code Online (Sandbox Code Playgroud)

现在,使用execvp()运行的命令可以返回错误吗?我想正确地处理它,现在,我总是调用exit(0),这意味着子进程将始终具有"OK"状态.

如何从execvp()调用返回正确的状态并将其放入exit()调用?我应该只获取execvp()返回的int值并将其作为exit()参数而不是0传递.这是否足够正确?

c fork exec exit

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

如何正确地使我的makefile编译和运行?

问题可能不是描述我的问题的最佳问题,但我想不出更好的问题.我的makefile是这样的:

PROGRAM_NAME = prog

OBJECT_FILES = $(PROGRAM_NAME).o
CFLAGS = -O2 -Wall -g

$(PROGRAM_NAME) : $(OBJECT_FILES)
    gcc $(CFLAGS) -o $@ $(OBJECT_FILES)

$(PROGRAM_NAME).o : $(PROGRAM_NAME).c data.h
    gcc $(CFLAGS) -c $<

clean :
    $(RM) $(PROGRAM_NAME)
    $(RM) $(OBJECT_FILES)
    $(RM) *~ *.bak

run :
    @$(MAKE) && ./$(PROGRAM_NAME) $(ARGS)
Run Code Online (Sandbox Code Playgroud)

当我想编译并运行时,我只是做"运行".这个问题是我的程序处理Ctrl + Z产生的信号,如果我用"make run"启动我的程序,信号将被发送到"make run"而不是我的程序本身.

基本上,调用"make run"与直接调用"make && ./prog"不同,因为在第一种情况下,"make run"不会终止,除非"prog"首先终止.

有没有解决的办法?

c signals makefile

17
推荐指数
3
解决办法
6万
查看次数

如何使用DOM操作正确地对测试指令进行单元化?

在问我真正的问题之前,我有一个不同的... 在Angular指令中单元测试 DOM操作是否有意义?

例如,这是我的完整链接功能:

function linkFn(scope, element) {
    var ribbon = element[0];
    var nav = ribbon.children[0];

    scope.ctrl.ribbonItemClick = function (index) {
        var itemOffsetLeft;
        var itemOffsetRight;
        var item;

        if (scope.ctrl.model.selectedIndex === index) {
            return;
        }

        scope.ctrl.model.selectedIndex = index;

        item = nav.querySelectorAll('.item')[index];

        itemOffsetLeft = item.offsetLeft - ribbon.offsetLeft;
        itemOffsetRight = itemOffsetLeft + item.clientWidth;

        if (itemOffsetLeft < nav.scrollLeft) {
            nav.scrollLeft = itemOffsetLeft - MAGIC_PADDING;
        }

        if(itemOffsetRight > nav.clientWidth + nav.scrollLeft) {
            nav.scrollLeft = itemOffsetRight - nav.clientWidth + MAGIC_PADDING;
        }

        this.itemClick({
            item: scope.ctrl.model.items[index],
            index: …
Run Code Online (Sandbox Code Playgroud)

dom unit-testing angularjs angularjs-directive

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

为什么使用newInstance for DialogFragment而不是构造函数?

综观文件DialogFragment,人们看到的静态newInstance方法来初始化一个新的警告对话框片段.我的问题是,为什么不使用构造函数来这样做,像这样:

public MyAlertDialogFragment(int title) {
    Bundle args = new Bundle();
    args.putInt("title", title);
    setArguments(args);
}
Run Code Online (Sandbox Code Playgroud)

这不完全相同,还是以某种方式不同?什么是最好的方法,为什么

android constructor android-dialogfragment

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

与Linux的"cat"相比,为什么我的"cat"函数与系统调用相比较慢?

我在C语言中使用系统调用(打开,读取和写入)来完成此功能,以模拟Linux系统中的"cat"功能,并且它比实际的慢...

我使用与真正的"猫"相同的缓冲区大小并使用"strace"我认为它正在进行相同数量的系统调用.但是我的"猫"的输出比真正的"猫"慢了一点.

这是我的代码:

#define BUFSIZ 32768

int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
    ssize_t writtenBytes = 0;

    while(writtenBytes < readBytes) {
        writtenBytes += write(fdout,
            buffer + writtenBytes, readBytes - writtenBytes);
        if(writtenBytes == -1) {
            return -1;
        }
    }

    return 0;
}

int catPrint(int fdin, int fdout) {
    char buffer[BUFSIZ];
    ssize_t readBytes;

    do {
        readBytes = read(fdin, buffer, BUFSIZ);

        if(readBytes == -1) {
            return -1;
        }

        if(sysWriteBuffer(fdout, buffer, readBytes) == -1) {
            return -1;
        }
    } while(readBytes > 0);

    return …
Run Code Online (Sandbox Code Playgroud)

c linux system-calls cat

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

在退出()状态下使用C over over除以256的WEXITSTATUS宏有什么好处?

我正在为大学做练习,我必须在退出时返回一个值,这个值实际上是一些东西.这可能高于255(exit()无法处理)但是老师建议使用测试数据,其中计数永远不会高于该值.

毕竟,我需要处理这个计数值,退出状态,我通过使用waitpid()在主进程中得到了这个值.令我惊讶的是,如果子进程返回1,则主进程中的"实际"值为256,2为512,依此类推......

我需要打印这个值,所以我简单地将它除以256并完成了.但是,如果我使用WEXITSTATUS()宏,我也会按照我想要的方式得到这个值...

我查看了C源代码,这是我发现的:

#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
Run Code Online (Sandbox Code Playgroud)

我理解这里发生了什么,例如,二进制512是10 0000 0000,右移8'将得到00 0000 0010,即十进制2.在这个宏中我不明白的是&运算符和0xff00似乎是一个随机数的事实(它可能不是,它来自哪里?).这究竟是做什么的,为什么宏中有"&0xff00"?它不会有效吗?

在这个主题中真正的问题是,在我的代码中将此宏称为除以256是一回事吗?

c system-calls exit

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

如何使用Scanner从Java中的STDIN静默读取?

我想创建一个从STDIN静默读取密码的Java程序.我的意思是,不向终端输出任何按下的字符,并将其隐藏在命令行历史记录和操作系统进程列表中ps.

java stdin java.util.scanner

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