亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pf_kdtree.c

?? 機器人仿真軟件
?? C
字號:
/************************************************************************** * Desc: kd-tree functions * Author: Andrew Howard * Date: 18 Dec 2002 * CVS: $Id: pf_kdtree.c,v 1.4 2004/05/31 23:22:57 gerkey Exp $ *************************************************************************/#include <assert.h>#include <math.h>#include <stdlib.h>#include <string.h>#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "pf_vector.h"#include "pf_kdtree.h"// Compare keys to see if they are equalstatic int pf_kdtree_equal(pf_kdtree_t *self, int key_a[], int key_b[]);// Insert a node into the treestatic pf_kdtree_node_t *pf_kdtree_insert_node(pf_kdtree_t *self, pf_kdtree_node_t *parent,                                               pf_kdtree_node_t *node, int key[], double value);// Recursive node searchstatic pf_kdtree_node_t *pf_kdtree_find_node(pf_kdtree_t *self, pf_kdtree_node_t *node, int key[]);// Recursively label nodes in this clusterstatic void pf_kdtree_cluster_node(pf_kdtree_t *self, pf_kdtree_node_t *node, int depth);// Recursive node printingstatic void pf_kdtree_print_node(pf_kdtree_t *self, pf_kdtree_node_t *node);#ifdef INCLUDE_RTKGUI// Recursively draw nodesstatic void pf_kdtree_draw_node(pf_kdtree_t *self, pf_kdtree_node_t *node, rtk_fig_t *fig);#endif////////////////////////////////////////////////////////////////////////////////// Create a treepf_kdtree_t *pf_kdtree_alloc(int max_size){  pf_kdtree_t *self;  self = calloc(1, sizeof(pf_kdtree_t));  self->size[0] = 0.50;  self->size[1] = 0.50;  self->size[2] = (10 * M_PI / 180);  self->root = NULL;      self->node_count = 0;  self->node_max_count = max_size;  self->nodes = calloc(self->node_max_count, sizeof(pf_kdtree_node_t));  self->leaf_count = 0;    return self;}////////////////////////////////////////////////////////////////////////////////// Destroy a treevoid pf_kdtree_free(pf_kdtree_t *self){  free(self->nodes);  free(self);  return;}////////////////////////////////////////////////////////////////////////////////// Clear all entries from the treevoid pf_kdtree_clear(pf_kdtree_t *self){  self->root = NULL;  self->leaf_count = 0;  self->node_count = 0;    return;}////////////////////////////////////////////////////////////////////////////////// Insert a pose into the tree.void pf_kdtree_insert(pf_kdtree_t *self, pf_vector_t pose, double value){  int key[3];  key[0] = floor(pose.v[0] / self->size[0]);  key[1] = floor(pose.v[1] / self->size[1]);  key[2] = floor(pose.v[2] / self->size[2]);  self->root = pf_kdtree_insert_node(self, NULL, self->root, key, value);  // Test code  /*  printf("find %d %d %d\n", key[0], key[1], key[2]);  assert(pf_kdtree_find_node(self, self->root, key) != NULL);  pf_kdtree_print_node(self, self->root);      printf("\n");    for (i = 0; i < self->node_count; i++)  {    node = self->nodes + i;    if (node->leaf)    {      printf("find %d %d %d\n", node->key[0], node->key[1], node->key[2]);      assert(pf_kdtree_find_node(self, self->root, node->key) == node);    }  }   printf("\n\n");  */    return;}////////////////////////////////////////////////////////////////////////////////// Determine the probability estimate for the given pose. TODO: this// should do a kernel density estimate rather than a simple histogram.double pf_kdtree_get_prob(pf_kdtree_t *self, pf_vector_t pose){  int key[3];  pf_kdtree_node_t *node;  key[0] = floor(pose.v[0] / self->size[0]);  key[1] = floor(pose.v[1] / self->size[1]);  key[2] = floor(pose.v[2] / self->size[2]);    node = pf_kdtree_find_node(self, self->root, key);  if (node == NULL)    return 0.0;  return node->value;}////////////////////////////////////////////////////////////////////////////////// Determine the cluster label for the given poseint pf_kdtree_get_cluster(pf_kdtree_t *self, pf_vector_t pose){  int key[3];  pf_kdtree_node_t *node;  key[0] = floor(pose.v[0] / self->size[0]);  key[1] = floor(pose.v[1] / self->size[1]);  key[2] = floor(pose.v[2] / self->size[2]);    node = pf_kdtree_find_node(self, self->root, key);  if (node == NULL)    return -1;  return node->cluster;}////////////////////////////////////////////////////////////////////////////////// Compare keys to see if they are equalint pf_kdtree_equal(pf_kdtree_t *self, int key_a[], int key_b[]){  //double a, b;    if (key_a[0] != key_b[0])    return 0;  if (key_a[1] != key_b[1])    return 0;  if (key_a[2] != key_b[2])    return 0;  /* TODO: make this work (pivot selection needs fixing, too)  // Normalize angles  a = key_a[2] * self->size[2];  a = atan2(sin(a), cos(a)) / self->size[2];  b = key_b[2] * self->size[2];  b = atan2(sin(b), cos(b)) / self->size[2];   if ((int) a != (int) b)    return 0;  */    return 1;}////////////////////////////////////////////////////////////////////////////////// Insert a node into the treepf_kdtree_node_t *pf_kdtree_insert_node(pf_kdtree_t *self, pf_kdtree_node_t *parent,                                        pf_kdtree_node_t *node, int key[], double value){  int i;  int split, max_split;  // If the node doesnt exist yet...  if (node == NULL)  {    assert(self->node_count < self->node_max_count);    node = self->nodes + self->node_count++;    memset(node, 0, sizeof(pf_kdtree_node_t));    node->leaf = 1;        if (parent == NULL)      node->depth = 0;    else      node->depth = parent->depth + 1;    for (i = 0; i < 3; i++)      node->key[i] = key[i];        node->value = value;    self->leaf_count += 1;  }  // If the node exists, and it is a leaf node...  else if (node->leaf)  {    // If the keys are equal, increment the value    if (pf_kdtree_equal(self, key, node->key))    {      node->value += value;    }    // The keys are not equal, so split this node    else    {      // Find the dimension with the largest variance and do a mean      // split      max_split = 0;      node->pivot_dim = -1;      for (i = 0; i < 3; i++)      {        split = abs(key[i] - node->key[i]);        if (split > max_split)        {          max_split = split;          node->pivot_dim = i;        }      }      assert(node->pivot_dim >= 0);                node->pivot_value = (key[node->pivot_dim] + node->key[node->pivot_dim]) / 2.0;          if (key[node->pivot_dim] < node->pivot_value)      {        node->children[0] = pf_kdtree_insert_node(self, node, NULL, key, value);        node->children[1] = pf_kdtree_insert_node(self, node, NULL, node->key, node->value);      }      else      {        node->children[0] = pf_kdtree_insert_node(self, node, NULL, node->key, node->value);        node->children[1] = pf_kdtree_insert_node(self, node, NULL, key, value);      }            node->leaf = 0;      self->leaf_count -= 1;    }  }  // If the node exists, and it has children...  else  {    assert(node->children[0] != NULL);    assert(node->children[1] != NULL);    if (key[node->pivot_dim] < node->pivot_value)      pf_kdtree_insert_node(self, node, node->children[0], key, value);    else      pf_kdtree_insert_node(self, node, node->children[1], key, value);  }  return node;}////////////////////////////////////////////////////////////////////////////////// Recursive node searchpf_kdtree_node_t *pf_kdtree_find_node(pf_kdtree_t *self, pf_kdtree_node_t *node, int key[]){      if (node->leaf)  {    //printf("find  : leaf %p %d %d %d\n", node, node->key[0], node->key[1], node->key[2]);    // If the keys are the same...    if (pf_kdtree_equal(self, key, node->key))      return node;    else      return NULL;  }  else  {    //printf("find  : brch %p %d %f\n", node, node->pivot_dim, node->pivot_value);            assert(node->children[0] != NULL);    assert(node->children[1] != NULL);    // If the keys are different...    if (key[node->pivot_dim] < node->pivot_value)      return pf_kdtree_find_node(self, node->children[0], key);    else      return pf_kdtree_find_node(self, node->children[1], key);  }  return NULL;}////////////////////////////////////////////////////////////////////////////////// Recursive node printingvoid pf_kdtree_print_node(pf_kdtree_t *self, pf_kdtree_node_t *node){  if (node->leaf)  {    printf("(%+02d %+02d %+02d)\n", node->key[0], node->key[1], node->key[2]);    printf("%*s", node->depth * 11, "");   }  else  {    printf("(%+02d %+02d %+02d) ", node->key[0], node->key[1], node->key[2]);    pf_kdtree_print_node(self, node->children[0]);    pf_kdtree_print_node(self, node->children[1]);      }  return;}////////////////////////////////////////////////////////////////////////////////// Cluster the leaves in the treevoid pf_kdtree_cluster(pf_kdtree_t *self){  int i;  int queue_count, cluster_count;  pf_kdtree_node_t **queue, *node;               queue_count = 0;  queue = calloc(self->node_count, sizeof(queue[0]));    // Put all the leaves in a queue  for (i = 0; i < self->node_count; i++)  {    node = self->nodes + i;    if (node->leaf)    {      node->cluster = -1;      assert(queue_count < self->node_count);      queue[queue_count++] = node;      // TESTING; remove      assert(node == pf_kdtree_find_node(self, self->root, node->key));    }  }  cluster_count = 0;  // Do connected components for each node  while (queue_count > 0)  {    node = queue[--queue_count];    // If this node has already been labelled, skip it    if (node->cluster >= 0)      continue;    // Assign a label to this cluster    node->cluster = cluster_count++;    // Recursively label nodes in this cluster    pf_kdtree_cluster_node(self, node, 0);  }  free(queue);  return;}////////////////////////////////////////////////////////////////////////////////// Recursively label nodes in this clustervoid pf_kdtree_cluster_node(pf_kdtree_t *self, pf_kdtree_node_t *node, int depth){  int i;  int nkey[3];  pf_kdtree_node_t *nnode;    for (i = 0; i < 3 * 3 * 3; i++)  {    nkey[0] = node->key[0] + (i / 9) - 1;    nkey[1] = node->key[1] + ((i % 9) / 3) - 1;    nkey[2] = node->key[2] + ((i % 9) % 3) - 1;    nnode = pf_kdtree_find_node(self, self->root, nkey);    if (nnode == NULL)      continue;    assert(nnode->leaf);    // This node already has a label; skip it.  The label should be    // consistent, however.    if (nnode->cluster >= 0)    {      assert(nnode->cluster == node->cluster);      continue;    }        // Label this node and recurse    nnode->cluster = node->cluster;    pf_kdtree_cluster_node(self, nnode, depth + 1);  }  return;}#ifdef INCLUDE_RTKGUI////////////////////////////////////////////////////////////////////////////////// Draw the treevoid pf_kdtree_draw(pf_kdtree_t *self, rtk_fig_t *fig){  if (self->root != NULL)    pf_kdtree_draw_node(self, self->root, fig);  return;}////////////////////////////////////////////////////////////////////////////////// Recursively draw nodesvoid pf_kdtree_draw_node(pf_kdtree_t *self, pf_kdtree_node_t *node, rtk_fig_t *fig){  double ox, oy;  char text[64];    if (node->leaf)  {    ox = (node->key[0] + 0.5) * self->size[0];    oy = (node->key[1] + 0.5) * self->size[1];    rtk_fig_rectangle(fig, ox, oy, 0.0, self->size[0], self->size[1], 0);    //snprintf(text, sizeof(text), "%0.3f", node->value);    //rtk_fig_text(fig, ox, oy, 0.0, text);    snprintf(text, sizeof(text), "%d", node->cluster);    rtk_fig_text(fig, ox, oy, 0.0, text);  }  else  {    assert(node->children[0] != NULL);    assert(node->children[1] != NULL);    pf_kdtree_draw_node(self, node->children[0], fig);    pf_kdtree_draw_node(self, node->children[1], fig);  }    return;}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国一区二区视频| 亚洲曰韩产成在线| 国产xxx精品视频大全| 久久色视频免费观看| 国产麻豆欧美日韩一区| 日本一区二区免费在线 | 99久久夜色精品国产网站| 国产精品国产三级国产专播品爱网| 成人av在线播放网站| 亚洲在线视频免费观看| 欧美性猛交xxxx黑人交| 日本中文字幕不卡| 久久精品欧美日韩精品| 色呦呦一区二区三区| 视频一区二区三区中文字幕| 欧美成人一区二区三区| 成人av综合一区| 亚洲国产裸拍裸体视频在线观看乱了| 欧美一区日本一区韩国一区| 国产精品影视在线观看| 亚洲一区二区三区四区五区黄| 欧美videofree性高清杂交| 福利一区在线观看| 亚洲成人久久影院| 国产日本一区二区| 欧美三级日韩在线| 国产一区二区福利| 亚洲福利一区二区| 久久久久久99久久久精品网站| 91麻豆精品在线观看| 麻豆精品新av中文字幕| 亚洲女人的天堂| 欧美videossexotv100| 在线观看三级视频欧美| 国产精品18久久久久久久久| 亚洲美女区一区| 久久久精品综合| 欧美三级午夜理伦三级中视频| 成人中文字幕在线| 久久精品国产一区二区三区免费看| 亚洲特黄一级片| 国产性天天综合网| 日韩欧美一区二区久久婷婷| 一本大道综合伊人精品热热| 黄色日韩网站视频| 日韩精品国产精品| 一区二区在线观看av| 久久久久久久久99精品| 91精品国产乱码久久蜜臀| 成人app软件下载大全免费| 精品在线免费观看| 婷婷亚洲久悠悠色悠在线播放| 国产精品电影一区二区三区| 欧美成人性战久久| 56国语精品自产拍在线观看| 色综合天天视频在线观看| 国产激情偷乱视频一区二区三区| 亚洲va天堂va国产va久| 亚洲欧美另类小说视频| 国产精品麻豆欧美日韩ww| 日韩美女一区二区三区四区| 欧美日韩高清影院| 欧美在线免费观看亚洲| 久久久久久免费毛片精品| 丝袜美腿亚洲一区| 亚洲精品午夜久久久| 国产精品乱码久久久久久| 日韩欧美一区中文| 欧美日韩日日骚| 色欧美乱欧美15图片| 色综合天天天天做夜夜夜夜做| 风间由美性色一区二区三区| 国产乱子伦视频一区二区三区| 另类小说视频一区二区| 免费视频最近日韩| 日韩成人午夜精品| 毛片av中文字幕一区二区| 青青草成人在线观看| 免费观看30秒视频久久| 捆绑紧缚一区二区三区视频| 韩国三级中文字幕hd久久精品| 久久99九九99精品| 国产精品影视在线| 国产黄色成人av| 成人激情开心网| 91网上在线视频| 欧美日韩国产另类不卡| 91精品国产综合久久久蜜臀图片| 555www色欧美视频| 日韩区在线观看| 国产无一区二区| 国产精品美女www爽爽爽| 亚洲你懂的在线视频| 午夜精品久久久久久久蜜桃app| 婷婷综合另类小说色区| 捆绑调教一区二区三区| 国产精品99久久久久| 99精品视频一区二区三区| 91麻豆精品在线观看| 欧美美女bb生活片| 2021久久国产精品不只是精品| 国产日韩欧美综合一区| 亚洲日本va在线观看| 亚洲福利一二三区| 国产一区二区三区观看| av在线不卡电影| 欧美视频你懂的| 精品国产区一区| 国产精品久久久久一区二区三区| 亚洲一区二区三区不卡国产欧美| 日韩av不卡在线观看| 国产不卡在线播放| 欧美日韩激情在线| 久久久久久久精| 亚洲午夜一二三区视频| 另类小说视频一区二区| 91丝袜国产在线播放| 日韩一区二区三免费高清| 中文字幕+乱码+中文字幕一区| 玉米视频成人免费看| 韩国v欧美v日本v亚洲v| 欧美亚洲自拍偷拍| 久久久久综合网| 亚洲成人三级小说| 成人一道本在线| 9191国产精品| 亚洲青青青在线视频| 狠狠色丁香婷婷综合| 精品视频在线视频| 亚洲小少妇裸体bbw| 国产综合色精品一区二区三区| 欧洲色大大久久| 国产亲近乱来精品视频| 久久精品国产精品亚洲精品| 91成人免费电影| 日本一区二区电影| 麻豆精品视频在线观看| 欧美日韩一级二级| 亚洲三级电影网站| 国产91精品久久久久久久网曝门| 91精品在线一区二区| 亚洲精品乱码久久久久久日本蜜臀| 久久99精品久久久| 欧美日韩精品电影| 一区二区三区小说| 99久久99久久精品免费观看 | 欧美三级视频在线| 亚洲欧美国产77777| 国产suv一区二区三区88区| 日韩情涩欧美日韩视频| 午夜婷婷国产麻豆精品| 91九色02白丝porn| 亚洲色图19p| 99久久婷婷国产精品综合| 国产精品丝袜黑色高跟| 黄色成人免费在线| 精品国产一区a| 麻豆精品国产91久久久久久| 91麻豆精品国产91| 日韩经典一区二区| 在线电影院国产精品| 亚洲.国产.中文慕字在线| 91福利视频网站| 亚洲一区二区在线观看视频 | 中文字幕第一区| 国产精品一二一区| 国产欧美精品一区二区三区四区| 国模一区二区三区白浆| 26uuu成人网一区二区三区| 久久精品久久综合| 久久香蕉国产线看观看99| 黑人巨大精品欧美一区| 久久久精品蜜桃| 国产一区二区不卡在线| 欧美经典三级视频一区二区三区| 国产99久久久国产精品潘金网站| 国产精品色哟哟| 91免费看`日韩一区二区| 亚洲一区视频在线观看视频| 欧美视频在线一区| 日韩国产精品久久久久久亚洲| 欧美一区二视频| 国产资源在线一区| 国产精品高清亚洲| 色老综合老女人久久久| 亚洲国产中文字幕| 日韩三级中文字幕| 国产99久久久精品| 亚洲一区二区三区四区中文字幕| 欧美日韩国产综合一区二区| 免费三级欧美电影| 国产欧美一区二区精品秋霞影院| 99视频一区二区三区| 天堂一区二区在线免费观看| 精品少妇一区二区三区在线播放| 国产盗摄一区二区三区| 亚洲人精品午夜| 欧美一区二区三区日韩| 国产精品亚洲视频| 亚洲精品视频在线观看免费|