我正在开发一个逐个转弯的导航软件,我正在使用以下解决方案将我的道路线变成2.5D或3D视图
Draw 2.5D or 3D Map with C# from lines
然而,上面的解决方案对于0高,或者x>宽,然后上面的解就疯狂了。谁能帮我想出解决这个问题的办法?
使用3D算法的vvvv

。
不带3D算法的vvvv

更新::使用此代码后
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,与我们原来的问题无关。
发布于 2010-09-09 01:47:21
问题是,您正在使用的转换不会将直线映射为直线。相反,直线通常会变成抛物线。您可以在示例图像中看到,在2D视图中,从顶部到底部的大致笔直的主干道在2.5D视图中转换为曲线道路。如果您将它们拆分成更短的段,您将会看到同样的事情发生在您的示例中“疯狂”的行。
从数学上讲,您可以通过返回到您正在使用的变换来查看发生了什么:
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#。
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。
https://stackoverflow.com/questions/3647532
复制相似问题