【问题标题】:2D Point, to 3D, then back to 2D2D 点,到 3D,然后回到 2D
【发布时间】:2013-02-20 09:27:40
【问题描述】:

图 1: 我在 2d (CoreGraphics) 的图层上绘制贝塞尔曲线,我有 A 点和 B 点。

图2: 我可以将图层旋转大约 70 度。

图 3: 我想通过将图像从 3D 压缩回 2D 来了解 A 和 B 现在的点。

理想情况下我想做的是这样的函数:

-(CGPoint)calculateNewPointFrom:(CGPoint)p withAngle:(float)angle
{
    //Rotate point by angle in 3d space
    //Return new point in 2d space
}

欢迎大家帮忙。谢谢

【问题讨论】:

  • 我对CoreGraphics一无所知,但这只是一个几何问题。您需要应用两个矩阵变换的结果;首先是旋转,然后是投影。您可以将这两个矩阵相乘以获得单个变换。
  • 为什么不实际旋转 3D 图层?
  • @DavidRönnqvist - 当我这样做时,图层将没有真正的深度并且看起来很平坦。我只想要坐标。

标签: objective-c macos core-graphics


【解决方案1】:

如果你有一个点 Q 在 3D 中的坐标:(x, y, z)

并且您想将其投影到一个平面上,该平面包含一个点 P 并具有法线向量 n,

平面方程为

(R - P) . n = 0

我使用向量减法的地方,. 是点积。

由此您可以推断出任何点在该平面上的投影:沿着法线向量n 画一条线,直到它与平面相交。

所以会有一些价值a 这样

Q + a * n 

位于平面内,即

(Q - a * n - P) . n = 0

求解(注意n . n = 1):

a = (Q - P) . n

(注意——这是从 Q 到 P 的“正常距离”;绝非巧合!)

它们相交点的值现在是

Q + ((Q - P) . n ) * n

再次注意 - 我正在使用向量数学,因此最后一个 *n 会产生三个值(因为 n 是 3D 向量)。

如果您尝试在平面上进行非法线投影(例如,您想投影到 XY 平面上,但您正在“查看某个角度”),您可以概括这一点。这种情况下,需要沿着不同的方向m(你看的方向)投影,相交的方程就变成了

Q + ((Q - P) . n ) * m / (m . n)

如你所见,如果 m 与 n 垂直(你是沿着平面看,而不是看它),没有解决方案...

您还可以看到,如果您直接在 XY 平面上进行投影,因此 n = [0 0 1]),整个事情简化为设置 Z=0

让我知道这是否足够,或者您是否需要实际的代码行...

--- 编辑 --- 添加一些简单的代码:

如果您有一系列点 (x, y) 来描述您的曲线,您可以通过以下方式围绕 Z 轴(垂直于您的平面)旋转角度 θ:

x1 = x * cos(theta) - y * sin(theta);
y1 = x * sin(theta) + y * cos(theta);

现在您可以通过简单地减少 y 坐标来“挤压”这些点,使您看起来像是从侧面看它们:

x2 = x1;
y2 = y1 * cos(alpha);

其中alpha 是您查看曲线的表观角度。因此,如果您直接向下看 XY 平面,alpha 为 0,y2 = y1。如果你看 45 度,alphapi/4y2 = 0.707 * y1(大约)。

您可以将这两种转换组合成:

xnew = x * cos(theta) - y * sin(theta);
ynew = cos(alpha) * (x * sin(theta) + y * cos(theta));

尝试一些 theta 值(0 到 0.5 之间,以 0.1 为步长)和 alpha 值(类似的范围可能很好)。看看你是否喜欢这个结果。

也许这对您来说是一个更好(在“更有用”的意义上)的答案?

【讨论】:

  • 嗨,谢谢你,老实说,这有点让我头疼。我的第一个点在 2d 空间中,在 x 轴上应用旋转后,如何在 3d 空间中获得新点?
  • 我有很多阅读工作要做:-) 感谢您的回答,我相信这是有道理的,但我需要做一些学习。我找到了 CGPointApplyAffineTransform,它看起来可能对我有帮助。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 2018-01-30
  • 2013-02-11
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多