小编Kin*_*nru的帖子

为绘图排序多边形的点

我有一个矩阵(0表示什么都没有,1表示地形)代表我游戏中的一个级别.矩阵对应于我的屏幕被分解成的网格,并指示我的地形去向何处.

我的地形实际上由网格中每个块的角落中的4个点组成.当您有多个连接的块时,我使用合并单元算法来删除重复的点和任何内部点.结果是我得到了一个仅列出多边形外边缘的点列表.

为了绘制这个多边形,我需要点以某种顺序(顺时针或逆时针),使得每个点后面跟着它的相邻点.显然,第一点和最后一点必须是邻居.由于这都在网格中,我知道相邻点之间的确切距离.

问题是我在提出一种算法时遇到麻烦,这种算法允许我在多边形的边缘"行走",同时按顺序排列点.我相信应该有一种方法来利用我有矩阵表示几何的事实,这意味着只有一种可能的方法来绘制多边形(即使它是凹的).

我已经尝试了几种使用贪婪算法的方法,但似乎找不到一种方法可以知道,在每种情况下,我想要进入哪个方向.鉴于任何特定点可以有多达3个邻居(第四个是包括因为它是"起点",这意味着我已经对它进行了排序)我需要一种了解移动方式的方法.

更新

我一直尝试的另一种方法是用X(用Y的决胜局)对点进行排序,这给了我最上面/最左边的边缘.它还保证我在外围开始.但是,我仍然在努力寻找一种算法来保证我不会越过外面.

这是一个示例矩阵:

0 0 0 0 0 0 0 0 0 0

0 0 0 1 1 1 0 0 0 0

0 0 0 0 0 1 0 0 0 0

0 0 0 0 0 1 1 1 0 0

这对应于此(黑点代表我的观点): 多边形

sorting algorithm math polygon

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

矩阵乘以线程(每个线程单个乘法)

我希望使用线程进行矩阵乘法,其中每个线程执行单个乘法,然后主线程将所有结果相加并将它们放在最终矩阵中的适当位置(在其他线程退出之后).

我试图这样做的方法是创建一个包含每个线程结果的单行数组.然后我将遍历数组并添加+将结果放在最终矩阵中.

例如:如果你有矩阵:

A = [{1,4},{2,5},{3,6}] B = [{8,7,6},{5,4,3}]

然后我想要一个包含[8,20,7,16,6,12,16等]的数组,然后我会遍历数组,每2个数字加起来并将它们放在我的最终数组中.

这是一个硬件分配,所以我不是在寻找确切的代码,而是关于如何正确地将结果存储在数组中的一些逻辑.我正在努力跟踪如何跟踪每个矩阵中的位置,这样我就不会错过任何数字.

谢谢.

EDIT2:忘记提到每个单一的乘法必须有一个单独的线程.上面例子的含义是,每个都有18个线程进行自己的计算.

编辑:我目前正在使用此代码作为基础来解决.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#define M 3
#define K 2
#define N 3
#define NUM_THREADS 10

int A [M][K] = { {1,4}, {2,5}, {3,6} };
int B [K][N] = { {8,7,6}, {5,4,3} };
int C [M][N];

struct v {
   int i; /* row */
   int j; /* column */
};

void *runner(void *param); /* the thread */

int main(int argc, char *argv[]) {

   int …
Run Code Online (Sandbox Code Playgroud)

c multithreading pthreads matrix-multiplication

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

锥形内均匀采样(按体积)

我正在寻找一种算法,该算法可以在具有平坦底部(磁盘)的圆锥体内生成点。

我有创建圆锥的标准化轴(出于我们的目的,我们只说它是y轴,所以(0,1,0)以及圆锥的角度(假设是45度)。

我在网上可以找到的唯一资源是在圆锥体内生成矢量,但是它们基于对球体的采样,因此在底部,您会得到一种“雪锥”效果,而不是在底部有一个圆盘。

这是通过以下伪代码完成的:

// Sample phi uniformly on [0, 2PI]
float phi = rand(0, 1) * 2 * PI

// Sample u uniformly from [cos(angle), 1]
float u = rand(0, 1) * (1 - cos(angle * PI/180)) + cos(angle * PI/180)

vec3 = vec3(sqrt(1 - u^2) * cos(phi), u, sqrt(1 - u^2) * sin(phi)))
Run Code Online (Sandbox Code Playgroud)

下图是我要的。能够在表面或内部生成样本的能力也会很好:

在此处输入图片说明

math 3d geometry distribution

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

矢量push_back非常慢

因此,出于性能原因,我正在将我编写的Java代码转换为C++代码,以及使用CUDA并行化一些东西的意图.但是,我想要做的第一件事就是直接转换,只需在C++中运行,其代码与java中相同.

我遇到的问题是,下面的循环实际上需要几分钟才能完成C++,而在Java中几乎没有任何时间.唯一的区别是我在C++和ArrayListJava中使用向量.

当我最初创建单元格向量时,我还为邻居向量保留了适当的大小.此代码的目的是在3d立方体中创建统一的单元格网格,并在以后方便地将每个单元格的邻居存储在单元格内部.

我正在使用Visual Studio 2013,以防万一(对于C++)和Eclipse对于java.

我觉得我肯定错过了一些简单的东西,因为这样的减速似乎很疯狂,但是当我注释掉时push_back,代码基本上立即执行.

w,hd都是20.cellsCell结构的矢量(见下文).

for (int i = 0; i < w; i++) {
    for (int j = 0; j < h; j++) {
        for (int k = 0; k < d; k++) {
            for (int x = -1; x < 2; x++) {
                for (int y = -1; y < 2; y++) {
                    for (int z = -1; z < …
Run Code Online (Sandbox Code Playgroud)

c++ performance vector

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