- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 spatial indexing 的模板类默认情况下,它适用于任何实现函数 void boundingBox( Rect2d * box )
的二维对象使用 std::vector<OBJECT*>
作为插入特定网格瓦片中的对象的容器。
template <class OBJECT, class TILE = std::vector<OBJECT*> >
class GridMap2D {
public:
double step, invStep;
int nx, ny, nxy;
TILE * tiles;
// ==== functions
inline int getIx( double x ){ return (int)( invStep * x ); };
inline int getIy( double y ){ return (int)( invStep * y ); };
inline double getX( int ix ){ return step * ix ; };
inline double getY( int iy ){ return step * iy ; };
inline int getIndex ( int ix, int iy ){ return nx*iy + ix; };
inline int getIndex ( double x, double y ){ return getIndex( getIx(x), getIy(y) ); };
inline TILE* getTile( double x, double y ){ return tiles + getIndex( x, y ); };
inline void insert( OBJECT* p, int i ){
tiles[ i ].push_back( p );
}
inline void insert( OBJECT* p, int ix, int iy ){ insert( p, getIndex( ix,iy ) ); };
// this is very general method to insert any object with bounding box
// but for many object it is not very efficient
// some objects suchb as Point2d does not even implement boundingBox()
inline void insert( OBJECT* p ){
Rect2d bbox;
p.boundingBox( &bbox );
int ix0 = getIx( bbox.x0 ); // TODO: bound check ?
int iy0 = getIy( bbox.y0 );
int ix1 = getIx( bbox.x1 );
int iy1 = getIy( bbox.y1 );
for( int iy=iy0; iy<=iy1; iy++ ){
for( int ix=ix0; ix<=ix1; ix++ ){
insert( p, ix, iy );
}
}
}
void init( int nx_, int ny_, double step_, int tile_n0 ){
step = step_;
invStep = 1/step;
nx = nx_; ny=ny_;
nxy = nx*ny;
tiles = new TILE[ nxy ];
for (int i=0; i<nxy; i++){
if ( tile_n0 != 0 ){
tiles[i].reserve( tile_n0 );
}
}
}
};
及其对 Segment2d
的特化没有实现 boundingBox()
但有自己的insert
基于线光栅化的算法:
template<> class GridMap2D< Segment2d, std::vector<Segment2d*> >{
public:
inline void insert( Segment2d* l ){
Vec2d* a = l->a;
Vec2d* b = l->b;
double ax = a->x;
double ay = a->y;
double bx = b->x;
double by = b->y;
double dx = fabs( bx - ax );
double dy = fabs( by - ay );
int dix = ( ax < bx ) ? 1 : -1;
int diy = ( ay < by ) ? 1 : -1;
int ix = getIx( ax );
int iy = getIy( ay );
int ixb = getIx( bx );
int iyb = getIy( by );
double x=0, y=0;
int i=0;
insert( l, ix, iy );
insert( l, ixb, iyb );
while ( ( ix != ixb ) && ( iy != iyb ) ) {
if ( x < y ) {
x += dy;
ix += dix;
} else {
y += dx;
iy += diy;
}
insert( l, ix, iy );
}
}
};
但我对模板的工作方式有几个问题:
特化Segment2d
我得到了 error: ‘getIx’ was not declared in this scope
.这是否意味着专用模板不知道基本模板中定义的功能?或者我可能错误地进行了特化。我真的不想多次重写代码,那么模板方法就没有意义了。
我不确定当我通过一些参数实例化或专门化模板时会发生什么,这些参数没有实现基本模板使用的某些方法。例如
TILE
没有实现 .push_back()
Segment2d
不执行 boundingBox()
特化能解决这个问题吗?背景:
我有两个目标:
我想创建非常快速的空间索引,以加速任何二维形状的光线转换和碰撞。
virtual
的一些类继承层次结构方法。我想学习如何有效地使用模板
这个问题与这个“Generic Quadtree”有关,建议使用模板来完成类似的任务。试图实现它......但我可能对模板的理解还不够好。
注意:我的 GridMap2d 不是 QuadTree,但我仍然添加了 QuadTree 作为关键字,因为问题与其相关。四叉树是非常常见的空间索引数据结构,使用模板实现它会遇到同样的问题。
最佳答案
“我真的不想多次重写代码,那么模板方法就没有意义了。”
当您专门化一个类时,您不会“继承”任何成员字段或方法。所以你需要一些特殊的技巧来得到你想要的。
您可以做的实际上是将 insert()
方法的行为移动到一个单独的模板类中。这样,当您专门化该类的行为时,您最终不会破坏其他字段和方法。这需要对您的代码进行一些巧妙的重组。
我认为这段代码应该可以完成这项工作:
struct GridMap2D_base {
double step, invStep;
int nx, ny, nxy;
int getIx( double x ) const { return (int)( invStep * x ); };
int getIy( double y ) const { return (int)( invStep * y ); };
double getX( int ix ) const { return step * ix ; };
double getY( int iy ) const { return step * iy ; };
int getIndex ( int ix, int iy ) const { return nx*iy + ix; };
int getIndex ( double x, double y ) const { return getIndex( getIx(x), getIy(y) ); };
};
struct PushBackHelper {
// add versions of this for std::list, etc., as needed
template <typename OBJECT>
static void push_back(std::vector<OBJECT*>& tile, OBJECT* p) {
tile.push_back(p);
}
};
template<typename OBJECT>
struct InsertAlgorithm {
int ix0, iy0, ix1, iy1, ix, iy;
InsertAlgorithm(const GridMap2D_base& base, OBJECT* p) {
Rect2d bbox;
p->boundingBox( &bbox );
ix0 = base.getIx( bbox.x0 ); // TODO: bound check ?
iy0 = base.getIy( bbox.y0 );
ix1 = base.getIx( bbox.x1 );
iy1 = base.getIy( bbox.y1 );
ix = 0;
iy = 0;
}
bool should_preinsert1(const GridMap2D_base& base, int& ix2, int& iy2) { return false; }
bool should_preinsert2(const GridMap2D_base& base, int& ix2, int& iy2) { return false; }
bool should_insert(const GridMap2D_base& base, int& ix2, int& iy2)
{
while (ix<=ix1) {
ix2 = ix;
iy2 = iy;
ix++;
return true;
}
iy++;
if (iy>iy1) return false;
ix = 0;
return should_insert(base, ix2, iy2);
}
};
template<> struct InsertAlgorithm<Segment2d> {
Vec2d* a;
Vec2d* b;
double ax, ay, bx, by, dx, dy, x, y;
int dix, diy, ix, iy, ixb, iyb;
InsertAlgorithm(const GridMap2D_base& base, Segment2d* l) {
a = l->a;
b = l->b;
ax = a->x;
ay = a->y;
bx = b->x;
by = b->y;
x = 0;
y = 0;
dx = fabs( bx - ax );
dy = fabs( by - ay );
dix = ( ax < bx ) ? 1 : -1;
diy = ( ay < by ) ? 1 : -1;
ix = base.getIx( ax );
iy = base.getIy( ay );
ixb = base.getIx( bx );
iyb = base.getIy( by );
}
bool should_preinsert1(const GridMap2D_base& base, int& ix2, int& iy2) {
ix2 = ix;
iy2 = iy;
return true;
}
bool should_preinsert2(const GridMap2D_base& base, int& ix2, int& iy2) {
ix2 = ixb;
iy2 = iyb;
return true;
}
bool should_insert(const GridMap2D_base& base, int& ix2, int& iy2)
{
if (ix==ixb && iy==iyb) return false;
if ( x < y ) {
x += dy;
ix += dix;
} else {
y += dx;
iy += diy;
}
ix2 = ix;
iy2 = iy;
return true;
}
};
template<class OBJECT, typename TILE=std::vector<OBJECT*> >
class GridMap2D : public GridMap2D_base {
public:
TILE* tiles;
TILE* getTile( double x, double y ){ return tiles + getIndex( x, y ); };
void insert( OBJECT* p ){
InsertAlgorithm<OBJECT> algo(*this, p);
int ix = 0;
int iy = 0;
if (algo.should_preinsert1(*this, ix, iy)) {
PushBackHelper::push_back(tiles[getIndex(ix, iy)], p);
}
if (algo.should_preinsert2(*this, ix, iy)) {
PushBackHelper::push_back(tiles[getIndex(ix, iy)], p);
}
while (algo.should_insert(*this, ix, iy)) {
PushBackHelper::push_back(tiles[getIndex(ix, iy)], p);
}
}
void init( int nx_, int ny_, double step_, int tile_n0 ){ ... }
};
顺便说一下,the inline
keyword has no effect when used within the class declaration .
关于c++ - 使用 C++ 模板对任何形状进行空间索引 2D map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34700238/
这几天我一直在努力。我一直在自学 CSS,所以对菜鸟好一点。我正在创建一个推荐 slider 。推荐以 3 个 block 显示。我希望前 2 个下降,第 3 个上升。但是当 slider 激活时,无
我最近开始学习 Nodejs,现在我很困惑我的网络应用程序使用什么,html 还是 ejs (Express)。 Ejs 使用 Express 模块,而 .html 使用 HTML 模块。我的第一个问
假设我们有一个 PostgreSQL 表contacts,每条记录都有一堆带标签的电子邮件地址(标签和电子邮件对)——其中一个是“主要”。 存储方式如下: id 主键 电子邮件 文本 email_la
我成功为一种新的tesseract语言编写了traineddata文件,但是当我完成时,我继续收到以下错误: index >= 0 && index = 0 && 索引 < size_used_ :E
这个问题已经有答案了: How to deal with SettingWithCopyWarning in Pandas (21 个回答) 已关闭 4 年前。 假设我有一个像这样的数据框,第一列“密
如果我有一个位置或行/列同时用于 A 和 B 位置,请检查 B 是否与 A 成对角线? 1 2 3 4 5 6 7 8 9 例如,我如何检查 5 是否与 7 成对角线? 此外,如果我检查 4 是
MongoDB:索引 一、 创建索引 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引 > db.user.getIndexes() [ { "v
一、索引介绍 索引是一种用来快速查询数据的数据结构。 B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。 MongoDB不使用索引
我无法决定索引。 就像我有下面的查询需要太多时间来执行: select count(rn.NODE_ID) as Count, rnl.[ISO_COUNTRY_CODE] as Cou
我有这些表: CREATE TABLE `cstat` ( `id_cstat` bigint(20) NOT NULL, `lang_code` varchar(3) NOT NULL,
我正在尝试找到一种方法来提高包含 IP 范围的 mysql 表的性能(在高峰时段每秒最多有 500 个 SELECT 查询(!),所以我有点担心)。 我有一个这种结构的表: id smallint(
jquery index() 似乎无法识别元素之一,总是说“无法读取未定义的属性‘长度’”这是我的代码。mnumber 是导致问题的原因。我需要 number 和 mnumber 才能跟踪使用鼠标,并
我们有一个包含近 4000 万条记录的 MongoDB 集合。该集合的当前大小为 5GB。此集合中存储的数据包含以下字段: _id: "MongoDB id" userid: "user id" (i
文档说:如果你有多个字段的复合索引,你可以用它来查询字段的开始子集。所以如果你有一个索引一个,乙,丙你可以用它查询一种一个,乙a,b,c 我的问题是,如果我有一个像这样的复合索引一个,乙,丙我可以查询
我正在使用 $('#list option').each(function(){ //do stuff }); 循环列表中的选项。我想知道如何获取当前循环的索引? 因为我不想让 var i = 0;循
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL
SQLite 索引(Index) 索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。
我是 RavenDB 的新手。我正在尝试使用多 map 索引功能,但我不确定这是否是解决我的问题的最佳方法。所以我有三个文件:Unit、Car、People。 汽车文件看起来像这样: { Id: "
我有以下数据,我想根据范围在另一个表中建立索引 我想要实现的是,例如,如果三星的销售额为 2500,则折扣为 2%,低于 3000 且高于 1000 我知道它可以通过索引来完成,与多个数组匹配,然后指
我正在检查并删除 SQL 数据库中的重复和冗余索引。 所以如果我有两个相同的索引,我会删除。 例如,如果我删除了重叠的索引... 索引1:品牌、型号 指标二:品牌、型号、价格 我删除索引 1。 相同顺
我是一名优秀的程序员,十分优秀!