我正在尝试制作一个适合四边形的图像。
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
GtkWidget (*Image) = gtk_image_new_from_file("image.png");
GtkWidget (*Window) = gtk_window_new(0);
gtk_image_set_pixel_size(GTK_IMAGE(Image), 200);
gtk_container_add(GTK_CONTAINER(Window), Image);
gtk_widget_show_all(Window);
gtk_main();
return 0;
}
假设我有 8 个变量。每个对应于四边形的顶点。 x1 y1 x2 y2 x3 y3 x4 y4
这八个数字对应于窗口/绘图区域上可用于构造四边形的四个点。这些数字代表距窗口左侧 x
像素和距窗口顶部 y
像素的点,由于有 4 个,因此这些数字代表哪一个。很长一段时间以来我一直在试图解决这个问题。我如何使用它们创建一个四边形,并拉伸(stretch)图像以适合内部?另外,如果可能的话,我想避免包含标准头文件和 gtk 以外的头文件。基本上我需要从方形文件中加载图像,然后将其转换以匹配所需的形状。我到底该怎么做?不要以为我是在尝试编辑图像文件,我实际上是在尝试为 block 沙盒游戏渲染 block 面。
我非常感谢您的帮助,但我仍然不太知道如何执行我所描述的操作。我需要知道的是我是否应该使用 GtkDrawingArea
?
I think I found something for the Mac version of what I am looking for ,但是我如何在 GTK 中做到这一点?
有关更多信息,我正在尝试以 3D 游戏的形式渲染纹理。
在 Metal 教程中,这是首先教授的功能之一。这在 GTK/Cairo 中可行吗?还是我需要放弃我的进度并使用 OpenGL 或 Linux 上的其他东西。
最佳答案
你所说的是任意线性变换。由于 Gtk 是建立在 cairo 图形之上的,因此您非常适合查看其中 ( https://www.cairographics.org/manual/cairo-Transformations.html )。所有线性变换都可以用变换矩阵表示,cairo 将其用作其绘图模型的一部分。然而,它确实说它是一个仿射矩阵,这意味着保留了平行线(即并非所有线性变换都可以表示,并且您的四边形也必须是平行四边形)。
仿射矩阵的使用对于许多图形后端来说很常见。如果您想解决任意扭曲(例如透视)的问题,那么使用 ImageMagick(以 FFMPEG 作为后端)将是一个很好的方法。 OpenGL 也将具有这些功能(例如,在 3D 中,您需要它来进行正交投影。)
为了获得变换矩阵,您需要求解一组联立方程。有助于实现此目的的软件包括 libBLAS、Eigen 和 OpenCV。
关于c - 如何在 GTK 或 Cairo 中将纹理应用到四边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55602612/