我有一个矩阵(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
这对应于此(黑点代表我的观点):

我希望使用线程进行矩阵乘法,其中每个线程执行单个乘法,然后主线程将所有结果相加并将它们放在最终矩阵中的适当位置(在其他线程退出之后).
我试图这样做的方法是创建一个包含每个线程结果的单行数组.然后我将遍历数组并添加+将结果放在最终矩阵中.
例如:如果你有矩阵:
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) 我正在寻找一种算法,该算法可以在具有平坦底部(磁盘)的圆锥体内生成点。
我有创建圆锥的标准化轴(出于我们的目的,我们只说它是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)
下图是我要的。能够在表面或内部生成样本的能力也会很好:
因此,出于性能原因,我正在将我编写的Java代码转换为C++代码,以及使用CUDA并行化一些东西的意图.但是,我想要做的第一件事就是直接转换,只需在C++中运行,其代码与java中相同.
我遇到的问题是,下面的循环实际上需要几分钟才能完成C++,而在Java中几乎没有任何时间.唯一的区别是我在C++和ArrayListJava中使用向量.
当我最初创建单元格向量时,我还为邻居向量保留了适当的大小.此代码的目的是在3d立方体中创建统一的单元格网格,并在以后方便地将每个单元格的邻居存储在单元格内部.
我正在使用Visual Studio 2013,以防万一(对于C++)和Eclipse对于java.
我觉得我肯定错过了一些简单的东西,因为这样的减速似乎很疯狂,但是当我注释掉时push_back,代码基本上立即执行.
w,h和d都是20.cells是Cell结构的矢量(见下文).
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)