首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >鸟瞰或2.5D地图渲染的问题

鸟瞰或2.5D地图渲染的问题
EN

Stack Overflow用户
提问于 2010-09-06 03:51:02
回答 1查看 1.8K关注 0票数 1

我正在开发一个逐个转弯的导航软件,我正在使用以下解决方案将我的道路线变成2.5D或3D视图

Draw 2.5D or 3D Map with C# from lines

然而,上面的解决方案对于0高,或者x>宽,然后上面的解就疯狂了。谁能帮我想出解决这个问题的办法?

使用3D算法的vvvv

不带3D算法的vvvv

更新::使用此代码后

代码语言:javascript
复制
double x = p->x();
double y = p->y();

double t = -0.5;
x = x - w / 2;
y = y - h / 2;
double a = h / (h + y* sin(t));
double u = a * x + w / 2;
double v = a * y * cos(t) + h / 2;

p->setX(u);
p->setY(v);
return p;

地图将如下所示

我认为当Y计算远远超出负值时,就会出现问题。我使用的是Qt,线上的裂缝似乎是Qt渲染器的bug,与我们原来的问题无关。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-09 01:47:21

问题是,您正在使用的转换不会将直线映射为直线。相反,直线通常会变成抛物线。您可以在示例图像中看到,在2D视图中,从顶部到底部的大致笔直的主干道在2.5D视图中转换为曲线道路。如果您将它们拆分成更短的段,您将会看到同样的事情发生在您的示例中“疯狂”的行。

从数学上讲,您可以通过返回到您正在使用的变换来查看发生了什么:

代码语言:javascript
复制
x_ = (x - w/2)*(t1+(y/h)*(t2-t1)) + w/2
y_ = y

如果我们将一条直线表示为x = ay+b,那么这条线上的一个点(ay+b,y)将映射到(ay+b - w/2)*(t1+(y/h)*(t2-t1)) + w/2,y)。这个表达式看起来很复杂,但是您可以看到,对于合适的c,d,e值,它的计算结果类似于(c*y^2+d*y+e,y),这是一条抛物线。

所以最好的办法就是放弃这种转换,转而使用perspective transform

在您的原始问题中,您提到渲染图像的非仿射变换太慢。现在,您似乎已经切换到在渲染线条之前对其进行变换,这已经足够快了。您现在唯一要做的就是更改转换。

这是一个建议的转换。这是几个步骤,并将您的2D (x,y)坐标转换为2.5D (u,v)坐标。我假设您使用的是C#。

代码语言:javascript
复制
t = 0.3 // tilt angle - try different values    
X = x - w/2 ;
Y = y - h/2 ;
a = h/(h + Y*Math.Sin(t)) ;
u = a*X + w/2 ;
v = a*Y*Math.Cos(t) + h/2 ;

这里有一个参数t,它定义了倾斜量,以弧度表示。我建议使用0.3左右的值,正负。

我已经用铅笔和纸解决了这个问题,但没有运行它,所以如果这不起作用,请告诉我。总是有可能出现转录错误。

更新:您希望避免绘制任何具有点(x,y)的实体(直线、多边形等),从而使a为非正数。更好的是,为了避免溢出,您应该避免在a<epsilon时绘制,其中epsilon是一些小的正值,如0.05或0.1。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3647532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档