gpt4 book ai didi

language-agnostic - 用于绘制几何图的语言或包

转载 作者:行者123 更新时间:2023-12-03 01:15:15 28 4
gpt4 key购买 nike

我正在寻找一种语言或现有语言的包,它适合指定和绘制几何图。

例如,我想画一个六边形网格,其上叠加有双三角形网格。现在,我可以坐下来,手动计算出三角函数,并提出一些可以显示此类网格的 Postscript 或 SVG。但我想知道是否有任何语言或软件包可以帮助我解决这个问题;这使得指定六边形网格、找到中心并在其上绘制三角形网格变得容易。

最简单的方法是什么?

代码示例,显示创建这种几何指定的图表是多么容易,我们将不胜感激。特别是,请演示绘制六边形网格是多么容易;虽然我可以用任何语言通过手工绘制所有线条来做到这一点,但我对使这种几何图变得简单明了的语言或包感兴趣。

赏金

由于这个问题已经得到解答,但答案比我想要的更复杂,我将向那些能够以任何现有语言并使用任何现有语言生成最短和最简单代码的人提供赏金包,用于绘制六边形网格,其上叠加有双三角形网格;双三角网格是将每个六边形的中心连接到每个相邻六边形的中心时得到的三角网格。请参阅Antal S-Z's回答例如;他的例子可以完成这项工作,但我一直在寻找一种可以使这个问题变得更容易的语言。您可以生成一个大致矩形的网格,如他的示例所示(奇数行对齐,偶数行对齐),也可以生成 Hex 样式的网格。板(每行向右移动半个六角形,形成菱形);两者都可以接受。

程序可以以函数或子例程的形式获取输入,该语言采用多个行和多个列,或者获取在命令行上传递的指示行和列的输入。它应该以任何标准和常见图形格式生成输出,例如 Postscript、PDF、SVG、PNG 或 PNM ;输出应包含六角网格和三角形网格,并采用某种对比色、线宽或线条样式,以使图表清晰。

我正在寻找最短和最简单的答案,作为找到最适合描述此类图表的语言或包的方法;赏金将用于解决问题的最短程序。这不是代码高尔夫,所以我不会按字符数或代码行数进行计数。如果没有明显的最短答案,那么我将根据 token 数进行衡量;用你的语言需要多少个标记来表达这个问题?因此,可读的常量和变量名、使用库函数、注释、空格等都可以,因为它们不会增加标记计数。它仍然不是一个完美的度量(Lisps 将有更多的标记,因为你需要更多的括号来分隔算术表达式,而且我确信如果你过度优化这个度量,你仍然可以生成一些不可读的代码),但它是关于代码复杂程度的粗略指南。

因此,对于赏金来说,挑战是创建最短的程序,绘制一个六边形网格及其叠加的三角形网格。请发布您的代码、您使用过的语言和任何包的链接、粗略的 token 计数(如果可能)以及示例输出图像。现有的答案是你必须超越的标准才能获得资格;它可以完成工作,但我想要更短、更简单的东西。

为了给我足够的时间查看答案并授予赏金,所有答案必须在赏金截止日期前至少 24 小时提交。我可能会也可能不会考虑在截止日期前 24 小时内提交的任何答案。

最佳答案

我还想推荐 PGF/TikZ,但需要注意的是它是用 TeX 编写的。如果您不习惯进行 TeX 编程,可能会有点头疼,因为有一些……特性。 (例如,处理杂散空间可能是一次冒险。)不过,如果您愿意进行 TeX 编程,我强烈推荐您这样做;即使我不使用 TeX,我也经常使用它来绘制图形。此外,its manual绝对令人惊叹,并且 TeXample gallery有大量很好的例子。

绘制六角网格并对其进行三角测量的示例代码如下。我承认它很长,但我认为它确实没有那么糟糕。

\documentclass{article}

\usepackage{tikz}
\usepackage{ifthen}

\usetikzlibrary{calc}
\usetikzlibrary{shapes.geometric}

\tikzset{hexagon/.style={regular polygon, regular polygon sides = 6}}

\newif\ifHexgridTriangulate
\newif\ifHexgridStartShifted
\pgfqkeys{/hexgrid}
{ name/.store in = \HexgridName
, xpos/.store in = \HexgridX
, ypos/.store in = \HexgridY
, rows/.store in = \HexgridRows
, cols/.store in = \HexgridCols
, size/.code = {\pgfmathsetmacro{\HexDiameter}{#1}}
, triangulate/.is if = HexgridTriangulate
, start shifted/.is if = HexgridStartShifted }

\tikzset{ every hexgrid hex/.style 2 args = {draw}
, every hexgrid triangulator/.style = {}}

\newcommand{\hexgrid}[2][]{
\pgfqkeys{/hexgrid}{ name = hexgrid , size = 1cm
, xpos = 0 , ypos = 0
, triangulate = false
, start shifted = false
,#2 }

\ifHexgridStartShifted
\def\HexShiftModCheck{0}
\else
\def\HexShiftModCheck{1}
\fi

\begin{scope}[xshift=\HexgridX, yshift=\HexgridY,#1]
\pgfmathsetmacro{\HexRadius}{\HexDiameter/2}
\pgfmathsetmacro{\HexSide}{sqrt(3)*\HexRadius/2}
\pgfmathsetmacro{\HexWidth}{2*\HexSide}

\tikzset{every node/.style={hexagon, minimum size=\HexDiameter}}

\foreach \row in {1,...,\HexgridRows} {
\foreach \col in {1,...,\HexgridCols} {
\pgfmathsetmacro{\HexX}%
{\HexWidth*( (\col-1)
+ (mod(\row,2) == \HexShiftModCheck
? 0 : .5))}
\pgfmathsetmacro{\HexY}%
{-(\HexRadius + \HexSide/2 + 2*\pgflinewidth)*(\row-1)}
\node [hexagon, rotate=90, every hexgrid hex = {\row}{\col}]
(\HexgridName-\row-\col)
at (\HexX pt ,\HexY pt)
{} ;
}
}

\ifHexgridTriangulate
\begin{scope}[every path/.style={every hexgrid triangulator}]
\foreach \row in {1,...,\HexgridRows} {
\foreach \col in {1,...,\HexgridCols} {
% Using \pgfmathsetmacro always includes a decimal point, which
% breaks \ifnum.
\pgfmathparse{int(\row-1)}\let\prow\pgfmathresult
\pgfmathparse{int(\col-1)}\let\pcol\pgfmathresult

\ifnum\prow>0
\draw (\HexgridName-\prow-\col.center)
-- (\HexgridName-\row-\col.center) ;
\fi
\ifnum\pcol>0
\draw (\HexgridName-\row-\pcol.center)
-- (\HexgridName-\row-\col.center) ;
\fi
\ifnum\prow>0\ifnum\pcol>0
\pgfmathparse{mod(\prow,2) == \HexShiftModCheck}
\ifnum\pgfmathresult=1
\draw (\HexgridName-\prow-\col.center)
-- (\HexgridName-\row-\pcol.center) ;
\else
\draw (\HexgridName-\prow-\pcol.center)
-- (\HexgridName-\row-\col.center) ;
\fi
\fi\fi
}
}
\end{scope}
\fi
\end{scope}
}

\begin{document}

\begin{center}\begin{tikzpicture}
% Simplest case
\hexgrid{rows = 5, cols = 5}

% Every possible option at once
\hexgrid[ every hexgrid hex/.style 2 args = {ultra thick, draw=blue}
, every hexgrid triangulator/.style = {color=black!75} ]
{ name = thg , size = 1.5cm
, xpos = 0 , ypos = -5cm
, rows = 5 , cols = 5
, triangulate
, start shifted}
% Mark the center of that grid, just because we can.
\filldraw [red] (thg-3-3) circle (2pt) ;
\end{tikzpicture}\end{center}

\end{document}

\newcommand{\hexgrid} 之前的代码仅包含所需的包并设置关键字参数:name 设置用于引用六边形的名称, size 设置每个六边形的角到角大小,xposypos 定位整个网格的左上角, rowscols 确定六边形的数量,triangulate 选项允许您选择对网格进行三角测量,startshift 选项第一行开始缩进,而不是第二行。我们还允许用户在 \hexgrid 的第一个可选参数中传递样式命令; 每个 hexgrid hex/.style 2 args 将允许他们设置各个六边形的样式(如果需要,甚至可以查询该六边形的位置),以及每个 hexgrid triangulator/.style > 将允许他们设置三角测量线的样式。

跳过一点,我们来到 \pgfsetmacro 行;六边形的直径是指定的,因此我们必须计算半径、边长,然后计算边到边的宽度。以下两个 \foreach 循环是绘图代码的核心,希望应该非常清晰。请注意,在确定垂直放置时,我们必须考虑线条的粗细。之后是一个更长的代码块,位于 \ifHexgridTriangulate\fi 之间;如果需要的话,它负责对网格进行三角测量。

最后,我们看看它是什么样子的:

Example hex grids.

关于language-agnostic - 用于绘制几何图的语言或包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4005042/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com