- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在为一个类的 n 体问题创建 barnes-hut 算法。
我正在构建树,如下所示,但是在第一次迭代之后,在第一次递归时,它应该将包含主体的节点分割开来。它似乎做得很好,但我遇到了一个问题, body 似乎在正确的象限中,但算法并没有把它们放在那里。有人可以看一下吗?我要疯了,这可能是因为我对 C 编程还比较陌生。象限按顺时针顺序排列。
struct Node * buildBHTree(double xmin, double xmax, double ymin, double ymax, struct Body *listOfBodies)
{
if (listOfBodies == NULL)
{
return 0;
}
else if (listOfBodies->next == NULL)
{
struct Node *singleNode = (struct Node *) malloc(sizeof(struct Node));
initNewNode(singleNode);
singleNode->xmin = xmin;
singleNode->xmax = xmax;
singleNode->ymin = ymin;
singleNode->ymax = ymax;
singleNode->body = listOfBodies;
//calculateCenterOfMassForNode(singleNode);
return singleNode;
}
else
{
struct Node *list1 = (struct Node *) malloc(sizeof(struct Node));
initNewNode(list1);
list1->xmin = (xmin + xmax)/2;
list1->xmax = xmax;
list1->ymin = (ymin + ymax)/2;
list1->ymax = ymax;
struct Node *list2 = (struct Node *) malloc(sizeof(struct Node));
initNewNode(list2);
list2->xmin = (xmin + xmax)/2;
list2->xmax = xmax;
list2->ymin = ymin;
list2->ymax = (ymin + ymax)/2;
struct Node *list3 = (struct Node *) malloc(sizeof(struct Node));
initNewNode(list3);
list3->xmin = xmin;
list3->xmax = (xmin + xmax)/2;
list3->ymin = ymin;
list3->ymax = (ymin + ymax)/2;
struct Node *list4 = (struct Node *) malloc(sizeof(struct Node));
initNewNode(list4);
list4->xmin = xmin;
list4->xmax = (xmin + xmax)/2;
list4->ymin = (ymin + ymax)/2;
list4->ymax = ymax;
//printf("xpos: %f | ypos: %f\n", listOfBodies->pos_x, listOfBodies->pos_y);
printf("QUADRANT 1: xmin: %f | xmax: %f | ymin: %f | ymax: %f\n", list1->xmin, list1->xmax, list1->ymin, list1->ymax);
printf("QUADRANT 2: xmin: %f | xmax: %f | ymin: %f | ymax: %f\n", list2->xmin, list2->xmax, list2->ymin, list2->ymax);
printf("QUADRANT 3: xmin: %f | xmax: %f | ymin: %f | ymax: %f\n", list3->xmin, list3->xmax, list3->ymin, list3->ymax);
printf("QUADRANT 4: xmin: %f | xmax: %f | ymin: %f | ymax: %f\n", list4->xmin, list4->xmax, list4->ymin, list4->ymax);
struct Body *rootBodyReference = (struct Body *) malloc(sizeof(struct Body));
rootBodyReference = listOfBodies;
while (listOfBodies->next != NULL)
{
//QUADRANT 1
if (listOfBodies->pos_x >= list1->xmin &&
listOfBodies->pos_x <= list1->xmax &&
listOfBodies->pos_y >= list1->ymin &&
listOfBodies->pos_y <= list1->ymax)
{
printf("FOUND IN QUADRANT 1\n");
addBodyToLinkedList(list1, listOfBodies);
}
//QUADRANT 2
else if (listOfBodies->pos_x >= list2->xmin &&
listOfBodies->pos_x <= list2->xmax &&
listOfBodies->pos_y <= list2->ymin &&
listOfBodies->pos_y >= list2->ymax)
{
printf("FOUND IN QUADRANT 2\n");
addBodyToLinkedList(list2, listOfBodies);
}
//QUADRANT 3
else if (listOfBodies->pos_x >= list3->xmin &&
listOfBodies->pos_x <= list3->xmax &&
listOfBodies->pos_y <= list3->ymin &&
listOfBodies->pos_y >= list3->ymax)
{
printf("FOUND IN QUADRANT 3\n");
addBodyToLinkedList(list3, listOfBodies);
}
//QUADRANT 4
else if (listOfBodies->pos_x >= list4->xmin &&
listOfBodies->pos_x <= list4->xmax &&
listOfBodies->pos_y >= list4->ymin &&
listOfBodies->pos_y <= list4->ymax)
{
printf("FOUND IN QUADRANT 4\n");
addBodyToLinkedList(list4, listOfBodies);
}
else
{
printf("NO PLACE FOR THIS BODY WITH POSITION X: %f AND POSITION Y: %f\n", listOfBodies->pos_x, listOfBodies->pos_y);
}
listOfBodies = listOfBodies->next;
}
printf("\n");
listOfBodies = rootBodyReference;
bringNodeListBackToHeadNode(list1);
bringNodeListBackToHeadNode(list2);
bringNodeListBackToHeadNode(list3);
bringNodeListBackToHeadNode(list4);
struct Node *nodeTemp0 = buildBHTree(list1->xmin, list1->xmax, list1->ymin, list1->ymax, list1->body);
struct Node *nodeTemp1 = buildBHTree(list2->xmin, list2->xmax, list2->ymin, list2->ymax, list2->body);
struct Node *nodeTemp2 = buildBHTree(list3->xmin, list3->xmax, list3->ymin, list3->ymax, list3->body);
struct Node *nodeTemp3 = buildBHTree(list4->xmin, list4->xmax, list4->ymin, list4->ymax, list4->body);
struct Node *nodeTemp = (struct Node *) malloc(sizeof(struct Node));
nodeTemp->body = listOfBodies;
nodeTemp->node1 = nodeTemp0;
nodeTemp->node2 = nodeTemp1;
nodeTemp->node3 = nodeTemp2;
nodeTemp->node4 = nodeTemp3;
nodeTemp->xmin = xmin;
nodeTemp->xmax = xmax;
nodeTemp->ymin = ymin;
nodeTemp->ymax = ymax;
return nodeTemp;
}
}
运行时我也一直得到以下输出(请注意,第一个打印输出是在第一次运行时,第二个是递归第一次重新运行该方法时):
QUADRANT 1: xmin: 0.000000 | xmax: 250000000000.000000 | ymin: 0.000000 | ymax: 250000000000.000000
QUADRANT 2: xmin: 0.000000 | xmax: 250000000000.000000 | ymin: -250000000000.000000 | ymax: 0.000000
QUADRANT 3: xmin: -250000000000.000000 | xmax: 0.000000 | ymin: -250000000000.000000 | ymax: 0.000000
QUADRANT 4: xmin: -250000000000.000000 | xmax: 0.000000 | ymin: 0.000000 | ymax: 250000000000.000000
FOUND IN QUADRANT 1
FOUND IN QUADRANT 1
FOUND IN QUADRANT 1
FOUND IN QUADRANT 1
FOUND IN QUADRANT 1
QUADRANT 1: xmin: 125000000000.000000 | xmax: 250000000000.000000 | ymin: 125000000000.000000 | ymax: 250000000000.000000
QUADRANT 2: xmin: 125000000000.000000 | xmax: 250000000000.000000 | ymin: 0.000000 | ymax: 125000000000.000000
QUADRANT 3: xmin: 0.000000 | xmax: 125000000000.000000 | ymin: 0.000000 | ymax: 125000000000.000000
QUADRANT 4: xmin: 0.000000 | xmax: 125000000000.000000 | ymin: 125000000000.000000 | ymax: 250000000000.000000
NO PLACE FOR THIS BODY WITH POSITION X: 0.000000 AND POSITION Y: 0.000000
NO PLACE FOR THIS BODY WITH POSITION X: 57900000000.000000 AND POSITION Y: 0.000000
NO PLACE FOR THIS BODY WITH POSITION X: 108200000000.000000 AND POSITION Y: 0.000000
NO PLACE FOR THIS BODY WITH POSITION X: 149600000000.000000 AND POSITION Y: 0.000000
最佳答案
第一个问题是一些检查被关闭了,就像这里
//QUADRANT 2
else if (listOfBodies->pos_x >= list2->xmin &&
listOfBodies->pos_x <= list2->xmax &&
listOfBodies->pos_y <= list2->ymin && // should be >=
listOfBodies->pos_y >= list2->ymax) // should be <=
{
printf("FOUND IN QUADRANT 2\n");
addBodyToLinkedList(list2, listOfBodies);
}
第二个问题是你没有处理象限碰撞的特殊情况
QUADRANT 1: xmin: 0.0 | xmax: 250000000000.0 | ymin: 0.0 | ymax: 250000000000.0
QUADRANT 2: xmin: 0.0 | xmax: 250000000000.0 | ymin: -250000000000.0 | ymax: 0.0
QUADRANT 3: xmin: -250000000000.0 | xmax: 0.0 | ymin: -250000000000.0 | ymax: 0.0
QUADRANT 4: xmin: -250000000000.0 | xmax: 0.0 | ymin: 0.0 | ymax: 250000000000.0
因为你的检查是全包的,点 0,0
存在于所有 4 个象限中,为了解决这个问题,你可以将最小值视为包含而将最大值视为不包含,像这样
//QUADRANT 1
if (listOfBodies->pos_x >= list1->xmin &&
listOfBodies->pos_x < list1->xmax &&
listOfBodies->pos_y >= list1->ymin &&
listOfBodies->pos_y < list1->ymax)
{
printf("FOUND IN QUADRANT 1\n");
addBodyToLinkedList(list1, listOfBodies);
}
我的建议是你可以使用两个int
(代表小数部分和整数部分)而不是double
来提高性能并在比较 float 时避免出现问题。
关于c - C 递归中的 Barnes-Hut N-Body,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35194926/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!