嗨,我正在尝试创建仿射变换,使我可以将一个三角形变换为另一个三角形。我所拥有的是2个三角形的坐标。你能帮助我吗?
按照亚当·罗森菲尔德的回答,我想出了这段代码,以防万一有人无聊地自己解决方程:
public static AffineTransform createTransform(ThreePointSystem source,
ThreePointSystem dest) {
double x11 = source.point1.getX();
double x12 = source.point1.getY();
double x21 = source.point2.getX();
double x22 = source.point2.getY();
double x31 = source.point3.getX();
double x32 = source.point3.getY();
double y11 = dest.point1.getX();
double y12 = dest.point1.getY();
double y21 = dest.point2.getX();
double y22 = dest.point2.getY();
double y31 = dest.point3.getX();
double y32 = dest.point3.getY();
double a1 = ((y11-y21)*(x12-x32)-(y11-y31)*(x12-x22))/
((x11-x21)*(x12-x32)-(x11-x31)*(x12-x22));
double a2 = ((y11-y21)*(x11-x31)-(y11-y31)*(x11-x21))/
((x12-x22)*(x11-x31)-(x12-x32)*(x11-x21));
double a3 = y11-a1*x11-a2*x12;
double a4 = ((y12-y22)*(x12-x32)-(y12-y32)*(x12-x22))/
((x11-x21)*(x12-x32)-(x11-x31)*(x12-x22));
double a5 = ((y12-y22)*(x11-x31)-(y12-y32)*(x11-x21))/
((x12-x22)*(x11-x31)-(x12-x32)*(x11-x21));
double a6 = y12-a4*x11-a5*x12;
return new AffineTransform(a1, a4, a2, a5, a3, a6);
}
我假设您在这里谈论2D。仿射变换矩阵中有9个值:
| a1 a2 a3 |
A = | a4 a5 a6 |
| a7 a8 a9 |
有3个顶点输入x1
,x2
和x3
,当其转化应该成为y1
,y2
,y3
。然而,由于我们在齐次坐标的工作,应用A
到x1
不一定给y1
-它给人的倍数y1
。所以,我们也有未知的乘法器k1
,k2
以及k3
,用公式:
A * x1 = k1 * y1
A * x2 = k2 * y2
A * x3 = k3 * y3
每一个都是一个向量,因此我们实际上有12个未知数中的9个方程,因此html" target="_blank">解决方案将受到约束。如果我们要求a7=0
,a8=0
以及a9=1
,然后将溶液将是唯一的(这种选择是自然的,因为这意味着如果输入点为(x
,y
,1),则输出点总是有齐次坐标1,因此所得到的变换是只是2x2转换和翻译)。
因此,这将等式简化为:
a1 * x11 + a2 * x12 + a3 = k1 * y11
a4 * x11 + a5 * x12 + a6 = k1 * y12
1 = k1
a1 * x21 + a2 * x22 + a3 = k2 * y21
a4 * x21 + a5 * x22 + a6 = k2 * y22
1 = k2
a1 * x31 + a2 * x32 + a3 = k3 * y31
a4 * x31 + a5 * x32 + a6 = k3 * y32
1 = k3
因此,k1
= k2
= k3
=1。将其插入并转换为矩阵形式可得出:
| x11 x12 1 0 0 0 | | a1 | | y11 |
| x21 x22 1 0 0 0 | | a2 | | y21 |
| x31 x32 1 0 0 0 | * | a3 | = | y31 |
| 0 0 0 x11 x12 1 | | a4 | | y12 |
| 0 0 0 x21 x22 1 | | a5 | | y22 |
| 0 0 0 x31 x32 1 | | a6 | | y32 |
解决此6x6方程组可得出仿射变换矩阵A
。当且仅当源三角形的3个点不是共线时,它将具有唯一的解决方案。
问题内容: 我正在尝试制作一个程序,该程序需要用户输入诸如三角形应该多长时间及其方向。我的问题是,在我运行该程序后,它会继续向程序中添加更多的数字。 例如 我的代码: 问题答案: 你有。对于while循环的每个循环,这将继续将输入添加到变量中。您可能想要的只是。 要使其在每次迭代中再次打印出您的第一个提示,只需将您的调用放入while循环内即可。(它也必须先出现,以便 在 输入输入 之前 显示提示
本文向大家介绍用CSS绘制一个三角形相关面试题,主要包含被问及用CSS绘制一个三角形时的应答技巧和注意事项,需要的朋友参考一下
本文向大家介绍使用svg画一个三角形相关面试题,主要包含被问及使用svg画一个三角形时的应答技巧和注意事项,需要的朋友参考一下 手写SVG: 效果 说明 定义svg元素 定义svg的画布大小,指的是x、y偏移为,宽高为(相对单位) 定义一个路径元素 定义路径的填充颜色 定义各个顶点的位置 移动到点,开始新路径绘制 水平绘制直线至,该操作等同于 绘制直线至点 闭合子路径
本文向大家介绍如何用CSS 画一个三角形?相关面试题,主要包含被问及如何用CSS 画一个三角形?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 三角形原理:边框的均分原理
第二课: 画第一个三角形 这将又是一篇长教程。 用OpenGL 3实现复杂的东西很方便;为此付出的代价是,画一个简单的三角形变得比较麻烦。 不要忘了,定期复制粘贴,跑一下代码。 如果程序启动时崩溃了,很可能是你从错误的目录下运行了它。请仔细地阅读第一课中讲到的如何配置Visual Studio! 顶点数组对象(VAO) 你需要创建一个顶点数组对象,并将它设为当前对象(细节暂不深入): GLuint
问题内容: 您好,我也有4个点,而我将有4个三角形,如何检查每个点的这四个三角形,无论该点是否在三角形内。谢谢 问题答案: 实现接口,该接口提供了几种方法。这是一个简单的例子。