graphics - 在 SWI(或任何)Prolog 中绘图

标签 graphics prolog drawing

是否可以在 SWI prolog 中绘制形状?有打印语句,但我还没有找到任何可以让我像 javascript Canvas 一样绘制矩形的东西。

这是 Prolog 在概念上能够做到的事情吗?

我是不是问错问题了?

最佳答案

Prolog 是一种具有成熟库的通用图灵完备编程语言,所以肯定是的。有不止一种方法可以做到这一点。除了简单地生成图像文件之外,还可以为您提供一些想法。

你可以设置一个WebSocket连接到托管 Canvas 的网页或 SVG元素并向其发送绘图命令或包含 SVG 的 XML block 。这样您就不必学习任何深奥的或特定于 Prolog 的绘图库,而是可以依赖 Canvas、SVG 和任何相关工具的丰富性和广泛使用,同时功能齐全的 Prolog 可用于逻辑/结构你的画。

如果需要Prolog两边都可用,可以设置TauProlog在浏览器中,或者如果没有,您可以在后端 Prolog 中生成 SVG 标记或 Canvas 绘图命令。网页可以包含自定义代码(vanilla JS 或 TauProlog)来处理传入的命令并转换它们以应用于 Canvas 或 SVG 元素。如果需要,该页面还可以反馈到后端,以便纯 Prolog 绘图逻辑可以检查屏幕上发生的事情。或者,您甚至可以合并交互式元素,例如反馈给绘图代码的按钮。

随着 Prolog 在后台运行,您可以利用任何 .svg 或 Prolog 的其他图像生成插件,例如 graphviz,然后将输出发送到网页以与SVG 或渲染到 Canvas 中(Paper.js 可以导入 .svg 文件,见下文)。 SVG 还允许嵌入完整的 HTML 元素甚至 HTML 内容 block ,这些内容可用于添加支持元素或用于交互。

我不知道任何开箱即用的具体工作示例(尽管我打算从事类似的工作)但是您应该能够找到 Prolog<-WS->Browser 的工作示例(甚至 -> TauProlog ) 设置。通过在浏览器中运行 TauProlog,可以从 WS 连接卸载 Prolog 和渲染之间某些类型的较重流量,以防绘图逻辑需要对循环期间渲染的内容进行大量检查。

要使用开箱即用的栅格和矢量实用程序处理 Canvas ,您可以使用 Paper.js而不是普通的 Javascript Canvas API。

您还可以在浏览器中运行完整的 SWI Prolog(编译为 WebAssembly),既可以独立执行,也可以作为后端运行的补充。参见 https://github.com/SWI-Prolog/swipl-wasm (我自己还没有测试过)。

让我补充一点,基于浏览器的 UI(应用程序)可以很容易地打包为本地运行的桌面应用程序,您只需在其中隐藏(嵌入)一个 SWI-Prolog(或任何其他实现)服务器,以使其完全脱机工作,或将其作为 WebAssembly 模块运行。或者对于移动应用程序,Prolog 后端可以在云端运行。

关于graphics - 在 SWI(或任何)Prolog 中绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62009376/

相关文章:

Java JFrame 图形更新

java - Java Advanced Imaging API 中的快速透视变换

java - 在java图形中使用鼠标点击绘制三角形

java - 从左上角绘制点击之间的绘制线

haskell - 开罗用填充图案填充多边形

java - JPanel的自动重绘

database - 动态数据库 - 包括和排除文件

prolog - 从一个顶点到所有其他可到达节点的所有简单路径

database - 在这种特殊情况下如何使用 retract 删除重复项?

iphone - 设置背景 View 时在 UITableViewCell 中画一条线