我一直致力于在 1x1 网格上生成一层随机旋转和放置的正方形。我已经能够生成一个在网格上随机放置和旋转的正方形,但我不确定如何改进代码以生成更多彼此不相交的随机正方形。当前代码如下所示:
from math import cos, pi, sin
from random import randint
from matplotlib.mlab import frange
from matplotlib.pyplot import plot, axis, show
def flake_position_layer1(): #Determines the initial position of one corner of the square
x0 = randint(0, 100) / 100
y0 = randint(0, 100) / 100
theta = randint(0, 90) * pi / 180 #Angle of rotation for the square
return x0, y0, theta
def flake_shape(): #generates the other 3 corners of the square
x0, y0, z, theta = flake_position_layer1()
x1 = x0 + (0.1 * cos(theta))
x2 = x1 + (0.1 * cos((90 * pi/180) + theta))
x3 = x2 + (0.1 * cos((180 * pi/180) + theta))
y1 = y0 + (0.1 * sin(theta))
y2 = y1 + (0.1 * sin((90 * pi/180) + theta))
y3 = y2 + (0.1 * sin((180 * pi/180) + theta))
return x0, x1, x2, x3, y0, y1, y2, y3
def display(): #connects the 4 corners on a plot
x0, x1, x2, x3, y0, y1, y2, y3 = flake_shape()
return plot([x0, x1, x2, x3, x0], [y0, y1, y2, y3, y0])
display()
axis([0,1,0,1]) #1x1 grid
show()
我没有 CS 背景(我是环境工程专业的),而且我对编码非常缺乏经验。请给我任何建议,让我尝试解决这个问题!
原文由 Deputy McMunch 发布,翻译遵循 CC BY-SA 4.0 许可协议
数学背景
1. 代数
f(x) = a * x + b
( a 和 b 常量, x 变量)2. 平面几何
一个平面由(无限)数量的点组成:让我们通过它的坐标来指代一个点,它可以被称为:
平面上的点分布在 2 个维度上
在平面上,每个点都可以通过其 x 和 y 唯一标识
平面上的一些点可能有一些共同的特征:例如,一堆在一条直线上的点……在一条直线上的一个点满足直线 方程(这是一个表达式,通常定义为 \( { **function** (from previous paragraph) result} = \){value} )
因此,简而言之:对于点 P 0 (x 0 , y 0 ) ,如果
y0 == f(x0)
,该点 位于 该 直线 _上_(以及 更多:取决于 y 0 大于/小于 f( x 0 ) , P 0 位于 xOy 平面中直线的 上方/ 下方)。再次声明,对于非线性函数,y = f(x)
仍然适用(因为它是一般方程式),但其他运算符(例如 < 、 > )不适用一条直线由 2 个 不同的 点决定(例如 P 0 (x 0 , y 0 ) , P 1 (x 1 , y 1 )) ——该直线的方程为
y = a * x + b
(在我们的示例:y = ((y0 - y1) / (x0 - x1)) * x + (y0 - x0 * ((y0 - y1) / (x0 - x1)))
); !! 当然值得一提的是“垂直”(平行于 Oy )线 !不是函数!!示例:有 2 条 不同的 平行(非 Bolyai :))线:
f0(x) = a * x + b0
和f1(x) = a * x + b1
(两条线的 a 相同 - 这是它们平行的条件)和外部点 P 0 (x 0 , y 0 ) (显然不属于任何一条线)。如何判断 P 0 是否在2条线之间?好吧,该点必须在(较低的)一个上方和另一个(较高的)下方。转化为数学(考虑 f 0 是较低的):y0 > f0(x0)
(y0 - f0(x0) > 0
)y0 < f1(x0)
(y0 - f1(x0) < 0
)从上面的观察(可能还有更多的智慧),这是点坐标应该满足的条件:
(y0 - f0(x0)) * (y0 - f1(x0)) < 0
代码00.py :
注意事项:
我之前没有使用过 matplotlib (实际上,我
pip install
为此任务编辑了它)普通的留言:
_get_funcdeg1 :
_is_point_insquare :
_正方形重叠_:
_生成随机点_:
_生成随机角度_:
_生成随机方块_:
_square_toplot :
_主要_:
___generationmonitor(0) :
为了改变正方形的数量,修改 _MAXSQUARES
输出:
关于方块一代的几句话
allow_overlapping = True
更改,输出中 生成的值 将匹配方块数 ( _MAXSQUARES )