求三角形内任意一点到另一个三角形上的映射坐标点

笔者最近的一个工作任务中需要修改3d模型上某个点对应的纹理贴图像素值。(这里不过多描述什么是3d模型的纹理贴图及uv纹理坐标,具体概念可参考博文“uv纹理坐标设定与贴图规则”:http://www.cnblogs.com/jenry/p/4083415.html)

主要的问题概况为:

已知两个三角形具有线性映射关系,且已知三角形T1的三个顶点坐标A,B,C,以及三角形内一点P坐标,已知映射三角形T2的三个顶点坐标A',B',C',求点P在三角形T2内的映射坐标点P'。

google搜索到“Barycentric coordinate system”(重心坐标系)的概念感觉可以用,引用wiki上一张图片直观表达什么是三角形的仿射不变性:

求三角形内任意一点到另一个三角形上的映射坐标点_第1张图片

图片引用自:重心坐标系概念链接(wiki)https://en.wikipedia.org/wiki/Barycentric_coordinate_system


得知三角形内任意一点可表示为P = k1 * A + k2 * B + k3 * C,且k1 + k2 + k3 = 1.

查资料得知k1,k2,k3与三角形的面积相关,具有以下关系:

k1 = Square_BCP / Square_ABC;

k2 = Square_ACP / Square_ABC;

k3 = Square_ABP / Square_ABC;

由上面关系可求得三角形T1内任意点P映射到三角形T2内的坐标点为P' = k1 * A' + k2 * B' + k3 * C'.


整理相关求解过程为:

1.求三角形ABC/ABP/ACP/BCP的面积,分别表示为Square_ABC/Square_ABP/Square_ACP/Square_BCP.

2.根据面积比值,求出k1,k2,k3。

3.由公式P' = k1 * A' + k2 * B' + k3 * C'可求得映射坐标点P'。


附已知三角形三个顶点求三角形面积的公式:

1.求cosA = (|AB|^2 + |AC|^2 - |BC|^2 ) / 2 * |AB| * |AC|

2.求sinA = √(1 - cosA ^2)

3.Square_ABC = 1/2 * |AB| * |AC| * sinA




你可能感兴趣的:(求三角形内任意一点到另一个三角形上的映射坐标点)